WCF

来源:互联网 发布:淘宝助理无法创建宝贝 编辑:程序博客网 时间:2024/05/17 21:39
从过去到未来。 函数 → 对象→ 组件 → 服务 结构化编程(SP )→ 面向对象编程(OOP )→ 组件化开发(CBD )→ 基于服务的开发(SOA ) 面向对象编程/ 组件化开发用于创建应用程序,面向服务的编程则用于连接这些应用程序。 WCF 的作用: WCF 使应用程序功能成为一个通过网络可以访问的服务。 WCF 的特点: 统一了以前微软平台上的各项技术,允许客户端和服务端内部都使用CLR 数据类型,而WCF 则在中间完成所有转换工作。另外,WCF 也允许非WCF 客户端来访问WCF 服务端。 WCF 一统江湖: ASMX 、Enterprise Services 、WSE 、.NET Remoting 、Message-Oriented Programming 从WCF 引例中掌握WCF 基本概念 引例介绍: WCF 服务端和客户端应用程序都是控制台应用程序。WCF 服务端应用程序( HelloWCFServiceServer ) 在本机8000 端口发布一个简单的WCF 服务,向外界返回一个“Hello.WCF !”字串。客户端通过HTTP 协议访问此WCF 服务,显示出从服务端取回的字串。 一、服务端实现: 1、 需要给客户端和服务端应用程序同时添加对System.ServiceModel 程序集的引用。 2、 服务端声明契约接口, 契约(Contract )规定了WCF 服务端与客户端相互交换信息的格式。 [ServiceContract] Public interface IHelloWCFService{ [OperationContract] string GetServiceMessage();} 3、 服务对象负责具体实现服务,简单地说:当客户端访问服务时,一个服务对象被创建,相应的方法(由契约所规定的)被调用,方法执行的结果被传回给客户端。 public class ServiceProvider:IHelloWCFService {public string GetServiceMessage(){ return "Hello,WCF!";}} 4、 服务对象由服务宿主负责创建。服务宿主是一个ServiceHost 对象,每个ServiceHost 对象都对应着一个服务(本例通过其构造函数实现这种对应关系),在合适的时候(通常是客户端发出调用服务的请求时)ServiceHost 对象会创建服务对象(本例为ServiceProvider 对象)来响应客户端请求。 static void Main(string[] args) { ServiceHost host=new ServiceHost(typeof(ServiceProvider), new Uri("http://localhost:8000/HelloWCFService")); host.AddServiceEndpoint(typeof(IHelloWCFService),new BasicHttpBinding(),""); host.Open(); } http://localhost:8000/HelloWCFService 代表服务的地址,不同的服务必须拥有不同的地址。 当调用ServiceHost.Open() 方法时,WCF 将在本机8000 端口处监听客户端传来的请求并将其转发给相应的服务对象处理。注意:不同的服务可以重用同一端口,但其服务地址绝不能一样。ServiceEndPoint 是服务的访问点,客户端只能通过这一访问点才能访问服务。Service End Point 中文译为“服务终结点”。 二、访问WCF 服务的客户端实现 1 、为了与服务端通讯,客户端需要知道以下的事实:(1 )WCF 服务的地址(2 )WCF 服务的契约 2 、客户端引入WCF 契约。 客户端必须使用与服务端一致(或者相互兼容)的契约,才能保证调用的顺利完成。与服务端实现的第2 条一样。或在Visual Studio 中从“项目”菜单中选择“添加服务引用”命令,在弹出的对话框中输入元数据交换终结点地址。http://localhost:8000/HelloWCFService/mex 3 、客户创建代理 ChannelFactory channelFactory=new ChannelFactory( New BasicHttpBinding(),new EndpointAddress("http://localhost:8000/HelloWCFService"));IHelloWCFService Proxy = channelFactory.CreateChannel(); 客户端需要创建一个服务代理对象proxy (必须实现服务契约IHelloWCFService )。服务代理对象由通道工厂(ChannelFactory )负责创建。 4 、通过代理访问WCF 服务。代理对象创建以后,访问WCF 服务就体现为对代理对象方法(由服务契约所约定)的调用。这些调用将会被远程传送到WCF 服务端。 Console.WriteLine(“ 从服务端返回:”Proxy.GetServiceMessage()); 一个WCF 服务向WCF 客户提供一些可用的功能。WCF 客户通过终结点(endpoint) 来访问WCF 服务。因此,一个WCF 服务至少要包含一个终结点。如果允许服务端反过来调用客户端的代码(即所谓回调callback ),则客户端也应该提供回调所使用的终结点。WCF 服务与客户程序要想成功通讯,必须遵循特定的协议,WCF 规定,在WCF 服务与WCF 客户间发送的所有消息都遵循SOAP 协议。 契约: 契约定义了一个终结点向外界发布的操作,以及WCF 服务与客户相互通讯时的消息格式。WCF 中有四种类型的契约,引例中定义的是“服务契约”。 1 、服务契约: 定义一个接口,给接口附加[ServiceContract] ,给接口方法附加[OperationContract] 2 、数据契约: 数据契约定义将在客户端与服务器端传送的各种数据类型。定义数据契约时需要使用[DataContract] 和[DataMember] 。 3 、消息契约: 可以使用消息契约来定制WCF 服务与WCF 客户间相互通讯的SOAP 消息格式。 4 、错误契约: 定义在服务中如何处理异常,以及这些异常又如何传送到客户端。 WCF 地址类型与通讯协议对应 使用TCP :地址以“net.tcp ”打头,多用于局域网环境 使用HTTP :地址以“http ”和“https ”打头,多用于互联网环境 使用消息队列:地址以“net.msmq ”打头。消息队列用于提供离线的消息服务,即调用服务时WCF 服务程序可以还没运行,调用请求被放到一个消息队列中,WCF 服务程序启动后取出此请求,解析后向WCF 客户提供服务。适用于局域网环境。使用命名管道:地址以“net.pipe ”打头。当WCF 服务与WCF 客户都位于同一台计算机时,这种通讯方式可以获得好的性能。 WCF 预定义绑定 BasicHttpBinding 、 WSHttpBinding 和WSFederationHttpBinding :使用HTTP WSDualHttpBinding :使用两个HTTP 通道实现双向通讯 NetTcpBinding :使用TCP NetPeerTcpBinding :使用P2P (很Cool 的一个绑定,后面会用它来开发有趣的应用) NamedPipeBinding :使用命名管道 NetMsmqBinding 和MsmqIntegrationBinding :使用消息队列 WCF 服务应有一个宿主程序。可选的宿主程序类型有:IIS ,WAS ,Windows Form/WPF Application ,Console Application ,Windows Service 。在客户端可以访问服务之前,服务宿主进程必须启动。一个服务宿主程序可以同时承载多个服务。