WCF研究前篇

前篇
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通信模型
客户端和服务端之间通信的方式
 
 
==================================================================================================================================================================== 技术跟新换代步伐太快,基础还是不会变的。打好基础,坚实自己的步伐,任何技术来了学习都会很快的。 大家共同学习,共同成长。 我QQ 624859714
原文地址:https://www.cnblogs.com/cyr2012/p/4249751.html