十五天精通WCF——第六天 你必須要了解的3種通訊模式

一線碼農發表於2015-06-16

  

     wcf已經說到第六天了,居然還沒有說到這玩意有幾種通訊模式,慚愧慚愧,不過很簡單啦,單向,請求-響應,雙工模式,其中的第二種“請求-響應“

模式,這個大家不用動腦子都清楚,這一篇我大概來分析下。

 

一:“請求-響應“模式

    如果你看了我上一篇的博文,你應該非常清楚這種類似“本地呼叫”的方式,wcf同樣也分為“同步”和“非同步”兩種,不過不管是非同步還是同步,最終都逃

不過是“請求-響應”這個事實,對吧。

 

1: 同步方式

  這種方式我想沒什麼好說的,前面幾篇我已經說的非常清楚了,具體使用方法可以參考我的前面幾篇文章。。。謝啦~~~~

 

2: 非同步方式

  通常我們都有這樣的一個思維,遇到耗時的東西第一反應就想到了多執行緒,畢竟多執行緒也是一種負載均衡,在wcf這種”請求-響應“模式,同樣也支援異

步,很神奇吧,而且神奇到可以在“服務引用“介面上做到一鍵生成,什麼???你不信!!!!不信你看。。。

 

然後我非常好奇的看下XXXClient給我們生成的是個什麼程式碼。。。

 

通過client端的proxy程式碼,你可以清楚的看到,這雞巴WCF真的不容易,給我們生成了兩種“非同步模式”,第一種是最古老的beginXXX,endXXX模式,

還有一種是被Jeffrey Richter 嚴重鄙視的“事件非同步模式”。。。沒什麼好說的,截圖一下給大家看看。

 

二:“單向“模式

  很多時候,我們或許都有這樣的需求,比如說訂單提交成功的時候,我需要給客戶傳送郵件,但是你想想,我傳送郵件這個任務只是我訂單流程的

一個“額外任務“,也就是說,它的失敗不應該會阻止我的訂單流程,並且它的邏輯時間不應該會阻礙我的下單總時間,對吧。。。這樣的話,我的訂單時

間才會最小化,為了達到不影響下單總時間的效果,我的想法就是,client端直接把訊息丟給通道就好了,然後不管server端有沒有真的接收到,處理的

慢不慢,過的好不好,等等,非常開心的是,這些對wcf來說真的是小菜一碟,只需要一個輕輕鬆鬆的”IsOneWay=true“屬性就可以了。。。牛逼的要

死。。。還有就是因為是單向的,所以契約方法就沒有存在返回值的必要了,我說的對吧。。。嘿嘿~~~

1     [ServiceContract]
2     public interface IHomeService
3     {
4         [OperationContract(IsOneWay = true)]
5         void Update(Student message);
6     }
 1 namespace MyService
 2 {
 3     public class HomeService : IHomeService
 4     {
 5         public void Update(Student message)
 6         {
 7             Console.WriteLine(message.Name);
 8         }
 9     }
10 
11     [DataContract]
12     public class Student
13     {
14         [DataMember]
15         public string Name { get; set; }
16 
17         [DataMember]
18         public int Age { get; set; }
19     }
20 }

為了驗證是否真的是單向通訊,我可以用二種方法驗證下。

 

1. wsdl中是否有output這個message

  通過下面的圖,我想你看的很清楚了,你再也沒有找到我們熟悉的“output”這個message,這就說明貌似真的是單向的了,因為wsdl就是web服務的清單。

  

 

2. 使用fillder監視一下請求訊息

1     class Program
2     {
3         static void Main(string[] args)
4         {
5             HomeServiceClient client = new HomeServiceClient();
6 
7             client.Update(new Student() { Name = "hxc" });
8         }
9     }

  

正如我在圖中說的那樣,非常奇怪,我的IsOneWay模式,竟然在http模式下行不通,但是你要記住,http模式天生就是“請求-響應”模式,它完全做不了

單向模式,說明白一點就是:“wcf發現你的bingding不支援單向“的時候,它並不會報錯,還是用自己天生的”請求-相應“模式來模擬”單向通訊“,這就是你

看到的非常奇怪的Http 202這個http狀態碼,很多人包括我,都不知道http202 是幾個意思,沒關係,我們百科一下就好了。。。下面框框的裡面的字,

已經說的非常清楚了,感謝感謝。。。

 

三:“雙向“ 模式

  這個通訊其實沒什麼好講的,也只有tcp模式才會天生支援,而http模式天生就不支援,就像上面一樣,如果非要用http來支援“雙向通訊“,那又是在

坑"wcf"他爹,這樣就會逼著他爹在底層再建立一個“請求-響應“模式來支援所謂的”雙向通訊“,而且”雙向通訊“這個玩意還不如用兩個單向的”請求-響應”模

式或者兩個“單向模式”來支援,而且兩個”請求-響應“模式比”雙向通訊“有更大的靈活性,反正我是對它不感冒,瞭解一下即可,如果大家比較感興趣,可以

在wcf官網上看一下:https://msdn.microsoft.com/zh-cn/library/ms735119.aspx。

 

  好了,就說到這裡,洗洗睡了,晚安~~~~

 

相關文章