WCF服务编程基础学习系列(二)
本篇文章主要介绍一下 WCF服务实例模式和会话模式.
一: 服务实例模式(InstanceContextMode)
InstanceContextMode为服务端实现服务契约类的实例模式,有三种类型,
分别为:PerCall-每次服务操作调用创建一次,调用完后进行销毁;
PerSession-同一个会话期间创建一次,客户端代理第一次操作(IsInitiating = true)调用创建,
调用代理的Close方法销毁或者调用IsTerminating服务操作销毁;
Single-服务只会创建一次,服务开始时创建,服务完成时销毁.
如何声明我们所需要的服务实例模式呢?
ServiceModel为我们提供了ServiceBehaviorAttribute声明方式.
我们可以在服务契约实现类上做如下声明:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,
ConcurrencyMode = ConcurrencyMode.Multiple)]
从这里可以看出,WCF允许以Operation Modified方式方便的进行分布式处理.
关于ServiceBehaviorAttribute的其他属性,可以参考网上的相关资料,这里不做过多的描述.
二:会话模式(SessionMode)
前面我们讲到使用服务行为属性为我们的服务契约实现设置了启用Session.
虽然实现类启用了Session,但这也需要契约允许进行会话,
因为契约相当于合同,如果合同上没有明文规定允许会话,
那服务也是不能进行会话的.所以我接下来还要为我们的契约声明允许会话.
会话模式分为三种:Allowed,NotAllowed,Required
Allowed: 指定当传入绑定支持会话时,协定也支持会话(默认值)
NotAllowed:指定协定需要会话绑定。如果绑定并未配置为支持会话,则将引发异常
Required:指定协定永不支持启动会话的绑定
声明方式:
[ServiceContract(SessionMode = SessionMode.Required)]
这里谈到了绑定,只有匹配的绑定才能支持会话.
Binding描述了哪些层面的信息一个Binding包含着丰富的信息,每种信息都描述了服务端和客户端交互过程中的一方面,
如下表所示,Binding描述了这些层面的信息:
层次 | 备注说明 |
Transactions(事务) | TransactionFlowBindingElement,用于指定事务流程 |
Reliability(信赖) | ReliableSessionBindingElement,用于指定对会话方式 |
Security(安全) | SecurityBindingElement,指定安全方式 |
Encoding(编码) | Text, Binary, MTOM, Custom,指定数据传输格式 |
Transport(传输) | TCP, Named Pipes, HTTP, HTTPS, MSMQ, Custom,指定传输方式 |
选择正确的Binding
Binding是可以自定义实现的,可WCF框架已经为我们实现了足够多的Binding,供我们来选择,如下表所示:
Binding名称 | Configuration Element | 描述 |
BasicHttpBinding | basicHttpBinding | 一个指定用符合基本网络服务规范通讯的binding,它用http进行传输,数据格式为text/xml |
WSHttpBinding | wsHttpBinding | 一个安全的通用的binding,但它不能在deplex中使用 |
WSDualHttpBinding | wsDualHttpBinding | 一个安全的通用的binding,但能在deplex中使用 |
WSFederationHttpBinding | wsFederationHttpBinding | 一个安全的通用的支持WSF的binding,能对用户进行验证和授权 |
NetTcpBinding | netTcpBinding | 在wcf应用程序中最适合跨机器进行安全通讯的binding |
NetNamedPipeBinding | netNamedPipeBinding | 在wcf应用程序中最适合本机进行安全通讯的binding |
NetMsmqBinding | netMsmqBinding | 在wcf应用程序中最适合跨机器进行安全通讯的binding,并且支持排队 |
NetPeerTcpBinding | netPeerTcpBinding | 一个支持安全的,多机交互的binding |
MsmqIntegrationBinding | msmqIntegrationBinding | 一个用于wcf与现有msmq程序进行安全通讯的binding |
下面的表格分别删除了上表中的Binding在互操作性(Interoperability), 安全性(Security),
是否支持会话(Session), 是否支持事务(Transactions)和是否为全双工(Duplex)上不同。
Bingding | Interoperability | Security | Session | Transactions | Duplex |
BasicHttpBinding | Basic Profile 1.1 | (None), Transport, Message | None, (None) | None | n/a |
WSHttpBinding | WS | Transport, (Message), Mixed | (None), Transport, Reliable Session | (None), Yes | n/a |
WSDualHttpBinding | WS | (Message) | (Reliable Session) | (None), Yes | Yes |
WSFederationHttpBinding | WS-Federation | (Message) | (None), Reliable Session | (None), Yes | No |
NetTcpBinding | .NET | (Transport), Message | Reliable Session, (Transport) | (None), Yes | Yes |
NetNamedPipeBinding | .NET | (Transport) | None, (Transport) | (None), Yes | Yes |
NetMsmqBinding | .NET | Message, (Transport), Both | (None) | (None), Yes | No |
NetPeerTcpBinding | Peer | (Transport) | (None) | (None) | Yes |
MsmqIntegrationBinding | MSMQ | (Transport) | (None) | (None), Yes | n/a |
例外,《Programming WCF Services》有一幅图也能说明各自的特征:
下面的图给出了我们选择Binding的方式
-------------------------------------------------
Enjoy technology,Enjoy life