wcf已經說到第六天了,居然還沒有說到這玩意有幾種通信模式,慚愧慚愧,不過很簡單啦,單向,請求-響應,雙工模式,其中的第二種“請求-響應“
模式,這個大家不用動腦子都清楚,這一篇我大概來分析下。
## 一:“請求-響應“模式
? 如果你看了我上一篇的博文,你應該非常清楚這種類似“本地調用”的方式,wcf同樣也分為“同步”和“異步”兩種,不過不管是異步還是同步,最終都逃
不過是“請求-響應”這個事實,對吧。
1: 同步方式
這種方式我想沒什么好說的,前面幾篇我已經說的非常清楚了,具體使用方法可以參考我的前面幾篇文章。。。謝啦~~~~
2: 異步方式
通常我們都有這樣的一個思維,遇到耗時的東西第一反應就想到了多線程,畢竟多線程也是一種負載均衡,在wcf這種”請求-響應“模式,同樣也支持異
步,很神奇吧,而且神奇到可以在“服務引用“界面上做到一鍵生成,什么???你不信!!!!不信你看。。。

然后我非常好奇的看下XXXClient給我們生成的是個什么代碼。。。

通過client端的proxy代碼,你可以清楚的看到,這雞巴WCF真的不容易,給我們生成了兩種“異步模式”,第一種是最古老的beginXXX,endXXX模式,
還有一種是被Jeffrey Richter 嚴重鄙視的“事件異步模式”。。。沒什么好說的,截圖一下給大家看看。

## 二:“單向“模式
很多時候,我們或許都有這樣的需求,比如說訂單提交成功的時候,我需要給客戶發送郵件,但是你想想,我發送郵件這個任務只是我訂單流程的
一個“額外任務“,也就是說,它的失敗不應該會阻止我的訂單流程,并且它的邏輯時間不應該會阻礙我的下單總時間,對吧。。。這樣的話,我的訂單時
間才會最小化,為了達到不影響下單總時間的效果,我的想法就是,client端直接把消息丟給信道就好了,然后不管server端有沒有真的接收到,處理的
慢不慢,過的好不好,等等,非常開心的是,這些對wcf來說真的是小菜一碟,只需要一個輕輕松松的”IsOneWay=true“屬性就可以了。。。牛逼的要
死。。。還有就是因為是單向的,所以契約方法就沒有存在返回值的必要了,我說的對吧。。。嘿嘿~~~
~~~
[ServiceContract]
public interface IHomeService
{
[OperationContract(IsOneWay = true)]
void Update(Student message);
}
~~~
~~~
namespace MyService
{
public class HomeService : IHomeService
{
public void Update(Student message)
{
Console.WriteLine(message.Name);
}
}
[DataContract]
public class Student
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
}
}
~~~
為了驗證是否真的是單向通訊,我可以用二種方法驗證下。
1\. wsdl中是否有output這個message
通過下面的圖,我想你看的很清楚了,你再也沒有找到我們熟悉的“output”這個message,這就說明貌似真的是單向的了,因為wsdl就是web服務的清單。

2\. 使用fillder監視一下請求消息
~~~
class Program
{
static void Main(string[] args)
{
HomeServiceClient client = new HomeServiceClient();
client.Update(new Student() { Name = "hxc" });
}
}
~~~

正如我在圖中說的那樣,非常奇怪,我的IsOneWay模式,竟然在http模式下行不通,但是你要記住,http模式天生就是“請求-響應”模式,它完全做不了
單向模式,說明白一點就是:“wcf發現你的bingding不支持單向“的時候,它并不會報錯,還是用自己天生的”請求-相應“模式來模擬”單向通信“,這就是你
看到的非常奇怪的Http 202這個http狀態碼,很多人包括我,都不知道http202 是幾個意思,沒關系,我們百科一下就好了。。。下面框框的里面的字,
已經說的非常清楚了,感謝感謝。。。

## 三:“雙向“ 模式
這個通訊其實沒什么好講的,也只有tcp模式才會天生支持,而http模式天生就不支持,就像上面一樣,如果非要用http來支持“雙向通訊“,那又是在
坑"wcf"他爹,這樣就會逼著他爹在底層再建立一個“請求-響應“模式來支持所謂的”雙向通訊“,而且”雙向通訊“這個玩意還不如用兩個單向的”請求-響應”模
式或者兩個“單向模式”來支持,而且兩個”請求-響應“模式比”雙向通訊“有更大的靈活性,反正我是對它不感冒,了解一下即可,如果大家比較感興趣,可以
在wcf官網上看一下:https://msdn.microsoft.com/zh-cn/library/ms735119.aspx。
? 好了,就說到這里,洗洗睡了,晚安~~~~
- 第一天 三種Binding讓你KO80%的業務
- 第二天 告別煩惱的config配置
- 第三天 client如何知道server提供的功能清單
- 第四天 你一定要明白的通信單元Message
- 第五天 你需要了解的三個小技巧
- 第六天 你必須要了解的3種通信模式
- 第七天 Close和Abort到底該怎么用才對得起觀眾
- 第八天 對“綁定”的最后一點理解
- 第九天 高級玩法之自定義Behavior
- 第十天 學會用SvcConfigEditor來簡化配置
- 第十一天 如何對wcf進行全程監控
- 第十二天 說說wcf中的那幾種序列化
- 第十三天 用WCF來玩Rest
- 第十四天 一起聊聊FaultException
- 終結篇 那些你需要注意的坑