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。
好了,就說到這裡,洗洗睡了,晚安~~~~