欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

WCF實現(xiàn)雙向通信

 更新時間:2022年05月12日 14:43:33   作者:springsnow  
這篇文章介紹了WCF實現(xiàn)雙向通信的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

請求過程中的回調(diào)

這是一種比較典型的雙工消息交換模式的表現(xiàn)形式,客戶端在進行服務(wù)調(diào)用的時候,附加上一個回調(diào)對象;服務(wù)在對處理該處理中,通過客戶端附加的回調(diào)對象(實際上是調(diào)用回調(diào)服務(wù)的代理對象)回調(diào)客戶端的操作(該操作在客戶端執(zhí)行)。整個消息交換的過程實際上由兩個基本的消息交換構(gòu)成,其一是客戶端正常的服務(wù)請求,其二則是服務(wù)端對客戶端的回調(diào)。兩者可以采用請求-回復(fù)模式,也可以采用單向(One-way)的MEP進行消息交換。圖1描述了這樣的過程,服務(wù)調(diào)用和回調(diào)都采用請求-回復(fù)MEP。

圖1

我們沿用計算服務(wù)的例子。在這之前,我們都是調(diào)用CalculuateService直接得到計算結(jié)果,并將計算結(jié)果通過控制臺輸出。在本例中我們將采用另外一種截然不同的方式調(diào)用服務(wù)并進行結(jié)果的輸出:我們通過單向(One-way)的模式調(diào)用CalculuateService(也就是客戶端不可能通過回復(fù)消息得到計算結(jié)果),服務(wù)端在完成運算結(jié)果后,通過回調(diào)(Callback)的方式在客戶端將計算結(jié)果打印出來。

一:定義服務(wù)契約和回調(diào)契約

首先進行服務(wù)契約的定義,我們照例通過接口(ICalculator)的方式定義服務(wù)契約,作用于指定加法運算的Add操作,我們通過OperationContractAttribute特性的IsOneway屬性將操作定義成單向的操作,這意味著客戶端僅僅是向服務(wù)端發(fā)送一個運算的請求,并不會通過回復(fù)消息得到任何運算結(jié)果。

[ServiceContract(Namespace = "http://www.artech.com/", CallbackContract = typeof(ICallback))]//回調(diào)契約的類型通過ServiceContractAttribute特性的CallbackContract屬性進行指定。
public interface ICalculator
{
    [OperationContract(IsOneWay = true)]
    void Add(double x, double y);
}
//回調(diào)契約
public interface ICallback //由于定義ICalculator的時候已經(jīng)通過[ServiceContract(CallbackContract=typeof(ICallback))]指明ICallback是一個服務(wù)契約了,所以ICallback不再需要添加ServiceContractAttribute特性。
{
    [OperationContract(IsOneWay = true)]//服務(wù)端不需要回調(diào)的返回值,索性將回調(diào)操作也設(shè)為單向方法。
    void DisplayResult(double x, double y, double result);
}

二:實現(xiàn)服務(wù)

在實現(xiàn)了上面定義的服務(wù)契約ICalculator的服務(wù)CalculatorService中,實現(xiàn)了Add操作,完成運算和結(jié)果顯示的工作。結(jié)果顯示是通過回調(diào)的方式實現(xiàn)的,所以需要借助于客戶端提供的回調(diào)對象(該對象在客戶端調(diào)用CalculatorService的時候指定,在介紹客戶端代碼的實現(xiàn)的時候會講到)。在WCF中,回調(diào)對象通過當(dāng)前OperationContext的GetCallback<T>方法獲得(T代表回調(diào)契約的類型)。

public class CalculatorService : ICalculator
{
    public void Add(double x, double y)
    {
        double result = x + y;
        ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
        callback.DisplayResult(x, y, result);
    }
}

注: OperationContext在WCF中是一個非常重要、也是一個十分有用的對象,它代表服務(wù)操作執(zhí)行的上下文。我們可以通過靜態(tài)屬性Current(OperationContext.Current)得到當(dāng)前的OperationContext。借助OperationContext,我們可以在服務(wù)端或者客戶端獲取或設(shè)置一些上下文,比如在客戶端可以通過它為出棧消息(outgoing message)添加SOAP報頭,以及HTTP報頭(比如Cookie)等。在服務(wù)端,則可以通過OperationContex獲取在客戶端設(shè)置的SOAP報頭和HTTP報頭。關(guān)于OperationContext的詳細信息,可以參閱MSDN在線文檔。

三:服務(wù)寄宿

我們通過一個控制臺應(yīng)用程序完成對CalculatorService的寄宿工作,并將所有的服務(wù)寄宿的參數(shù)定義在配置文件中。由于雙工通信依賴于一個雙工的信道棧,即依賴于一個能夠支持雙工通信的綁定,在此我們選用了NetTcpBinding。

<system.serviceModel>
       <behaviors>
       <services>
           <service name = "Artech.DuplexServices.Services.CalculatorService">
                <endpoint address = "net.tcp://127.0.0.1:9999/CalculatorService"  binding = "netTcpBinding" contract = "Artech.DuplexServices.Contracts.ICalculator"/>
             </service>
         </services>
 </system.serviceModel>

注: 在WCF預(yù)定義綁定類型中,WSDualHttpBindingNetTcpBinding均提供了對雙工通信的支持,但是兩者在對雙工通信的實現(xiàn)機制上卻有本質(zhì)的區(qū)別。WSDualHttpBinding是基于HTTP傳輸協(xié)議的;而HTTP協(xié)議本身是基于請求-回復(fù)的傳輸協(xié)議,基于HTTP的通道本質(zhì)上都是單向的。WSDualHttpBinding實際上創(chuàng)建了兩個通道,一個用于客戶端向服務(wù)端的通信,而另一個則用于服務(wù)端到客戶端的通信,從而間接地提供了雙工通信的實現(xiàn)。而NetTcpBinding完全基于支持雙工通信的TCP協(xié)議。

using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
{
    host.Open();
    Console.Read();
}

四:實現(xiàn)回調(diào)契約與服務(wù)調(diào)用

在客戶端程序為回調(diào)契約提供實現(xiàn),在下面的代碼中CalculateCallback實現(xiàn)了回調(diào)契約ICallback,在DisplayResult方法中對運算結(jié)果進行輸出。

class CalculateCallback : ICallback
{
    public void DisplayResult(double x, double y, double result)
    {
        Console.WriteLine("x + y = {2} when x = {0} and y = {1}", x, y, result);
    }
}

接下來實現(xiàn)對雙工服務(wù)的調(diào)用,下面是相關(guān)的配置和托管程序。在服務(wù)調(diào)用程序中,通過DuplexChannelFactory<TChannel>創(chuàng)建服務(wù)代理對象,DuplexChannelFactory<TChannel>和ChannelFactory<TChannel>的功能都是一個服務(wù)代理對象的創(chuàng)建工廠,不過DuplexChannelFactory<TChannel>專門用于基于雙工通信的服務(wù)代理的創(chuàng)建。在創(chuàng)建DuplexChannelFactory<TChannel>之前,先創(chuàng)建回調(diào)對象,并通過InstanceContext對回調(diào)對象進行包裝。

<system.serviceModel>
     <client>
         <endpoint name = "CalculatorService" address = "net.tcp://127.0.0.1:9999/CalculatorService" binding = "netTcpBinding" contract = "Artech.DuplexServices.Contracts.ICalculator"/>
     </client>
 </system.serviceModel>
InstanceContext instanceContext = new InstanceContext(new CalculateCallback());
using (DuplexChannelFactory<ICalculator> channelFactory = new DuplexChannelFactory<ICalculator>(instanceContext, "CalculatorService"))
{
    ICalculator proxy = channelFactory.CreateChannel();
    using (proxy as IDisposable)
    {
        proxy.Add(1, 2);
        Console.Read();
    }
}

注意:如果采用WsDualHttpBinding,由于回調(diào)的服務(wù)監(jiān)聽地址采用的默認端口是80,在IIS 5.x以及之前的版本中,80端口是IIS獨占的監(jiān)聽端口。WsDualHttpBinding定義了一個ClientBaseAddress使你能很容易地改變回調(diào)服務(wù)的基地址。對于我們給出的案例,我們只要通過下面的配置將clientBaseAddress設(shè)為可用的地址(http://127.0.0.1:8888/ CalculatorService) 
< bindings >
     < wsDualHttpBinding >
         < binding name = "MyBinding" clientBaseAddress = "http://127.0.0.1:8888/calculatecallback" />
        </ wsDualHttpBinding >
  </ bindings >

到此這篇關(guān)于WCF實現(xiàn)雙向通信的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#生成指定范圍內(nèi)的不重復(fù)隨機數(shù)

    C#生成指定范圍內(nèi)的不重復(fù)隨機數(shù)

    對于隨機數(shù),大家都知道,計算機不 可能產(chǎn)生完全隨機的數(shù)字,所謂的隨機數(shù)發(fā)生器都是通過一定的算法對事先選定的隨機種子做復(fù)雜的運算,用產(chǎn)生的結(jié)果來近似的模擬完全隨機數(shù),這種隨機數(shù)被稱 作偽隨機數(shù)。偽隨機數(shù)是以相同的概率從一組有限的數(shù)字中選取的。
    2015-05-05
  • C#11新特性使用案例詳解

    C#11新特性使用案例詳解

    這篇文章主要為大家介紹了C#11新特性的使用案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • C#堆排序?qū)崿F(xiàn)方法

    C#堆排序?qū)崿F(xiàn)方法

    這篇文章主要介紹了C#堆排序?qū)崿F(xiàn)方法,實例分析了C#對排序的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 使用checked語句防止數(shù)據(jù)溢出的解決方法

    使用checked語句防止數(shù)據(jù)溢出的解決方法

    本篇文章是對用checked語句防止數(shù)據(jù)溢出的解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C#方法中參數(shù)ref和out詳解

    C#方法中參數(shù)ref和out詳解

    這篇文章主要為大家詳細介紹了C#方法中參數(shù)ref和out的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • WPF通過使用C#代碼給控件賦值

    WPF通過使用C#代碼給控件賦值

    開發(fā)中偶爾會用到使用c#代碼給控件賦值,這里需要通過F12找到控件的賦值類型,然后在看控件可以使用那種方式賦值,花點時間研究一下,基本都可以通過c#代碼給控件賦值的,需要的朋友可以參考下
    2023-09-09
  • C#操作DataGridView設(shè)置單元格只讀

    C#操作DataGridView設(shè)置單元格只讀

    這篇文章介紹了C#操作DataGridView設(shè)置單元格只讀的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • C# 文件操作函數(shù) 創(chuàng)建文件 判斷存在

    C# 文件操作函數(shù) 創(chuàng)建文件 判斷存在

    本文列舉了C#中文件操作中常用的函數(shù),創(chuàng)建文件和判斷文件存不存在的基本使用,簡單實用,希望能幫到大家。
    2016-05-05
  • 漢字轉(zhuǎn)拼音縮寫示例代碼(Silverlight和.NET 將漢字轉(zhuǎn)換成為拼音)

    漢字轉(zhuǎn)拼音縮寫示例代碼(Silverlight和.NET 將漢字轉(zhuǎn)換成為拼音)

    本篇文章主要介紹了漢字轉(zhuǎn)拼音縮寫示例代碼(Silverlight和.NET 將漢字轉(zhuǎn)換成為拼音) 需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • 字符串陣列String[]轉(zhuǎn)換為整型陣列Int[]的實例

    字符串陣列String[]轉(zhuǎn)換為整型陣列Int[]的實例

    下面小編就為大家分享一篇字符串陣列String[]轉(zhuǎn)換為整型陣列Int[]的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12

最新評論