天天看点

化零为整WCF(15) - 可靠性消息(ReliableMessaging)

<a href="http://webabcd.blog.51cto.com/1787395/343999" target="_blank">[索引页]</a>

化零为整WCF(15) - 可靠性消息(ReliableMessaging)

介绍

WCF(Windows Communication Foundation) - 可靠性消息(ReliableMessaging):

    ·通过重试的方法来保证消息的可靠传递,默认为8次

    ·当配置了“有序传递”的时候,客户端和服务端会开辟缓冲区,服务端缓冲区在接到所有客户端发来的消息后,按照客户端调用的顺序排序各个消息,然后有序地调用服务端

示例

1、服务

IReliable.cs

using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Text; 

using System.ServiceModel; 

namespace WCF.ServiceLib.Message 

        /// &lt;summary&gt; 

        /// 演示可靠性消息的接口 

        /// &lt;/summary&gt; 

        /// &lt;remarks&gt; 

        /// DeliveryRequirements - 指定绑定必须提供给服务或客户端实现的功能要求 

        /// RequireOrderedDelivery - 如果指示 WCF 确认绑定必须支持排序消息,则为 true;否则为 false。默认值为false。如果设置为了 true,那么也需要在配置的时候将order设置为 true 

        /// &lt;/remarks&gt; 

        [ServiceContract] 

        [DeliveryRequirements(RequireOrderedDelivery = true)] 

        public interface IReliable 

        { 

                /// &lt;summary&gt; 

                /// 将字符串写入文本文件 

                /// &lt;/summary&gt; 

                /// &lt;param name="str"&gt;需要写入文本文件的字符串&lt;/param&gt; 

                [OperationContract(IsOneWay = true)] 

                void Write(string str); 

        } 

}

Reliable.cs

        /// 演示可靠性消息的类 

        public class Reliable : IReliable 

                public void Write(string str) 

                { 

                        System.IO.StreamWriter sw = new System.IO.StreamWriter(@"C:\WCF_Log_Reliable.txt", true); 

                        sw.Write(str); 

                        sw.WriteLine(); 

                        sw.Close(); 

                } 

2、宿主

Reliable.svc

&lt;%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Message.Reliable" %&gt;

Web.config

&lt;?xml version="1.0"?&gt; 

&lt;configuration&gt; 

        &lt;system.serviceModel&gt; 

                &lt;services&gt; 

                        &lt;!--name - 提供服务的类名--&gt; 

                        &lt;!--behaviorConfiguration - 指定相关的行为配置--&gt; 

                        &lt;service name="WCF.ServiceLib.Message.Reliable" behaviorConfiguration="MessageBehavior"&gt; 

                                &lt;!--address - 服务地址(监听地址);listenUri - 服务监听地址(实际地址)。监听可以在host中设置(本例),也可以在client中设置(参看MTOM的例子)--&gt; 

                                &lt;!--binding - 通信方式--&gt; 

                                &lt;!--contract - 服务契约--&gt; 

                                &lt;!--bindingConfiguration - 指定相关的绑定配置--&gt; 

                                &lt;endpoint address="http://localhost:8888/ServiceHost/Message/Reliable.svc" listenUri="http://localhost:3502/ServiceHost/Message/Reliable.svc" binding="wsHttpBinding" contract="WCF.ServiceLib.Message.IReliable" bindingConfiguration="ReliableBindingConfiguration" /&gt; 

                        &lt;/service&gt; 

                &lt;/services&gt; 

                &lt;behaviors&gt; 

                        &lt;serviceBehaviors&gt; 

                                &lt;behavior name="MessageBehavior"&gt; 

                                        &lt;!--httpGetEnabled - 指示是否发布服务元数据以便使用 HTTP/GET 请求进行检索,如果发布 WSDL,则为 true,否则为 false,默认值为 false--&gt; 

                                        &lt;serviceMetadata httpGetEnabled="true" /&gt; 

                                        &lt;serviceDebug includeExceptionDetailInFaults="true"/&gt; 

                                &lt;/behavior&gt; 

                        &lt;/serviceBehaviors&gt; 

                &lt;/behaviors&gt; 

                &lt;bindings&gt; 

                        &lt;wsHttpBinding&gt; 

                                &lt;binding name="ReliableBindingConfiguration"&gt; 

                                        &lt;!--reliableSession - 对可靠会话绑定元素属性的设置--&gt; 

                                        &lt;!--enabled - 指示是否在通道终结点之间建立 WS-RM (WS-ReliableMessaging) 可靠会话。默认值为 false--&gt; 

                                        &lt;!--ordered - 该值指示消息传递是否必须保持与消息发送一致的顺序(如果设置为true,那么也需要在相应的接口或类上声明DeliveryRequirements)--&gt; 

                                        &lt;!--inactivityTimeout - 服务在关闭之前保持非活动状态的时间间隔--&gt; 

                                        &lt;reliableSession enabled="true" ordered="true" inactivityTimeout="00:10:00" /&gt; 

                                        &lt;!--security - 与此绑定一起使用的安全设置--&gt; 

                                        &lt;!--mode="None" - 禁用安全性--&gt; 

                                        &lt;security mode="None" /&gt; 

                                &lt;/binding&gt; 

                        &lt;/wsHttpBinding&gt; 

                &lt;/bindings&gt; 

        &lt;/system.serviceModel&gt; 

&lt;/configuration&gt;

3、客户端

Reliable.aspx

&lt;%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Reliable.aspx.cs" 

        Inherits="Message_Reliable" Title="可靠性消息(ReliableMessaging)" %&gt; 

&lt;asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"&gt; 

&lt;/asp:Content&gt; 

&lt;asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"&gt; 

        &lt;asp:Button ID="btnReliable" runat="server" Text="可靠性消息测试" OnClick="btnReliable_Click" /&gt; 

        &lt;p&gt; 

                测试方法: 

                &lt;br /&gt; 

                1、用TcpTrace监听8888端口,目标端口3502 

                2、程序调用proxy.Hello("1")后马上停止Trace,过一会再打开Trace,发现程序还会调用proxy.Hello("2"); 

        &lt;/p&gt; 

                备注: 

                1、通过重试的方法来保证消息的可靠传递,默认为8次 

                2、当配置了“有序传递”的时候,客户端和服务端会开辟缓冲区,服务端缓冲区在接到所有客户端发来的消息后,按照客户端调用的顺序排序各个消息,然后有序地调用服务端 

&lt;/asp:Content&gt;

Reliable.aspx.cs

using System.Collections; 

using System.Configuration; 

using System.Data; 

using System.Web; 

using System.Web.Security; 

using System.Web.UI; 

using System.Web.UI.HtmlControls; 

using System.Web.UI.WebControls; 

using System.Web.UI.WebControls.WebParts; 

using System.Xml.Linq; 

using System.ServiceModel.Channels; 

using System.IO; 

public partial class Message_Reliable : System.Web.UI.Page 

        protected void Page_Load(object sender, EventArgs e) 

        protected void btnReliable_Click(object sender, EventArgs e) 

                using (var proxy = new MessageSvc.Reliable.ReliableClient()) 

                        proxy.Write("1"); 

                        System.Threading.Thread.Sleep(3000); 

                        proxy.Write("2"); 

                &lt;client&gt; 

                        &lt;!--address - 服务地址--&gt; 

                        &lt;!--binding - 通信方式--&gt; 

                        &lt;!--contract - 服务契约--&gt; 

                        &lt;!--bindingConfiguration - 指定相关的绑定配置--&gt; 

                        &lt;endpoint address="http://localhost:8888/ServiceHost/Message/Reliable.svc" binding="wsHttpBinding" contract="MessageSvc.Reliable.IReliable" bindingConfiguration="ReliableBindingConfiguration" /&gt; 

                &lt;/client&gt; 

运行结果:

1、用TcpTrace监听8888端口,目标端口3502

2、程序调用proxy.Hello("1")后马上停止Trace,过一会再打开Trace,发现程序还会调用proxy.Hello("2");

OK

     本文转自webabcd 51CTO博客,原文链接http://blog.51cto.com/webabcd/344164:,如需转载请自行联系原作者