WCF全称Windows Communication Foundation,是微软构建面向服务的分布式编程框架。而它其实是统一了COM和.Net Remoting等分布式技术提供一个完整,通用,可靠的分布式编程模型。
WCF作为一个服务,它具有ABC这三个特性。
A->Address 地址
地址包含服务位置和传输协议(传输样式)这两个元素。
http://localhost:8001 基于http协议
net.tcp://localhost:8002/Service 基于tcp协议
net.Pipe://localhost/Pipe 基于进程间通信
net.msmq://localhost/Queue 基于消息队列通信
当然还有包括https和服务总线的协议模型。
B->Binding 绑定
绑定定义了服务间通信的基本方式。常用绑定如下:
- 基本绑定(BaseHttpBinding)
- TCP绑定(NetTcpBinding) 使用TCP协议实现了跨机器的通信。
- IPC绑定(NetNamedPipeBinding) 使用命名管道在同一机器的进程间通信。
- Web服务绑定(WSHttpBinding) 提供基于internet的通信。
- MSMQ绑定(NetMsmqBinding) 使用微软的消息队列通信
6.当然WCF还定义了其他的一些不常用的绑定,我就不一一列举了。具体可以再编码时注意绑定选项。
C->Contract 契约
契约是描述服务功能的标准方式。
服务契约(ServiceContract) 描述客户端可用服务操作
数据契约(DataContract) 定义与服务交互的数据类型
错误契约(FaultContract) 定义服务抛出的错误操作
消息契约(MessageContract) 允许服务于消息交互
EndPoint 终结点
终结点的功能就是组装ABC暴露给调用服务的客户端,让客户端能够获得该服务的ABC这3个元素信息。
终结点的可以通过配置文件也可以通过编码,通过配置文件配置WCF服务信息比较灵活,修改参数也无需重新编译发布。而通过编码方式个人感觉能控制的更加精准,并且能够充分理解WCF的配置体系。
Host 宿主
WCF服务必须托管的宿主进程中,自托管,IIS发布,WAS宿主引擎。
Mex 元数据
WCF服务元数据是WCF服务的核心部分ABC的原始描述信息,暴露服务元数据的重要原因就是解决了异构客户端服务交互的关键问题。 元数据基于XML,自描述。客户端可以根据服务的元数据反序列换生成本地代码。
一个简单的Demo
如下为一个自托管的基于tcp协议的WCF服务端和客户端的基本实现,服务的发布采用编码模式
private void StartAPPWCFService() { string serviceAddress = string.Format("net.tcp://{0}:{1}/", "localhost", CommonData.Configuration.Port); Dictionary<Type, Type> sevtypes = new Dictionary<Type, Type>(); sevtypes.Add(typeof(IPersonService), typeof(PersonService)); sevtypes.Add(typeof(ISafetyService), typeof(SafetyService)); sevtypes.Add(typeof(IPressureService), typeof(PressureService)); string endpointAddress = string.Empty; string tName = string.Empty; foreach (var item in sevtypes) { tName = item.Value.Name; endpointAddress = serviceAddress + tName; ServiceHost serviceHost = new ServiceHost(item.Value, new Uri(endpointAddress)); //加载元数据结点 ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); serviceHost.Description.Behaviors.Add(smb); serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex"); //加载NetTcpBinding结点 NetTcpBinding netTcpBinding = SetTCPBinding(); serviceHost.AddServiceEndpoint(item.Key, netTcpBinding, endpointAddress); serviceHost.Open(); listServiceHost.Add(serviceHost); } }
服务器端
客户端中添加服务引用(net.tcp://127.0.0.1:18001/SafetyService/mex)后即可直接调用服务获取数据,客户端的调用配置信息由系统自动生成
SafetyService.SafetyServiceClient client = new SafetyService.SafetyServiceClient(); Console.WriteLine(client.getData());
客户端代码
2015年强迫自己写技术博,这是WCF系列第一期,后续会陆续更新。