WCF基本知识点整理Word文档下载推荐.docx
《WCF基本知识点整理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《WCF基本知识点整理Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
并且WCF对产业中的标准协议进行了封装和定义,它把程序员从繁琐的通信、格式编码中解放出来,使得程序员能够专注于业务逻辑的实现。
同时,WCF统一了微软公司之前推出的多种分布式技术,其中包括:
Web服务和WSE。
.NetRemoting。
.Net企业服务。
微软消息队列(MSMQ)。
WCF对这些技术的集成包括两个方面:
WCF的架构本身吸取了这些技术的精华。
WCF开发的服务/客户端可以和现有的Web服务、MSMQ程序进行交互。
2.2
.NetFramework的四大体系架构
.NetFramework的四大体系包括:
WCF、WF、WPF、WCS。
WCF(WindowsCommunicationFoundation):
主要是用来做松耦合的分布式通讯的,它还有另外一个名字叫Indigo,是微软迈向SOA一个重要的标志。
WCF是.NetFramework的一个子集。
WF(WindowsWordflowFoundation):
工作流引擎。
WPF(WindowsPresenttationFoundation):
WPF使用矢量绘图引擎,提供了一种声明式编程语言XAML,用来开发具有炫目视觉效果的应用程序。
WCS(WindowsCardSpace):
采用了一种新的数字标识技术来实现类似网银单点登录的功能,主要用来防止钓鱼式攻击等,从网络安全方面提供了一个保障。
2.3
WCF体系框架
从图上来看,WCF的体系基本包含了4个方面,分别为契约、服务运行时、消息和寄宿。
契约(能干什么)
从SOA的概念上来看,契约属于一个服务公开接口的一部分。
一个服务的契约,定义了服务端公开的服务方法、使用的传输协议、可访问的地址、传输的消息格式等内容。
基本上,契约的定义描述了该服务的功能和作用,它告诉SOA系统中的其它节点这个服务是“干什么”的。
服务运行时(怎么干)
服务运行时定义了服务在运行时的具体行为。
如果说契约描述了服务是“干什么”的,那么服务运行时就在一定程度上描述了服务是“怎么干”的。
3
消息
消息方面包含了消息的传输方式、消息的编码与解码。
消息方面的内容基本属于服务边界以内的具体实现。
具体的传递时限,必须符合在契约中定义的绑定协议。
4
激活和宿主(在哪干)
激活和宿主属于WCF程序的部署方式。
一个WCF服务需要在一个可运行的程序中寄宿,我们可以把宿主理解为WCF运行的容器。
常用的寄宿方式包括自寄宿、IIS寄宿、Windows激活服务、Windows服务、Com+组件等。
根据SOA的原则,激活和宿主类型的变化不会影响服务本身的特性和外部对该服务的访问,而WCF在这一方面也确实做的非常出色。
2.4
WCF基础概念介绍
WCF框架中包含了大量的基础概念,本小节将以简短的篇幅带领大家浏览这些概念,使大家能够对WCF的基本概念有所了解。
地址(Address)
在WCF框架中,每个服务都具有唯一的地址。
在SOA系统中,其它服务和客户端通过服务的地址来对服务进行访问。
一个服务的地址由一个统一资源标示符(URI)来表示。
下面是几个地址示例:
http:
//localhost:
80/Service
net.tcp:
//dc3web1:
9023/MyService
net.msmq:
//localhost/MyMsMqService
实际上地址的形式不止这些,它们的构成形式如下所示:
//[Hostname]:
[Port]/[ServiceAddress]
https:
net.pipe:
//[Hostname]/public(private)/[QueueName]
msmq.formatname:
//{msmqformatname}
绑定(Binging)
绑定定义了服务与外部通信的方式。
它由一组称为绑定元素的元素而构成,这些元素组合在一起形成通信基础结构。
一个绑定可以包含以下内容。
通信所使用的协议,如HTTP、TCP、P2P等。
消息编码方式,如纯文本、二进制编码、MTOM等。
消息安全保障策略。
通信堆栈的其它任何要素。
契约(Contract)
在2.3节中,笔者已经介绍了契约的基本概念。
在WCF中一共包含了4种契约,分别是服务契约、数据契约、错误契约和消息契约。
服务契约[ServiceContract]
服务契约将多个相关的操作联系在一起,组成单个功能单元。
数据契约[DataContract]
数据类型的说明称为数据契约。
服务使用的数据类型必须在元数据中进行描述,以使其它各方面可以与该服务进行交互操作。
错误契约[FaultContract]
错误类型的说明称为错误契约。
消息契约[MessageContract]
消息契约描述消息的格式。
5.
终节点(EndPoint)
终结点是用来发送或接收消息(或同时执行这两种操作)的构造。
一个终节点由三个要素组成,分别是笔者已经介绍了的:
地址、绑定和契约。
以SOA的思想来看,一个终节点就相当于服务的公共接口。
6.
元数据
服务的元数据描述服务的特征,外部实体需要了解这些特征以便与该服务进行通信。
服务所公开的元数据包括XML架构文档(用于定义服务的数据协定)和WSDL文档(用于描述服务的方法)。
启用元数据后,WCF通过检查服务及其终节点自动生成服务的元数据。
在WCF的行为章节中,笔者将介绍两种WCF的元数据发布方式。
7.
宿主
服务必须承载于某个进程中。
宿主是控制服务的生存期的应用程序。
第一个WCF程序
在了解了WCF的基本概念以后,本节将按照程序员学习新技术的习惯,给出一个简单的服务契约的HelloWord实例跟一个数据契约的实例。
3.1
HelloWord服务契约的定义
usingSystem.ServiceModel;
[ServiceContract]
publicinterfaceIService1
{
[OperationContract]
stringHelloWord(stringname);
}
publicclassService1:
IService1
publicstringHelloWord(stringname)
returnname+"
说:
HelloWord"
;
}
Demo1服务契约
3.2
数据契约的定义
usingSystem.Runtime.Serialization;
[DataContract]
publicclassPeople
{
[DataMember]
publicstringname;
publicintage;
publicPeople(stringname,intage)
this.name=name;
this.age=age;
stringGetInfomation(Peoplepeople);
Demo2数据契约
知识点:
通过自寄宿在服务器端模拟客户端
WCF消息交换模式
WCF客户端与服务器之间是通过消息进行通讯,了解WCF的消息交换模式有助于大家对消息的发送和接受由更直观的理解。
在WCF中,有三种消息交换模式:
数据报模式、请求-响应模式、双工模式。
4.1
数据报模式(One-WayCalls)
数据报模式指的是发送端负责把消息发送给对方并且收到确认消息之后,就完成交互的方式。
在这种模式下,发送方唯一能确定的就是消息发送成功,而对于消息是否最终到达服务的终节点、是否被成功处理、发挥的结果如何都一无所知。
数据报模式存在以下特点:
返回类型只能是void
不能包含ref或者out类型的参数
只有客户端发起请求,服务端并不会对请求进行回复。
通过设置OperationContract的IsOneWay=True可以将消息模式设置为数据报模式,具体方法如下:
[OperationContract(IsOneWay=true)]
voidTest();
Demo3数据报模式与请求-响应模式
4.2
请求-响应模式(Request/Reply)
在请求响应模式中,客户端发送一个消息并且接收一个返回消息来完成一次交互。
在该模式中,消息的发起端必然是客户端,并且从服务端返回只有一条消息。
客户端在发送出消息后会阻止当前线程并且等待服务端返回消息。
请求响应模式是缺省的消息交换模式,类似于HTTP协议中的请求/响应模型,这种消息交换模式是使用最多的一种。
请求-响应模式有如下特点:
调用服务方法后需要等待服务的消息返回
在这种模式下,服务端永远是服务端,客户端就是客户端,职责分明。
它是缺省的消息交换模式,设置OperationContract便可以设置为此种消息交换模式,方法如下:
4.3
双工模式(Duplex)
在双工模式中,客户端和服务端都可以任意地向对方发送消息,而对方也可以以任意的次序来接收消息。
在这种模式下,发送端和接收端的概念变得不再适用,取而代之的是通信的两个端点。
这种模式相对较复杂一些,服务端的契约定义如下所示:
publicinterfaceICallBack
[OperationContract(IsOneWay=true)]
voidUpdateInterval(intseconds);
[ServiceContract(CallbackContract=typeof(ICallBack))]
voidHeartbeat();
Demo4双工模式
5
WCF绑定
绑定的本质是一个配置好的通道栈,为了方便程序员专注于业务逻辑,WCF提供了一系列常用的绑定。
5.1
标准绑定
在.NETFramework3.5中WCF一共提供了12种标准绑定,这些绑定基本能够覆盖用户所有的传输要求。
表5.1
12种标准绑定简要说明
绑定名称
简要介绍
所需.NetFramework版本
basicHttpBinding
基于WS-IBasicProfile1.1的Web服务
3.0
wsHttpBinding
针对改进的Web服务的绑定,包括WS-Security,WS-Transaction等元素
wsDualHttpBinding
提供双工通信的HTTP绑定
webHttpBinding
支持REST/POX服务的绑定,使用XML/JSON序列化
netTcpBinding
使用TCP传输协议在跨主机的局域网内使用,支持可靠性、事务、安全等特性、并且该绑定被特别优化来支持WCF系统。
但是,使用该绑定需要确保通信双方都基于WCF构建,这里并不符合SOA的原则
netNamedPipeBinding
支持和netTcpBinding大致相同的特性,但由于使用命名管道进行通信,所以通信不能跨越主机
netMsmqBinding
使用微软消息队列(MSMQ)协议来进行异步脱机的消息交互。
关于该绑定的交互方式,在本书的后续章节中有详细的介绍
netPeerTcpBinding
使用P2P协议在网格中进行消息交互
msmqIntegrationBinding
该绑定可以用来在WCF消息和MSMQ消息中进行转换
wsFederationHttpBinding
该绑定支持使用了联合安全机制的Web服务
ws2007HttpBinding
该绑定继承自wsHttpBinding,其主要涉及目的是为了支持2007年新制定的WS标准
3.5
ws2007FederationHttpBinding
该绑定继承自wsFederationHttpBinding,和wsHttpBinding一样,其设计目的是为了支持2007年新制定的WS标准
5.2
设置绑定的方式
在WCF程序中,有两种方式来设置绑定,在代码中设置绑定和在配置文件中设置绑定。
一般来说,在配置文件中设置绑定更为常用,这是因为绑定的设置常常需要根据部署环境的改变而改变。
在配置文件中设置绑定
<
?
xmlversion="
1.0"
encoding="
utf-8"
?
>
configuration>
<
system.web>
compilationdebug="
true"
/>
/system.web>
system.serviceModel>
services>
servicename="
WcfServiceLibrary1.Service1"
behaviorConfiguration="
WcfServiceLibrary1.Service1Behavior"
endpointaddress="
HelloWord"
binding="
wsHttpBinding"
contract="
WcfServiceLibrary1.IService1"
/endpoint>
/service>
/services>
/system.serviceModel>
/configuration>
在代码中设置绑定
usingSystem.ServiceModel;
usingSystem.ServiceModel.Channels;
NetNamedPipeBindingbinding=newNetNamedPipeBinding();
EndpointAddressaddress=newEndpointAddress(newUri("
//localhost/HelloWorld"
));
using(HelloWorldProxyproxy=newHelloWorldProxy())
Console.WriteLine(proxy.HelloWorld("
Kevin"
//利用代理调用服务
Console.Read();
6
WCF契约
6.1
契约的定义和分类
6.1.1
什么是契约
契约(Contract)是WCF的消息标准,告知客户端如何与服务器联系交互。
一般情况下,我们用接口(Interface)来定义服务契约(ServiceContract)。
6.1.2
契约的分类
6.2
服务契约
在第3节中,笔者已经针对服务契约和数据契约做过两个Demo,因此服务契约和数据契约本节不做重点。
下面来看下服务契约都有哪些属性:
ServiceContract
ConfigurationName:
其设置信息在配置文件中的名称。
Name/Namespace:
自定义该服务契约的名称和命名空间。
SessionMode:
设置服务契约的Session方式,包括Allowe、NotAllowed、Required。
CallbackContract:
设置duplex模式时的回调类型。
ProtectionLevel:
指定消息保护方式,可以对消息进行加密和签名处理。
OperationContract
AsyncPattern:
用于定义异步服务方法。
IsInitiating:
指示服务方法能否启动一个Session。
IsTerminating:
指示服务方法调用完成是否结束Session。
6.3
数据契约
下面来看下数据契约都有哪些属性:
DataContract
自定义名称和命名空间。
DataMember
Name:
自定义名称。
IsRequired:
指示该成员序列化前必须被赋值。
6.4
错误契约
在WCF中消息首先会被序列化为SOAP消息再进行发送。
也就是说,所有的数据都包含在SOAP消息中,包括异常信息。
SOAP规定了异常消息的携带方式,那就是全部放入Fault节点中。
Fault节点必须是Body节点的子节点,同时,一个SOAP消息中只能出现一个Fault节点。
表6.1
Fault的子节点
子节点
描述
Code>
供识别故障的代码,可包含两个子节点:
Code和Subcode
Reason>
可供人阅读的有关故障的说明
Node>
可选,指向SOAP消息中引发错误的节点
Role>
可选,发生错误时节点所处的角色
Detail>
可选,包含了详细的错误信息
说明:
无论是使用哪种错误方式:
WCF系统最终会把错误信息放入Fault节点中进行传输。
6.4.1
WCF中默认的异常处理
WCF将服务异常(Exception)转换成SOAPfaults,传递到客户端后再次转换成Exception。
只不过缺省情况下,我们很难从中获取有意义的信息。
intAdd(inta,intb);
publicintAdd(inta,intb)
thrownewException("
错误"
);
异常信息如下所示:
UnhandledException:
System.ServiceModel.FaultException:
Theserverwasunablet
oprocesstherequestduetoaninternalerror.
Formoreinformationaboutthe
error,eitherturnonIncludeExceptionDetailInFaults(eitherfromServiceBehavio
rAttributeorfromthe<
serviceDebug>
configurationbehavior)ontheserverino
rdertosendtheexceptioninformationbacktotheclient,orturnontracingas
per