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通信模型

客户端和服务端之间通信的方式

时间: 2024-08-02 00:03:48

WCF研究-前篇的相关文章

[老老实实学WCF] 第四篇 初探通信--ChannelFactory

原文:[老老实实学WCF] 第四篇 初探通信--ChannelFactory 老老实实学WCF 第四篇 初探通信--ChannelFactory 通过前几篇的学习,我们简单了解了WCF的服务端-客户端模型,可以建立一个简单的WCF通信程序,并且可以把我们的服务寄宿在IIS中了.我们不禁感叹WCF模型的简单,寥寥数行代码和配置,就可以把通信建立起来.然而,仔细品味一下,这里面仍有许多疑点:服务器是如何建起服务的?我们在客户端调用一个操作后发生了什么?元数据到底是什么东西?等等.我们现在对WCF的理

[老老实实学WCF] 第八篇 实例化

老老实实学WCF 第八篇 实例化 通过上一篇的学习,我们简单地了解了会话,我们知道服务端和客户端之间可以建立会话连接,也可以建立非会话连接,通信的绑定和服务协定的ServiceContract 的SessionMode属性共同决定了连接是否是会话的.会话连接在会话保持阶段服务端可以记住客户端,而非会话连接则不会,相同客户端的多次调用会被认为是不同的客户端发起的. 会话这个特性是许多其他特性的基础,例如我们今天要学习的实例化.连接是否是会话对实例化的过程将产生不同的影响.今天我们就来研究这个问题.

(转)[老老实实学WCF] 第四篇 初探通信--ChannelFactory

第四篇 初探通信--ChannelFactory 通过前几篇的学习,我们简单了解了WCF的服务端-客户端模型,可以建立一个简单的WCF通信程序,并且可以把我们的服务寄宿在IIS中了.我们不禁感叹WCF模型的简单,寥寥数行代码和配置,就可以把通信建立起来.然而,仔细品味一下,这里面仍有许多疑点:服务器是如何建起服务的?我们在客户端调用一个操作后发生了什么?元数据到底是什么东西?等等.我们现在对WCF的理解应该还处于初级阶段,我们就会觉得有许多这样的谜团了. 虽然我们生活在WCF为我们构建的美好的应

[老老实实学WCF] 第十篇 消息通信模式(下) 双工

原文:[老老实实学WCF] 第十篇 消息通信模式(下) 双工 老老实实学WCF 第十篇 消息通信模式(下) 双工 在前一篇的学习中,我们了解了单向和请求/应答这两种消息通信模式.我们知道可以通过配置操作协定的IsOneWay属性来改变模式.在这一篇中我们来研究双工这种消息通信模式. 在一定程度上说,双工模式并不是与前面两种模式相提并论的模式,双工模式的配置方法同前两者不同,而且双工模式也是基于前面两种模式之上的. 在双工模式下,服务端和客户端都可以独立地调用对方,谁都不用等待谁的答复,同样也不期

[老老实实学WCF] 第三篇 在IIS中寄存服务

原文:[老老实实学WCF] 第三篇 在IIS中寄存服务 老老实实学WCF 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包括定义和实现服务协定.配置服务.寄宿服务.通过添加服务引用的方式配置客户端并访问服务.我们对WCF的编程生命周期有了一个最基本的了解. 在前两篇中演示的例子,一定要力求背着做下来,包括源程序.配置文件都要背着一行行的手写下来,这样才能有深刻的体会.WCF的知识零散复杂,必须扎扎实实的学习和练习.如果你还没有做到了然于胸,现在赶紧翻

[老老实实学WCF] 第五篇 再探通信--ClientBase

原文:[老老实实学WCF] 第五篇 再探通信--ClientBase 老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创建了通道,实现了和服务端的通信.然而,与服务端通信的编程模型不只一种,今天我们来学习利用另外一个服务类ClientBase<>来完成同样的工作,了解了这个类的使用方法,我们对服务引用中的关键部分就能够理解了. ClientBase

[老老实实学WCF] 第六篇 元数据交换

原文:[老老实实学WCF] 第六篇 元数据交换 老老实实学WCF 第六篇 元数据交换 通过前两篇的学习,我们了解了WCF通信的一些基本原理,我们知道,WCF服务端和客户端通过共享元数据(包括服务协定.服务器终结点信息)在两个终结点上建立通道从而进行通信.我们通过手写代码(或配置)的方式为服务端编写了元数据信息,没有借助元数据交换就实现了通信.然而在实际应用中,元数据往往是很多的,而且重复编写元数据的工作也是不值得的,因此必然会用到元数据交换的方式让客户端获取元数据,本篇我们就来进一步了解一下元数

老老实实学WCF[第三篇] 在IIS中寄宿服务

老老实实学WCF 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包括定义和实现服务协定.配置服务.寄宿服务.通过添加服务引用的方式配置客户端并访问服务.我们对WCF的编程生命周期有了一个最基本的了解. 在前两篇中演示的例子,一定要力求背着做下来,包括源程序.配置文件都要背着一行行的手写下来,这样才能有深刻的体会.WCF的知识零散复杂,必须扎扎实实的学习和练习.如果你还没有做到了然于胸,现在赶紧翻回去把例子再做一遍. 今天让我们稍微深入一点,了解一些关

老老实实学WCF[ 第七篇] 回话

老老实实学WCF 第七篇 会话 通过前几篇的学习,我们已经掌握了WCF的最基本的编程模型,我们已经可以写出完整的通信了.从这篇开始我们要深入地了解这个模型的高级特性,这些特性用来保证我们的程序运行的高效.稳定和安全. 首先我们来学习会话. 1. 什么是会话 会话是通信双方进行通信的一个时间片.一个语境或者说一个上下文,在这个特定的环境中,通信的双方是彼此认识的,就像两个人在聊天,他们都很清楚谁在聆听自己讲话,也很清楚对方讲的话是给自己听的,简单的说就是通信双方是可以记住彼此的. 一旦会话结束了,