本章內容編程
請求/響應
請求/響應通訊是指客戶端向服務端發送消息後,服務端會向客戶端發送響應。這也意味着在接收到服務的響應之前,客戶端不會繼續執行操做。網絡
[OperationContract] string getOrders(DateTime dt);
請求/響應模式是默認的消息模式。
返回值是void,也屬於請求/響應消息交換。
除非客戶端異步調用操做,不然客戶端將中止處理,直到收到返回消息,即便該消息正常狀況下爲空時也是如此。
缺點
– 若是執行操做須要很長的時間,則會下降客戶端性能和響應能力。
優勢
– 響應消息中可返回SOAP 錯誤,這代表可能在通訊或處理中發生了一些與服務有關的錯誤情況。多線程
單向通訊應是指通訊只在一個方向進行,即從客戶端流向服務。服務不會發送響應,而客戶端也不會指望會有響應。這種狀況下,客戶端發送消息,而後繼續執行。
單向操做是客戶端調用操做並在WCF 將消息寫入網絡後繼續進行處理的操做。一般這意味着,除非在出站消息中發送的數據極其龐大,不然客戶端幾乎當即繼續運行(除非發送數據時出錯)。此種類型的消息交換模式支持從客戶端到服務應用程序的相似於事件的行爲。
若要爲返回void 的操做指定單向消息交換,請將IsOneWay 屬性設置爲true,默認爲false.異步
[OperationContract(IsOneWay=true)] void insertEmp(Employee emp);
雙工模式的特色是,不管使用單向消息發送仍是請求/答覆消息發送方式,服務和客戶端均可以獨立地向對方發送消息。對於必須直接與客戶端通訊或向消息交換的任意一方提供異步體驗(包括相似於事件的行爲)的服務來講,這種雙向通訊形式很是有用。async
– 若要設計雙工協定,還必須設計回調協定,並將該回調協定的類型分配給標記服務協定的ServiceContractAttribute 屬性(attribute)的CallbackContract 屬性(property)。
– 若要實現雙工模式,您必須建立第二個接口,該接口包含在客戶端調用的方法聲明性能
[ServiceContract(SessionMode=SessionMode.Required, CallbackContract=typeof(IServiceDuplexCallback))] public interface IServiceClass { [OperationContract(IsOneWay = true)] void AddNumber(); } public interface IServiceDuplexCallback { [OperationContract(IsOneWay = true)] void Calculate(double result); }
WCF異步的二種方式
用svcutil生成異步功能的代理類
修改接口定義異步方法
異步與線程
異步操做的優缺點
異步調用(asynchronous call)
操做系統發展到今天已經十分精巧,線程就是其中一個傑做。操做系統把 CPU 處理時間劃分紅許多短暫時間片,在時間 T1 執行一個線程的指令,到時間 T2又執行下一線程的指令,各線程輪流執行,結果好象是全部線程在並肩前進。這樣,編程時能夠建立多個線程,在同一期間執行,各線程能夠「並行」完成不一樣的任務。
在單線程方式下,計算機是一臺嚴格意義上的馮·諾依曼式機器,一段代碼調用另外一段代碼時,只能採用同步調用,必須等待這段代碼執行完返回結果後,調用方纔能繼續往下執行。
有了多線程的支持,能夠採用異步調用,調用方和被調方能夠屬於兩個不一樣的線程,調用方啓動被調方線程後,不等對方返回結果就繼續執行後續代碼。
好比:好比FileStream對象的Read方法
同步方式
int Read(byte[] buffer,int offset,int count)
異步方式
IAsyState BeginRead(byte[] buffer,int offset,int count, IAsyncResult callback,Object asyState)
int EndRead(IAsyncResult ar)ui
WCF異步的二種方式
異步與否由客戶端來決定,在設計之初,不該該去考慮服務的調用者調用的方式。
WCF能夠由二種方式生成客戶端異步調用的代理類:
一、用svcutil生成異步功能的代理類
二、修改接口定義異步方法
咱們用svcutil來生成客戶端代理代碼的時候,只需添加 /async即可以生成有異步功能的代理類了.
而在IDE中,操做就更加簡單,就是在添加ServiceReference的時候,選擇高級選項,鉤選「建立異步方法」
示例:spa
//異步 private void button1_Click(object sender, EventArgs e) { myService.Service1Client client = new client.myService.Service1Client(); client.helloCompleted += new EventHandler<client.myService.helloCompletedEventArgs>(client_helloCompleted); client.helloAsync("my god"); //client.Beginhello("my god", doCallBack, client); } void client_helloCompleted(object sender, client.myService.helloCompletedEventArgs e) { MessageBox.Show(e.Result); } //private void doCallBack(IAsyncResult ar) //{ // string s = ((myService.Service1Client)ar.AsyncState).Endhello(ar); // MessageBox.Show(s); //}
異步調用方法2
修改在客戶端的服務定義,增長操做的異步方法。
在客戶端決定採用異步方式調用服務的操做時,雖然須要修改客戶端的服務契約接口,但並不會影響服務端的契約定義。
操作系統
[OperationContract(AsyncPattern = true, Action = "",ReplyAction="")] IAsyncResult BeginTransferFile(AsyncCallback callback, object asyncState); byte[] EndTransferFile(IAsyncResult result);