一、 WCF中可信赖会话(ReliableSession)
WCF的可信赖会话在绑定层保证消息只会被传输一次,并且保证消息之间的顺序。当使用TCP(Transmission Control Protocol,传输控制协议)通信时,协议本身保证了可靠性。然而,它只在两点之间的网络包这个层面提供了这样的保证。WCF的可信赖会话特性保证了在传输过程中消息不会丢失、重复或错位。这种保证是消息层面的,而且适用于任何数目节点间的通信。另外,使用可信赖会话时,WCF会重连掉线的连接,在重连失败时还会释放会话占用的相关资源。可信赖会话还会通过调整消息的发送频率来缓解网络拥挤。
可靠会话主要解决以下几个问题:
◦ 确保消息可靠交付
◦ 确保消息单一性
◦ 确保消息有序性
二、 可靠性传输与网络协议基础
三、 WCF绑定协议的可靠性
可靠性与绑定对应关系
绑定协议名称 支持可靠性 默认可靠性 支持有序传递 默认有序传递
BasicHttpBinding No N/A No N/A
NetTcpBinding Yes Off Yes On
NetPeerTcpBinding No N/A No N/A
NetNamedPipeBinding No N/A(On) Yes N/A (On)
WSHttpBinding Yes Off Yes On
WSFederationHttpBinding Yes Off Yes On
WSDualHttpBinding Yes On Yes On
NetMsmqBinding No N/A No N/A
MsmqIntegrationBinding No N/A No N/A
四、 设置可靠会话
1、服务端指定绑定协议
2、端点设置自定义的bindingConfiguration方案
3、客户端的也需要指定
示例:
1, 服务端配置文件
<wsHttpBinding>
<binding name="binding1">
<reliableSession ordered="true" enabled="true" />
</binding>
</wsHttpBinding>
端点设置
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="binding1" contract="WcfServiceLibrary1.IService1">
2, 客服端设置
reliableSession ordered=”true” enabled=”true” />
五、 消息队列(MSMQ)
MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。
它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理.
其中两个重要的概念。一个是消息Message ,一个是队列Queue。
消息队列不同于传统的请求响应模式,它是客户端把消息发送给请求消息队列,服务可以稍后对消息进行处理并把处理结果发送给响应队列,而后客户端从响应队列读取服务处理后的消息。而且使用消息队列可以使客户端实现脱机工作。
脱机应用程序必须有本地缓存数据,要采用异步通讯而且要把消息持久化,在与服务器联机后将消息发送出去。WCF是使NetMsmqBinding来支持消息队列的,传输消息不是通过TCP或HTTP等,而是通过微软消息队列(MSMQ),这是Windows组件需要安装。
示例:
1, 新建wcf服务:
契约里:注意isoneway=true
[OperationContract(IsOneWay=true)]
void writeFile(string content);
实现里:
[OperationBehavior(TransactionScopeRequired=true,TransactionAutoComplete=true)]
public void writeFile(string content)
{
//写文件
StreamWriter sw = new StreamWriter("c:\\wcfMSMQ.txt", true);
sw.Write(content);
sw.WriteLine();
sw.Close();
}
2, 添加一个控制台的宿主程序
需要引用System.serviceModel,System.Messaging,WcfServiceLibrary1
Program.cs里代码:
//创建队列
string queueName = @".\private$\myQueue";
if (!MessageQueue.Exists(queueName))
{
MessageQueue.Create(queueName, true);
}
//host服务
ServiceHost host = new ServiceHost(typeof(WcfServiceLibrary1.Service1));
host.Open();
Console.WriteLine("服务已启动!");
Console.ReadLine();
然后,添加一个配置文件app.config
1,添加两个基地址
<host>
<baseAddresses>
<add baseAddress = "http://localhost:3300/msmq" />
<add baseAddress="net.msmq://localhost/private/myQueue" />
</baseAddresses>
</host>
2, 配置绑定的一种方案
<bindings>
<netMsmqBinding>
<binding name="binding1">
<security>
<transport msmqAuthenticationMode="None" msmqProtectionLevel="None"/>
<message clientCredentialType="UserName"/>
</security>
</binding>
</netMsmqBinding>
</bindings>
3, 在endpoint里指定一下绑定的方案
<endpoint address ="" binding="netMsmqBinding" bindingConfiguration="binding1" contract="WcfServiceLibrary1.IService1">
3, 创建一个控制台的客户端
先添加一个服务引用
http://localhost:3300/msmq
客户端程序
static void Main(string[] args)
{
Console.WriteLine(“请输入内容:”);
string txt = Console.ReadLine();
txt += DateTime.Now.ToString();
server.Service1Client client = new client.server.Service1Client();
client.writeFile(txt);
Console.WriteLine("写入成功");
Console.ReadLine();
}