久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

[老老實(shí)實(shí)學(xué)WCF] 第九篇 消息通信模式(上) 請求應(yīng)答與單向

 夢想合伙人丶 2016-03-10

老老實(shí)實(shí)學(xué)WCF

第九篇 消息通信模式(上) 請求應(yīng)答與單向

 

通過前兩篇的學(xué)習(xí),我們了解了服務(wù)模型的一些特性如會話和實(shí)例化,,今天我們來進(jìn)一步學(xué)習(xí)服務(wù)模型的另一個(gè)重要特性:消息通信模式,。

 

WCF的服務(wù)端與客戶端在通信時(shí)有三種模式:單向模式、請求/應(yīng)答模式和雙工模式,。

 

如果選用了單向模式,,調(diào)用方在向被調(diào)用方進(jìn)行了調(diào)用后不期待任何回應(yīng),被調(diào)用方在執(zhí)行完調(diào)用后不給調(diào)用方任何反饋,。如客戶端通過單向模式調(diào)用了一個(gè)服務(wù)端的操作后,就去干別的了,,不會等待服務(wù)端給他任何響應(yīng),,他也無從得知調(diào)用是否成功,甚至連發(fā)生了錯(cuò)誤也全然不知,。這種模式的特點(diǎn)是,,客戶端在調(diào)用操作后立即返回,從客戶端角度看,,用戶操作的響應(yīng)是非??斓模皇强蛻舳藷o法得知調(diào)用結(jié)果,。

 

如果選用了請求/應(yīng)答模式,,客戶端向服務(wù)端發(fā)出調(diào)用后會一直等待服務(wù)端的回復(fù),服務(wù)端在執(zhí)行完操作后會把結(jié)果返回給客戶端,,即使服務(wù)操作簽名返回值為void,,服務(wù)端還是會返回一條空消息,,告訴客戶端調(diào)用完成了,客戶端在接到返回后才會從調(diào)用方法返回繼續(xù)進(jìn)行下面的工作,。這種模式的特點(diǎn)是客戶端總是可以知道服務(wù)執(zhí)行的情況,,如果出錯(cuò),錯(cuò)誤也會返回,,客戶端對服務(wù)的執(zhí)行監(jiān)控的很好,,但是由于在服務(wù)返回之前客戶端會一直等待,所以如果服務(wù)端的服務(wù)執(zhí)行時(shí)間比較長的話,,客戶端這邊的用戶響應(yīng)就會很慢,,如果客戶端對服務(wù)的調(diào)用與用戶界面在同一線程,在用戶看來,,應(yīng)用程序就死在那里了,。

 

如果選用了雙工模式,客戶端和服務(wù)端都可以單獨(dú)的向?qū)Ψ桨l(fā)送消息調(diào)用,,其實(shí)這種模式是在單向模式基礎(chǔ)上進(jìn)行的,,兩邊的調(diào)用都是單向調(diào)用,但是兩邊都可以獨(dú)立的進(jìn)行,,誰也不用等待誰,,這種模式比較復(fù)雜一些,我們在下一篇再詳細(xì)的研究,。

 

1. 如何設(shè)置消息通信模式,。

雙工模式有其他的設(shè)置方式,單行模式和請求應(yīng)答模式的設(shè)置位置是相同的,,就是通過修改操作協(xié)定的OperationContract屬性的IsOneWay屬性來設(shè)置,。如下面的代碼將HelloWCF操作協(xié)定設(shè)置為了單向模式:

    [ServiceContract]    public interface IHelloWCF    {        [OperationContract(IsOneWay=true)]        void HelloWCF();    }  

如果不配置IsOneWay屬性,那么他默認(rèn)是False的,,也就是說默認(rèn)的消息通信模式是請求/應(yīng)答模式,,除非我們顯式的指定為單向模式。

下面的代碼將HelloWCF操作協(xié)定設(shè)置為了請求/應(yīng)答模式:

    [ServiceContract]    public interface IHelloWCF    {        [OperationContract(IsOneWay=false)]        void HelloWCF();    }  

由于是默認(rèn)值,,IsOneWay屬性不配置也是可以的,。

 

注意,在單向模式下,,返回值必須是void,,并且不能使用任何Out或Ref的方式返回參數(shù)值,也就是說不能以任何手段返回任何值,,這是基礎(chǔ)結(jié)構(gòu)所不允許的,,這樣做會導(dǎo)致服務(wù)端拋出異常。而在請求/應(yīng)答模式下,這些都是可以的,,即使沒有返回值(返回值為void),,返回消息也會照樣發(fā)送,只不過是個(gè)空消息,。

2. 兩種模式的例子

首先我們看一個(gè)請求/應(yīng)答模式的例子,,我用的還是前幾篇中使用的IIS宿主服務(wù)的例子,如果你忘了,,翻回去熟悉一下,。

我們讓服務(wù)端的HelloWCF在返回'Hello WCF!'字符串之前,先磨蹭一會,,讓他在線程上休眠一會兒,。

HelloWCFService.CS的源代碼如下:

using System;using System.ServiceModel;namespace LearnWCF{    [ServiceContract]    public interface IHelloWCF    {        [OperationContract(IsOneWay=false)]        string HelloWCF();    }      public class HelloWCFService : IHelloWCF    {        private int _Counter;        public string HelloWCF()        {            System.Threading.Thread.Sleep(3000);            return 'Hello WCF!';        }    }}

沒什么變化,就是讓他在線程上Sleep 3秒,。

下面是Web.Config文件,,也沒什么變化:

                                                                                      

下面是SVC文件,就一行代碼,,指示了這是個(gè)WCF服務(wù),,并指定了后臺類型:

<%@ServiceHost language=c# Debug='true' Service='LearnWCF.HelloWCFService'%>

 

把SVC文件和Web.Config文件放在網(wǎng)站根文件夾下,CS文件放在App_Code文件夾下,,啟動(dòng)IIS,,服務(wù)就寄宿好了,如果你忘記了如何在IIS中寄宿,,馬上翻回第三篇熟悉一下,。

 

用SVCUTIL.EXE或添加服務(wù)引用來生成客戶端,為了能看出調(diào)用的時(shí)間,,我們在調(diào)用前和調(diào)用后分別把時(shí)間輸出來,。Program.cs代碼如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;namespace ConsoleClient{    class Program    {        static void Main(string[] args)        {            Services.HelloWCFClient client = new Services.HelloWCFClient();            Console.WriteLine(DateTime.Now.ToLongTimeString());            Console.WriteLine(client.HelloWCF());            Console.WriteLine(DateTime.Now.ToLongTimeString());            Console.ReadLine();        }    }}

F5運(yùn)行一下,結(jié)果如下:

可以看到,,整個(gè)調(diào)用花費(fèi)了4秒鐘,,除了服務(wù)方法中Sleep了3秒,建立會話通訊什么的還用了1秒,,在服務(wù)端方法Sleep的時(shí)候,客戶端一直在等待,。

 

接下來,,我們再看單向模式的情況,我們修改一下服務(wù)協(xié)定的代碼,,讓其采用單向模式,,但是注意,此時(shí)不能有返回值了,,必須設(shè)為void,,服務(wù)方法中就是睡3秒,,其他的什么也不做。

using System;using System.ServiceModel;namespace LearnWCF{    [ServiceContract]    public interface IHelloWCF    {        [OperationContract(IsOneWay=true)]        void HelloWCF();    }      public class HelloWCFService : IHelloWCF    {        private int _Counter;        public void HelloWCF()        {            System.Threading.Thread.Sleep(3000);        }    }}


客戶端需要重新下載一下元數(shù)據(jù)或更新一下服務(wù)引用,,因?yàn)榉?wù)協(xié)定的內(nèi)容變了,,客戶端Program.CS代碼如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;namespace ConsoleClient{    class Program    {        static void Main(string[] args)        {            Services.HelloWCFClient client = new Services.HelloWCFClient();            Console.WriteLine(DateTime.Now.ToLongTimeString());            client.HelloWCF();            Console.WriteLine(DateTime.Now.ToLongTimeString());            Console.ReadLine();        }    }}


F5看看結(jié)果:

可以看到只用了1秒,客戶端與服務(wù)端建立會話后把調(diào)用送出就立即返回了,,沒有等待服務(wù)端睡那三秒,,當(dāng)然此時(shí)的客戶端也根本就不知道服務(wù)端在做什么。

 

注意,,請求應(yīng)答模式是需要會話支持的,,必須使用支持會話的綁定,而且服務(wù)協(xié)定的SessionMode必須至少為Allowed,,服務(wù)類的ServiceBehavior的InstanceContextMode必須是PerSession,,我們在這里沒有配置,因?yàn)樗麄兪悄J(rèn)的,,但是我們必須知道他們需要這樣的配置才能支持請求/應(yīng)答模式,。

 

如果你在試驗(yàn)中遇到了莫名其妙的問題,嘗試把客戶端服務(wù)引用全部刪掉重新添加服務(wù)引用,,因?yàn)橛械臅r(shí)候更新服務(wù)引用不總是那么好用,。

3. 總結(jié)

通過這一篇的學(xué)習(xí),我們了解了消息通訊的兩種基本模式,,在這個(gè)基礎(chǔ)上還有更加復(fù)雜的雙工通訊模式,,我們在下一篇中詳細(xì)研究。







 

 

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多