程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WCF示例(15) - 可靠性消息(ReliableMessaging)

WCF示例(15) - 可靠性消息(ReliableMessaging)

編輯:關於.NET

介紹

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
{
  /**//// <summary>
  /// 演示可靠性消息的接口
  /// </summary>
  /// <remarks>
  /// DeliveryRequirements - 指定綁定必須提供給服務或客戶端實現的功能要求
  /// RequireOrderedDelivery - 如果指示 WCF 確認綁定必須支持排序消息,則為 true;否則為 false。默認值為 false。如果設置為了 true,那麼也需要在配置的時候將order設置為 true
  /// </remarks>
  [ServiceContract]
  [DeliveryRequirements(RequireOrderedDelivery = true)]
  public interface IReliable
  {
    /**//// <summary>
    /// 將字符串寫入文本文件
    /// </summary>
    /// <param name="str">需要寫入文本文件的字符串</param>
    [OperationContract(IsOneWay = true)]
    void Write(string str);
  }
}

Reliable.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
  
using System.ServiceModel;
  
namespace WCF.ServiceLib.Message
{
  /**//// <summary>
  /// 演示可靠性消息的類
  /// </summary>
  public class Reliable : IReliable
  {
    /**//// <summary>
    /// 將字符串寫入文本文件
    /// </summary>
    /// <param name="str">需要寫入文本文件的字符串</param>
    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

<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Message.Reliable" %>

Web.config

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <services>
      <!--name - 提供服務的類名-->
      <!--behaviorConfiguration - 指定相關的行為配置-->
      <service name="WCF.ServiceLib.Message.Reliable" behaviorConfiguration="MessageBehavior">
        <!--address - 服務地址(監聽地址);listenUri - 服務監聽地址(實際地址)。監聽可以在host中設置(本例),也可以在client中設置(參看MTOM的例子)-->
        <!--binding - 通信方式-->
        <!--contract - 服務契約-->
        <!--bindingConfiguration - 指定相關的綁定配置-->
        <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" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MessageBehavior">
          <!--httpGetEnabled - 指示是否發布服務元數據以便使用 HTTP/GET 請求進行檢索,如果發布 WSDL,則為 true,否則為 false,默認值為 false-->
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <wsHttpBinding>
        <binding name="ReliableBindingConfiguration">
          <!--reliableSession - 對可靠會話綁定元素屬性的設置-->
          <!--enabled - 指示是否在通道終結點之間建立 WS-RM (WS-ReliableMessaging) 可靠會話。默認值為 false-->
          <!--ordered - 該值指示消息傳遞是否必須保持與消息發送一致的順序(如果設置為true,那麼也需要在相應的接口或類上聲明DeliveryRequirements)-->
          <!--inactivityTimeout - 服務在關閉之前保持非活動狀態的時間間隔-->
          <reliableSession enabled="true" ordered="true" inactivityTimeout="00:10:00" />
          <!--security - 與此綁定一起使用的安全設置-->
          <!--mode="None" - 禁用安全性-->
          <security mode="None" />
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

3、客戶端

Reliable.aspx

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Reliable.aspx.cs"
  Inherits="Message_Reliable" Title="可靠性消息(ReliableMessaging)" %>
  
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
  <asp:Button ID="btnReliable" runat="server" Text="可靠性消息測試" OnClick="btnReliable_Click" />
  <p>
    測試方法:
    <br />
    1、用TcpTrace監聽8888端口,目標端口3502
    <br />
    2、程序調用proxy.Hello("1")後馬上停止Trace,過一會再打開Trace,發現程序還會調用proxy.Hello("2");
  </p>
  <p>
    備注:
    <br />
    1、通過重試的方法來保證消息的可靠傳遞,默認為8次
    <br />
    2、當配置了“有序傳遞”的時候,客戶端和服務端會開辟緩沖區,服務端緩沖區在接到所有客戶端發來的消息後,按照客戶端調用的順序排序各個消息,然後有序地調用服務端
  </p>
</asp:Content>

Reliable.aspx.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
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");
    }
  }
}

Web.config

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <client>
      <!--address - 服務地址-->
      <!--binding - 通信方式-->
      <!--contract - 服務契約-->
      <!--bindingConfiguration - 指定相關的綁定配置-->
      <endpoint address="http://localhost:8888/ServiceHost/Message/Reliable.svc" binding="wsHttpBinding" contract="MessageSvc.Reliable.IReliable" bindingConfiguration="ReliableBindingConfiguration" />
    </client>
    <bindings>
      <wsHttpBinding>
        <binding name="ReliableBindingConfiguration">
          <!--reliableSession - 對可靠會話綁定元素屬性的設置-->
          <!--enabled - 指示是否在通道終結點之間建立 WS-RM (WS-ReliableMessaging) 可靠會話。默認值為 false-->
          <!--ordered - 該值指示消息傳遞是否必須保持與消息發送一致的順序(如果設置為true,那麼也需要在相應的接口或類上聲明DeliveryRequirements)-->
          <!--inactivityTimeout - 服務在關閉之前保持非活動狀態的時間間隔-->
          <reliableSession enabled="true" ordered="true" inactivityTimeout="00:10:00" />
          <!--security - 與此綁定一起使用的安全設置-->
          <!--mode="None" - 禁用安全性-->
          <security mode="None" />
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

運行結果:

1、用TcpTrace監聽8888端口,目標端口3502

2、程序調用proxy.Hello("1")後馬上停止Trace,過一會再打開Trace,發現程序還會調用proxy.Hello("2");

OK

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved