前篇
1.从SOA说起
2.什么是WCF
3.WCF通信模型
4.Endpoint与ABC以及元数据
1.SOA (Service Oriented Architecture)
Ø 一种组件架构模型
Ø 主要特点
每个服务具有明确的服务边界。
服务独立,低耦合。
采用标准的契约定义和通信协议。
服务是自解释的。
2.WCF (Windows Communication Foundation)
Ø 是微软为SOA(Service-Oriented Architecture)而设计的一套完整的技术框架
Ø 通过WCF技术可以创建服务
跨进程
跨机器
跨网络
Ø WCF 提供了创建安全的、可靠的、事务服务、多种协议的统一框架
Ø WCF 整合和扩展了现有分布式系统的开发技术,如Microsoft .Net Remoting、Web Services、Web Services Enhancements (WSE)等等。
WCF 各种分布式技术统一江湖:(图解)
实例:
Ø 1 建立简单的WCF服务
(直接新建一个WCF项目,基本都是默认的,未做任何修改)
1 // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。 2 [ServiceContract] 3 public interface IService1 4 { 5 6 [OperationContract] 7 string GetData(int value); 8 9 [OperationContract] 10 CompositeType GetDataUsingDataContract(CompositeType composite); 11 12 // TODO: 在此添加您的服务操作 13 } 14 15 16 // 使用下面示例中说明的数据约定将复合类型添加到服务操作。 17 [DataContract] 18 public class CompositeType 19 { 20 bool boolValue = true; 21 string stringValue = "Hello "; 22 23 [DataMember] 24 public bool BoolValue 25 { 26 get { return boolValue; } 27 set { boolValue = value; } 28 } 29 30 [DataMember] 31 public string StringValue 32 { 33 get { return stringValue; } 34 set { stringValue = value; } 35 } 36 }
新建简单WCF服务
1 // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。 2 // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Service1.svc 或 Service1.svc.cs,然后开始调试。 3 public class Service1 : IService1 4 { 5 public string GetData(int value) 6 { 7 return string.Format("You entered: {0}", value); 8 } 9 10 public CompositeType GetDataUsingDataContract(CompositeType composite) 11 { 12 if (composite == null) 13 { 14 throw new ArgumentNullException("composite"); 15 } 16 if (composite.BoolValue) 17 { 18 composite.StringValue += "Suffix"; 19 } 20 return composite; 21 } 22 }
实现接口
Ø 2 建立客户端调用WCF服务
(先添加服务引用)
1 wcfFirst.Service1Client sc = new wcfFirst.Service1Client(); 2 3 string inputStr = Console.ReadLine(); 4 string outputStr = sc.GetData(int.Parse(inputStr)); 5 Console.WriteLine("WCF返回信息:" + outputStr); 6 7 8 wcfFirst.CompositeType ct = new wcfFirst.CompositeType(); 9 ct.StringValue = 1; 10 ct.BoolValue = true; 11 wcfFirst.CompositeType newCt = sc.GetDataUsingDataContract(ct); 12 Console.WriteLine("newCt.StringValue:" + newCt.StringValue);
简单WCF客户端调用
Ø 3建立复杂的WCF项目
WCF服务库 是以独立于主机的 DLL 动态库项目;
新建的WCF项目复杂的与简单的配置文件是有区别的:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 4 <appSettings> 5 <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 6 </appSettings> 7 <system.web> 8 <compilation debug="true" /> 9 </system.web> 10 <!-- 部署服务库项目时,必须将配置文件的内容添加到 11 主机的 app.config 文件中。System.Configuration 不支持库的配置文件。--> 12 <system.serviceModel> 13 <services> 14 <service name="WcfServiceLibrary1.Service1"> 15 <host> 16 <baseAddresses> 17 <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" /> 18 </baseAddresses> 19 </host> 20 <!-- Service Endpoints --> 21 <!-- 除非完全限定,否则地址将与上面提供的基址相关 --> 22 <endpoint address="" binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1"> 23 <!-- 24 部署时,应删除或替换下列标识元素,以反映 25 用来运行所部署服务的标识。删除之后,WCF 将 26 自动推断相应标识。 27 --> 28 <identity> 29 <dns value="localhost"/> 30 </identity> 31 </endpoint> 32 <!-- Metadata Endpoints --> 33 <!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 --> 34 <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除--> 35 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 36 </service> 37 </services> 38 <behaviors> 39 <serviceBehaviors> 40 <behavior> 41 <!-- 为避免泄漏元数据信息, 42 请在部署前将以下值设置为 false --> 43 <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/> 44 <!-- 要接收故障异常详细信息以进行调试, 45 请将以下值设置为 true。在部署前设置为 false 46 以避免泄漏异常信息--> 47 <serviceDebug includeExceptionDetailInFaults="False" /> 48 </behavior> 49 </serviceBehaviors> 50 </behaviors> 51 </system.serviceModel> 52 53 </configuration>
复杂WCF服务库的配置文件
注意:配置文件的内容修改一定要慎重,简单内容无所谓。有时候两个项目的配置文件看着明明一样可就是不能正常双工通信,直接复制文件过来是又可以正常使用。这个在后面双工那部分会详解。
3.WCF通信模型
客户端和服务端之间通信的方式
服务与协定-Contract
服务端可以提供什么服务?
Ø 指定一个规则
Ø Contract
Ø 协定,契约,合同
协定分类
Ø Service Contract
定义了服务的类型,用一个接口或类订阅WCF的Service Contract。
Ø Operation Contract :
定义了WCF 服务中提供给外部系统访问的方法。
Ø Data Contract :
自定义的复杂数据类型
Ø Message Contract
用于控制SOAP消息的规则
Ø Fault Contract
用于捕获服务端错误消息
WCF 服务4个最主要组件及其关系
Ø Service Contract
Ø Operation Contract
Ø Data Contract
Ø Data Member
4.WCF中的基本感念-Endpoint与ABC
WCF中的基本感念-ABC
ABC
Ø A:Address
where -服务在哪里
Address地址的作用
Ø 通过一个URI Endpoint告诉潜在的WCF service的调用者如何找到这个WCF Service。
表现形式
Ø HTTP协议:http://<server>:<port>/<service>
https://<server>:<port>/<service>
Ø TCP协议:net.tcp:// <server>:<port>/<service>
Ø 管道:net.pipe:// <server>/<service>
Ø MQ:net.msmq:// <server>/public(private)/<service>
Ø B:Binding
how -通过什么协议取得服务
Binding的作用
Ø 指明通过什么方式(协议)连接WCF 服务。
常用协议
Binding协议 | 传输协议 | 描述 |
basicHttpBinding |
http https |
最简单的绑定类型,通常用于 Web Services。使用 HTTP 协议,Text/XML 编码方式。 |
wsHttpBinding |
http https |
HTTP绑定的一种高级形式,比 BasicHttpBinding 更加安全,可以使用WSE中引入的所有额外功能,通常用于 non-duplex 服务通讯。 |
wsDualHttpBinding |
http |
扩展了WSHttpBinding功能,包含双向通信功能。 |
netTcpBinding | TCP |
用于TCP通信,允许配置安全性、事务处理等,效率高 |
netNamedPipeBinding | IPC |
在wcf应用程序中最适合本机进行安全通讯的binding,安全、可靠、高效 |
netMsmqBinding | MSMQ |
用于消息队列通信,支持排队 |
Binding协议的选择
Ø C:Contract
what -定义的服务是什么
WCF中的基本感念-Endpoint
Endpoint 终节点
Ø 建立相互关联中的各个Application的通信通道。
Ø 用来发送或接收消息(或同时执行这两种操作)的入口。
特殊的Endpoint -Mex节点
Ø 用来做发现服务的特殊节点
WCF通信模型
客户端和服务端之间通信的方式