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服务