zoukankan      html  css  js  c++  java
  • WCF托管服务和客户端代理

    参考文章:http://www.cnblogs.com/wayfarer/archive/2008/01/02/1022967.html

    WCF的典型宿主(托管服务的方式)包括以下四种:
    1、"Self-Hosting" in a Managed Application(自托管宿主)
    2、Managed Windows Services(Windows Services宿主)
    3、Internet Information Services(IIS宿主)
    4、Windows Process Activation Service(WAS宿主)

    1、自托管宿主
    利用WCF提供的ServiceHost<T>提供的Open()和Close()方法,可以便于开发者在控制台应用程序,Windows应用程序乃至于ASP.NET应用程序中托管服务。
    using (ServiceHost host = new ServiceHost(...)) { host.Open(); ... }

    由于ServiceHost实例是被创建在应用程序域中,因此我们必须保证宿主进程在调用服务期间不会被关闭,因此我们利用Console.Read()来阻塞进程,以使得控制台应用程序能够一直运行,直到认为地关闭应用程序。如果是Windows应用程序,则可以将创建ServiceHost实例的代码放在主窗体的相关代码中,保证服务宿主不会被关闭。
    在通常的企业应用中,我们很少会采用自宿主方式托管服务,这是因为这种方式必须要在应用程序运行下,客户端才能够调用服务,且并不便于随时启动和停止服务。除了不具有易用性与易管理性之外,在可靠性、性能等诸多方面受到很多限制。但由于它简单、易于实现,因而往往用于开发期间的调试或演示环境。

    自托管宿主支持所有的绑定。

    2、Windows Services宿主

    Windows Services宿主则完全克服了自托管宿主的缺点,它便于管理者方便地启动或停止服务,且在服务出现故障之后,能够重新启动服务。我们还可以通过 Service Control Manager(服务控制管理器),将服务设置为自动启动方式,省去了服务的管理工作。此外,Windows Services自身还提供了一定的安全性以及检测机制和日志机制。

    Windows Services宿主的实现也非常简单。我们可以在Visual Studio中创建Windows Services项目。在创建项目之后,就可以创建一个继承了System.ServiceProcess.ServiceBase类的Windows服务类。Windows服务类继承了ServiceBase类的OnStart()和OnStop()方法,完成Windows服务的启动与停止。我们可以重写这两个方法,将ServiceHost的启动与关闭对应地放入这两个方法的实现中。

    这种方式唯一的缺点却是对宿主的部署相对比较复杂,必须通过.NET提供的Installutil.exe工具完成对服务宿主的安装(也可以通过安装包的自定义操作完成)。

    安装服务:在设计器视图下,右键,选择“添加安装程序”,在安装程序项目中添加Installer的代码(参考文章),定义服务名称即ServiceInstaller对象的ServiceName。编译生成,把bin下的“项目名.exe”拷到VS2008命令行工具所在目录(如:C:\Program Files\Microsoft Visual Studio 9.0\VC>)下。运行installutil 项目名.exe。输入管理员角色的用户名(计算机名\用户名)和密码。安装完成后,运行Services.msc,可以看到自定义的服务已经存在了。

    3、IIS宿主(说明,这里讲的IIS为IIS 6.0)

    若要使用IIS宿主,需要为程序集中添加一个svc文件。我们可以通过为项目添加一个新项的方式添加svc文件。我们也可以直接创建一个WCF Service应用程序作为IIS宿主,它会自动创建一个svc文件。在svc文件中嵌入WCF服务的代码,完成后发布到IIS目录即可。浏览其中的svc文件,点击wsdl链接可以查看到服务的WSDL信息

    IIS 宿主是一种主要的服务托管方式,这是因为它具有易用性、可维护性、安全性、易于部署等多个优势。然而,它却具有一个致命的缺点,那就是它只支持 HTTP协议的传输绑定。特别对于局域网场景下,如果使用IIS宿主,就无法利用TCP传输的高效率,甚至无法使用MSMQ以及Peer to Peer传输。IIS 7.0(基于Windows Vista和Windows Server 2007)提供的Windows激活服务(WAS)突破了IIS 6.0对于HTTP的依赖。

    4、WAS宿主
    WAS是IIS 7.0的一部分,但也可以独立地安装与配置。WAS支持所有可用的WCF传输协议、端口与队列。
    利用WAS托管服务与IIS宿主托管服务的方法并没有太大的区别,仍然需要创建svc文件,同时在IIS中需要在站点中创建应有程序指向托管应用程序,还可以设置访问服务的别名与应用程序池。
    由于WAS诉诸支持所有的绑定,因此此时的服务绑定并不会受到宿主的限制。


    创建客户端代理:

    A。通过channel factory对象手动创建
    B。通过工具创建SvcUtil,不推荐使用
    C。在Visual Studio中通过在服务端发布元数据,在客户端可以通过添加服务引用自动生成。

    第一种方法,使用channel factory对象创建代理,为此你需要提供地址、绑定和服务契约。新建wcf服务类库WcfServiceLibrary,添加服务契约HelloWcfService。
    Service端:
    //使用基地址和服务类型创建ServiceHost实例
    using (ServiceHost host = new ServiceHost(typeof(WcfServiceLibrary.HelloWcfService), new Uri("http://localhost:8000/MyUrlAddr")))
    {
        host.AddServiceEndpoint(typeof(WcfServiceLibrary.IHelloWcf), new BasicHttpBinding(), "MyService");   //用编码方式添加服务端点
        host.Open();    //Console.Write("host open.");    //Console.ReadLine();
    }
    Clinet端:
    EndpointAddress ep = new EndpointAddress("http://localhost:8000/MyUrlAddr/MyService");  // //创建一个端点地址对象
    IHelloWcf Proxy = ChannelFactory<IHelloWcf>.CreateChannel(new BasicHttpBinding(), ep);  //创建服务的客户端代理
    string getValue = Proxy.HelloWcf();  //客户端通过代理调用WCF服务

  • 相关阅读:
    Response.Redirect引起的性能问题分析
    Html5中 视频 音频标签 进度条问题
    GIS 地理坐标分类
    函数指针理解最透彻的文章
    python安装第三方包之后无法导入相应模块(一个容易忽略的bug)
    git使用入门
    OpenSSL中HMAC,MD5以及对称加密算法的应用
    OpenSSL库中加密组件使用的相关链接
    Ubuntu 12.04LTS下配置OpenSSL和gmp环境
    编程写作注意事项!
  • 原文地址:https://www.cnblogs.com/vipcjob/p/1748063.html
Copyright © 2011-2022 走看看