摩托做了一点关于webservice 关于 header 控制的最简单例子
有如下几种情况:
server    client
.net      delphi
delphi     .net
delphi    delphi
.net       .net谁想看看,说话,不过以后要常来midas板块哦!(    :P  摩托可不是讲条件哦 ^_^)

解决方案 »

  1.   

    第一个支持,强烈支持:不过我的问题还没解决,帮办忙吧!http://expert.csdn.net/Expert/topic/1122/1122281.xml?temp=.7912561midas板块人气确实不好,如果出些好帖子,好文章,相信...会好起来的
      

  2.   

    有些代码是别人的,作者记不清了,呵呵!
    。net  server:public class Authentication: System.Web.Services.Protocols.SoapHeader
    {  public string Username;  public string Password;  public Boolean ValidUser(string in_Username,  string in_Password)
        {
      if ((in_Password=="password") && (in_Username=="username" ))
      {
      return true;
      }
      else
      {
      return false;
      }
        }
      public Authentication()  {  }
    } public class header : System.Web.Services.WebService
    {
    public header()
    {
    //CODEGEN:该调用是 ASP.NET Web 服务设计器所必需的
    InitializeComponent();
    } #region Component Designer generated code

    //Web 服务设计器所必需的
    private IContainer components = null;

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if(disposing && components != null)
    {
    components.Dispose();
    }
    base.Dispose(disposing);
    }

    #endregion // WEB 服务示例
    // HelloWorld() 示例服务返回字符串 Hello World
    // 若要生成,请取消注释下列行,然后保存并生成项目
    // 若要测试此 Web 服务,请按 F5 键 public Authentication headersoap;
    [WebMethod]
    [System.Web.Services.Protocols.SoapHeader("headersoap")]
    public string HelloWorld()
    {
    if (headersoap.ValidUser(headersoap.Username,headersoap.Password)) 
    return "Hello World";
    else
    return null;
    }
    }
    delphi client:procedure TForm1.Button1Click(Sender: TObject);
    var
      h:AuthHeader ;
      s:string;
    begin
     try
      h:=AuthHeader.Create ;
      h.Password :=edit2.Text ;
      h.Username :=edit1.Text ;
     HTTPRIO1.SOAPHeaders.Send(h);
     s:=(HTTPRIO1 as IDheadtest).hellodelphi;
     if s<>'' then 
     showmessage(s)
     else
      showmessage('用户名或者密码错误!');
     finally
      freeandnil(h); end;
    end;代码不少,基本的就这意思,很简单!
    要的留个邮箱!
      

  3.   

    好啊,给俺一份  [email protected]
      

  4.   

    我也要,我也要
    [email protected]
      

  5.   

    这边已经算不错了 记得我以前在深度历险MIDAS分块问了一个问题 几个月都没人回复
      

  6.   

    大家应该有感觉midas的问题,最后的解决办法是在出问题的电脑进行测试,这和别的板块不太一样。所以,有的时候大家的问题,解决的效果可能不会很好。大家也只能给些建议性的东西,并不是仅仅是代码的问题
      

  7.   

    上边那个例子在Delphi6分布式开发上有;
    而且这本书上的内容全是别人的,作者好像就没有自己写代码;
    大家能不买这本书就最好别买,因为好多内容都是网上的,而且一些问题只是提出,根本没有解决方案!
      

  8.   

    小小也来点吧;
    //****************************************************************//
    //             Pool Code(池子代码)
     作    者:  小小
    // 调试时间:2002-10-31 15:41
    // 调试环境:Windows 2000 + Delphi6.0;
    // 交流地点:www.nxit.net/bbs  or  www.nxit.net/bbs
    //**********************************************************//
    unit ServerS_Unit;interface
    uses
        ComObj, ActiveX, ServerS_TLB, Classes, SyncObjs, Windows;/////单元引用;
    type  TPoolS = Class(TAutoObject,IPooler_LX)//接口的实现,前边说COM and DCOM曾说过;
      Private
        Function GetInterface : IPooler_LX; //获得一个接口,进而获得对像;
        Procedure SetInterface(InterfaceValue : IPooler_LX);//释放一个接口,是放回去;
        Function GetLock(Index : Integer) : Boolean;
        Procedure ReleaseLock(Index : Integer;Var InterfaceValue : IPooler_LX);
      Protected
        { IAppServer }
        {**************************************************************************}
        {在Protected里边,所有的声明都是基于IppAerver接口的,如计数加1,获得接口, }
        {                  释放接口操作,而且还引用了协调接口类                    }
        {**************************************************************************}
        function  AS_ApplyUpdates(const ProviderName: WideString; Delta: OleVariant;
                                  MaxErrors: Integer; out ErrorCount: Integer; var OwnerData: OleVariant): OleVariant; safecall;
        function  AS_GetRecords(const ProviderName: WideString; Count: Integer; out RecsOut: Integer;
                                Options: Integer; const CommandText: WideString;
                                var Params: OleVariant; var OwnerData: OleVariant): OleVariant; safecall;
        function  AS_DataRequest(const ProviderName: WideString; Data: OleVariant): OleVariant; safecall;
        function  AS_GetProviderNames: OleVariant; safecall;
        function  AS_GetParams(const ProviderName: WideString; var OwnerData: OleVariant): OleVariant; safecall;
        function  AS_RowRequest(const ProviderName: WideString; Row: OleVariant; RequestType: Integer;
                                var OwnerData: OleVariant): OleVariant; safecall;
        procedure AS_Execute(const ProviderName: WideString; const CommandText: WideString;
                             var Params: OleVariant; var OwnerData: OleVariant); safecall;
      end;  TPoolManager = Class(TObject)///定义一个管理接口对像类,必不可少,不然无法管理
      Private
        FMaxCount : Integer;////最大连接数;
        FTimeOut  : Integer;////连接超时;
        FCriticalSectionS : TCriticalSection;////可以理解为进行协调;
        FHandle : THandle ;
        FRDMList:TList;
        /////////////Function GetLock(Index : Integer) : Boolean;
        ///////////////////Procedure RePlease(Index : Integer ; InterfaceValue : IPooler_LX);
        Function CreateNewInstance : IPooler_LX;
      Public
        Constructor Create;
        Destructor Destroy;Override;
        Function GetInterface : IPooler_LX; //获得一个接口,进而获得对像;
        Procedure SetInterface(InterfaceValue : IPooler_LX);//释放一个接口,是放回去; s    Property  TimeOut : Integer read FTimeOut;
        Property  MaxCount : Integer read FMaxCOunt;
      end;  PRDM = ^TRDM;
      TRDM = Record
        InValue : IPooler_LX;
        InUser : Boolean;
      end;var
      PoolManager : TPoolManager;
        
    implementation
    uses
      ComServ, SysUtils , SRDMUnit;{ TPoolManager }constructor TPoolManager.Create;
    begin
      FRDMList := TList.Create;
      FCriticalSectionS := TCriticalSection.Create;
      FTimeOut := 1000;
      FMaxCount := 5;
      FHandle := CreateSemaphore(Nil,FTimeOut,FMaxCount,Nil);
    end;
    {******************************************************************************}
    {   CriticalSection是指一段程序码,同一时间只能有一个Thread执行它,此VCL包装了 }
    {       Win32API中关於CriticalSection的4个函数InitializeCriticalSection、      }
    {      EnterCriticalSection、LeaveCriticalSection及DeleteCriticalSection)      }
    {                                                                              }
    {       Win 32 API提供了一组同步对象,如:信号灯(Semaphore)、互斥(Mutex)、   }
    {          临界区(CriticalSection)和事件(Event)等,用来解决这个问题          }
    {******************************************************************************}
    {******************************************************************************}
    {   TPoolManager.Create是为远程数据模快创建一个缓冲池,并且进行了规定,禄始化 }
    {                                              }
    {                                            }
    {                                                                              }
    {                                            }
    {                                                }
    {******************************************************************************}
    function TPoolManager.CreateNewInstance: IPooler_LX;
    var
      PValue : PRDM;
    begin
      FCriticalSectionS.Enter;
      Try
        New(PValue);
        PValue.InValue := RDMFactory.CreateComObject(Nil) as IPooler_LX;//类工厂的应用
        PValue.InUser := True;//置为可用;
        FRDMList.Add(PValue);
        Result := PValue.InValue;
      Finally
        FCriticalSectionS.Leave;
      end;
    end;destructor TPoolManager.Destroy;
    var
      I : Integer;
    begin
      FCriticalSectionS.Free;
      for I := 0 to FRDMList.Count - 1 do
      begin
        PRDM(FRDMList[I]).InValue := Nil;
        //////////PRDM(FRDMList[I]).InUser := False;
        FreeMem(PRDM(FRDMList[I]));  //////释放了PRDM资源;
      end;
      FRDMList.Free;
      CloseHandle(FHandle);
      inherited Destroy;
    end;function TPoolManager.GetInterface: IPooler_LX;  //// 获得连接;
    var
      I : Integer;
    begin
      Result := False;
      if WaitForSingleObject(FHandle,TimeOut) = WAIT_FAILED then
        Raise Exception.Create('对不起,没有成功获得资源');
      for I := 0 to FRDMList.Count - 1 do
      begin
        if GetLock(I) then
        begin
          Result := PRDM(FRDMList[I]).InValue;///判断是否有可用的资源可以利用,或接口
          Exit;
        end;
      end;
      if FRDMList.Count < MaxCount then
        Resule := CreateNewInstance;///新建资源
      if Result = Nil then
        Raise Exception.Create('对不起,不能获得资源');
    end;
    {******************************************************************************}
    {         WaitForSingleObject()说明:                                          }
    { WaitForSingleObject(ByVal hHandle As Long,                                   }
    {                      ByVal dwMilliseconds As Long);                         }
    { hHandle:等待对象的句柄;                                                    }
    { dwMilliseconds:等待时间。                                                   }
    { 该函数可以实现对一个可等待对象的等待操作,获取操作执行权。当等待的对象被释放时}
    { 函数成功返回,同时使等待对象变为有信号状态,或者超时返回。该函数用于等待     }
    { Semaphore信号时,若Semaphore信号不为0,则函数成功返回,同时使Semaphore信号记 }
    { 数减1。我们可以利用它建立一个记数信号,每次当相同的程序加载时使记数器减1,退 }
    { 出的时候使计数器加1,这样就可以限制相同程序的多份拷贝同时运行。              }
    {******************************************************************************}
    function TPoolManager.GetLock(Index: Integer): Boolean;
    begin
      FCriticalSectionS.Enter;///进锁
      Try
        Result := Not PRDM(FRDMList[Index]).InUser;//是否可用,是否可以获得连接;
        if Not Result then
          PRDM(FRDMList[Index]).InUser := True;//置连接为不在可用(对于其它用户而言)
      Finally
        FCriticalSectionS.Leave;
      end;
    end;procedure TPoolManager.RePlease(Index: Integer;
      InterfaceValue: IPooler_LX);
    begin
      FCritiCalSectionS.Enter;
      Try
        PRDM(FRDMList[Index]).InUser := False;
        InterfaceValue := Nil;
        ReleaseSemaphore(FHandle,1,Nil);
      Finally
        FCritiCalSectionS.Leave;
      end;
    end;procedure TPoolManager.SetInterface(InterfaceValue: IPooler_LX);
    var
      I : Integer;
    begin
      for I := 0 to FRDMList.Count do
      begin
        if InterfaceValu
      

  9.   

    提高分布式多层系统的效率之二(Pooler)
    小小原创 
    提高分布式多层系统的效率是一个永远不变的主题,有很多制约分布式系统的效率,如:RDBMS、数据库引擎、代码效率、各种Pooling、开发设计等……
    在此,我就Pooler说一说,希望对大家有用;
    有那些Pooler?Pooler是什么?那儿可以用Pooler?Pooler有什么用?怎么用Pooler?当一系例的Pooler问题摆在你的面前时,你如何下手?从那儿下手?但这些又是我们不得不面对的待解决的问题;唯一的办法只能是理解、解决它些问题;
    Pooler是池子的意思,可以这样理解,无论是那种Pooler,它都为用户提供了一个相当于容器的作用的连接,比如一个用户可能需要连接远程数据库中特定的表,当他花费了一定时间进行连接、使用完毕之后,他是要释放这个连接呢?还是将这个连接放在某一个容器里边呢?不可否认,在多层中,连接操作是一个费时操作,特别是对于大型数据库,要进行各种检查等操作,那么,是不是每一个用户都需要这个步骤呢?这儿就提到了Pooler这个概念;当用户A将操作都执行完毕之后,他如果释放了他的连接,那么这个连接就只是被用户A一个人用过,其它用户没有机会再次用这个连接,还要继续进行连接操作,继续的浪费时间;而如果用户A能将这个连接保存下来,供以后可以用的着这个连接的用户使用的话,岂不是很好吗?此是Pooler就充当了这个角色,所以,我们可以将Pooler在这儿理解成存放连接的池子或容器;
    Pooler又可以分为那些?分类所然没有被完全的规格化,但是可以将它罗列出来对我们有用的一些,比如: Session Pooling,Object Pooling,Connection Pooling(前边我们说过),ResourcePooling,DataPooling等,每种不同的Pooling有不同的作用,但它们实现的功能大至相同,它们可以提供方便的连接以节省用户时间,而且可以用我们曾说过的COM or DCOM的TimeOut来判断用户是否超时等;
    只要有三层的地方,都应该用Pooling,甚至在C/S里也提倡用Pooling,Connection Pooling就是最好的例子;当然,需要合理的应用Pooling,不然会造成接口混乱等现象;
    Pooler 有什么作用?在说什么是Pooler时,我们已经可以感觉的出来它的作用了;那么如何用Pooler呢?提到如何用Pooler时,我想大家如果有时间应该看一看我关边的关于COM DCOM方面的介绍,因为用Pooler 或者叫pooling就必须要用到接口,而前边我曾对接口给过很详细的说明,如果你不能理解接口的话,你在这儿也将无存下手;用Pooling提高分布式系统的效率的确是一个直接的办法,特别是当用户增加时;不管是MTS or DCOM or CORBA都需要用到Pooling技术来使效率提高,我将实现原理介绍一下,后边我会对一个例子进行分析以便于我们更好的交流;一般而言,用Pooling都需要用到协调接口类CoClass(前边的贴子,我曾说过这个类);我们可以将它理解为一个类,一个实现接口的类,而Pooling就要用到它!当客户端需要数据时,那以应用程序服务器就会应用CoClass所实现的接口来和应用服务器本身的接口进行交互;而且所有连接、线程控制等操作都由你新建的CoClass所负责,之后才通过应用服务本身的接口进行数据的存取,步骤我理解是这样的:当然用户想建立某一个连接或是某一项费时操作时,而正好它现在没有和应用服务器进行通讯,这样的话,它就希望以最快的速度和应用服务器进行通讯,但步骤往往不是它直接和应用服务器进行通讯,而是它需要和CoClass的实现的接口进行作用,当这个辅助类(CoClass)给这个用户分配了线程、建立了连接等一些资源时,它才可以和应用服务进行通讯,你会不会觉的这是多此一举呢?不,应用这个辅助类可以检测是否有空闲的连接来让这个用户进行连接,是否有可用的其它资源让这个用户进行操作,这样才会正真的节省客户的时间,同时也大大的降底了服务器的担子;这便是它的作用;
    而至于如何建立进程、如果分配资源,又如何回收,上边的例子可供参考;
    我们来用一个例子来说;(你可以参考Delphi/Demo/Midas/Pooler这个例子 );
      

  10.   

    COM DCOM亲密接触
    小小原创
    COM/DCOM的前身是OLE(Object Linking and Embedding,对像连接和嵌入)是从MS的Windows3.1操作系统中发展起来的,而DCOM正真的应用是在WinNT4.0时才发挥他的优势的,一般而言(本来就是的)DCOM是COM的扩展,COM是对于单机内(物理单机)的一种应用程序互通的技术,利用它,可以很好的实现应用程序的通信,可以是线程内的通信,也可以是进程通信,如果理解它们?
       客户和服务器在相同的内存处理进程中运行,并且通过使用功能调用的方法彼此通信。这种形式就是:在服务器中处理(In-Process Server);一般而言是用可以用DLL作为服务器程序的;
       同时,也充许是进程内部进行通信,也就是客户端可以作用内部进程通信的方法访问服务器,而服务器可以是不同进程中运行(但,它们是在同一物理机中),这种通信方式也叫本地对像代理(Local Object Proxy);
    如果此时,我们还想将COM的应用扩展开,就是网络之间的通信,这时就出现了DCOM,所以说DCOM是将COM的应用扩展到网络中,通过DCOM访问就属于远程代理对像(Remote Proxy Object)了;客户和服务器的通信合用了分布式计算环境RPC(做过分布式程序的朋友应该对RPC都比较熟悉吧,更明白的说,RPC = 远程过程调用);更精确的说,COM由两个扩展:MTS and MSMQ,他们都是通过DCOM提供的,以后会慢慢和大家交流这些的;
    我们再来说一说它们之间到底有什么更密切的关系吧;
    DCOM是安全的,可以这样说,之所以它比较安全就因为他是COM的扩展,继承了COM安全性这一点;
    DCOM是协议无关的,而它之所以是与协议无关的,也是来源于COM,因为COM本来就是一个协议无关的组件对像模型;
    DCOM是与语言无关的,因为COM就是与语言无关的,所以,DCOM或是COM组件才可以用到Delphi/VC/Java/VB……各种语言中,这也为他的进一步流通打下了基础;
    ………
    它们之间的关系有很多,很多;
    让我们用一条线串起来的话:
    ActiveX - OLE - COM - DCOM;它们及是其它的基础,也是基它的增强,说一个很简单的例子,ActiveX现在用的如何?的确,它没有办法和Java组件抗衡,但是,它应用的特别的广泛这是无可置疑的,为什么?说白了,就是因为DCOM组件提供了网络连接,而ActiveX又是DCOM的一种基础,当然,他也随着DCOM改进过,所以它才可以很快的应用起来;
    但是它们也是有区别的,比如COM服务器端可以是应用程序Exe文件,也可以是DLL文件,但是DCOM不允许为DLL,原因很简单,就是因为DCOM的客户端不可能保证每个进程内都有一个DLL文件的副本存在,当然,DCOM在同一机器里也可以进行通信,而且速度方面肯定很快;但它的速度如果和COM比起来,慢的可怜,应该是万分之一吧;
    好了,睡觉,睡觉,不说了,有时间再说吧;
      

  11.   

    TO eastliangliang(青苹果)(COM消我人憔悴) 
    我有做广告吗?我这次可是没有啊,呵呵;
    我又没有说我的坛子的地址是 www.nxit.net/bbs,我可没有说;
      

  12.   

    呵呵,大家不要误会,小小真的没有说他的论坛的地址是:www.nxit.net/bbs唉
      

  13.   

    唉!其实常来的都知道小小的论坛地址是 www.nxit.net/bbs 呵呵
    这就再去看看。谁让COM消我人憔悴呢,没办法哦。
      

  14.   

    那位老兄对webservice感兴趣,大家可以侃侃!!~~~~~~~~
      

  15.   

    摩托,你好,也给我一份吧。
    我的邮箱:[email protected]
      

  16.   

    苹果也要一份:[email protected]
    但愿不要被××功看到^_^
      

  17.   

    狼也想要一份
    [email protected]
      

  18.   

    举报:
    !!!!!!!!!!!
    wind兄,有人说你坏话拉!!!◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎
      

  19.   

    改行吧摩托,不是有高薪诚聘DELPHI高手的帖子吗?
      

  20.   

    呵呵,有空看看摩托版主是南京的啊
    看在跟您踩同一块地的份上,以后多照顾照顾
    新手,刚刚学DELPHI,多指教指教
    [email protected]
    多交流...
      

  21.   

    大哥,你还是斑竹啊 
    呵呵
    [email protected]
      

  22.   

    我也要,我也要
    [email protected]
      

  23.   

    to mousean(幻想无限)小公司其实要比中等公司好,你有机会接触更多的人,参与更多的事情
    摩托相信一句话:“经历就是财富”。不要太计较现在的蝇头小利,保持一颗
    上进的心,感触周围的一切,总结而后分析。相信这种富有绝对不是鼓鼓的
    钱包可以相提并论的。摩托现在也很穷,但等着吧!相信摩托不久会从两个轮子变成四个的 :)