WCF托管服务和客户端代理
2011-08-12 13:54
232 查看
参考文章:/article/4591885.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服务
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服务
相关文章推荐
- WCF托管服务和客户端代理
- WCF 服务、托管、客户端 简单案例
- WCF服务编程设计规范(8):服务托管、自托管代码、客户端代理管理
- WCF服务编程设计规范(8):服务托管、自托管代码、客户端代理类、客户端代理管理、客户端异常管理、数据契约、SOAP与REST
- WCF热门问题编程示例(5):WCF服务如何获取客户端在线用户数量?
- WCF热门问题编程示例(5):WCF服务如何获取客户端在线用户数量?
- WCF热门问题编程示例(5):WCF服务如何获取客户端在线用户数量?
- WCF热门问题编程示例(5):WCF服务如何获取客户端在线用户数量?
- WCF热门问题编程示例(5):WCF服务如何获取客户端在线用户数量?
- VS2010 创建WCF以及SL的客户端如何调用WCF服务教程(一): 创建WCF
- WCF RIA 服务 (二十)-- Silverlight 客户端
- 使用多种客户端消费WCF RestFul服务(一)——服务端
- Java与WCF交互(一):Java客户端调用WCF服务
- 托管 WCF 服务
- WCF 服务托管
- WCF系列教程之WCF客户端调用服务
- 使用WCF 测试客户端测试你的WCF服务
- WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
- WCF热门问题编程示例(1):WCF服务如何获得客户端IP地址信息
- WCF 服务客户端不使用安全措施