溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WCF中怎么實現(xiàn)異步調(diào)用

發(fā)布時間:2021-07-23 16:26:22 來源:億速云 閱讀:116 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關WCF中怎么實現(xiàn)異步調(diào)用,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

隨著時代的發(fā)展,異步調(diào)用在編程中是不可缺少的,這里就關于WCF異步調(diào)用簡單的和大家分享一下吧。WCF 與Web Service不同的是,當我們定義了服務契約的操作時,不管是通過ChannelFactory創(chuàng)建服務代理對象,還是通過SvcUtil的默認方式生成服務代理對象,客戶端在調(diào)用這些代理對象時,都無法直接實現(xiàn)異步方式的調(diào)用。例如,對于如下的服務操作定義:

 [OperationContract]   Stream TransferDocument(Document document);

在調(diào)用代理對象的方法時,我們無法找到對應于TransferDocument()操作的BeginTransferDocument()和EndTransferDocument()異步方法。

這樣的設計使得我們無法通過編程方式異步地調(diào)用服務的操作,除非我們在定義服務接口時,直接加入相關操作的異步方法。然而,這又直接導致了服務的設計與方法調(diào)用方式之間的耦合。一個好的框架設計要素在于,不管客戶端的調(diào)用方式(同步或者異步),服務的設計與實現(xiàn)應該是一致的。對于服務的設計者而言,在設計之初,就不應該去考慮服務的調(diào)用者調(diào)用的方式。換言之,服務操作究竟是否采用異步方式,應該由客戶端的調(diào)用者決定。因此,所有與WCF異步調(diào)用相關的內(nèi)容應該只與客戶端相關。WCF遵循了這一規(guī)則。

在我編寫的應用程序中,會暴露一個傳送文檔文件的服務操作。我并不知道也并不關心調(diào)用該操作的客戶端是否采用異步方式。因此,如上所述的服務操作定義是完全正確的。

那么,客戶端究竟應該如何執(zhí)行WCF異步調(diào)用呢?如果采用編程方式獲得服務代理對象,這一問題會變得比較糟糕。因為我將服務契約的定義單獨形成了一個程序集,并在客戶端直接引用了它。然而,在這樣的服務契約程序集中,是沒有包含異步方法的定義的。因此,我需要修改在客戶端的服務定義,增加操作的異步方法。這無疑為服務契約的重用帶來障礙。至少,我們需要在客戶端維持一份具有異步方法的服務契約。

所幸,在客戶端決定采用異步方式調(diào)用我所設計的服務操作時,雖然需要修改客戶端的服務契約接口,但并不會影響服務端的契約定義。因此,服務端的契約定義可以保持不變,而在客戶端則修改接口定義如下:

[ServiceContract]   public interface IDocumentsExplorerService   {   [OperationContract]   Stream TransferDocument(Document document);    [OperationContract(AsyncPattern = true)]   IAsyncResult BeginTransferDocument(Document document,   AsyncCallback callback, object asyncState);    Stream EndTransferDocument(IAsyncResult result);   }

注意,在BeginTransferDocument()方法上,必須在OperationContractAttribute中將AsyncPattern屬性值設置為true,因為它的默認值為false。

關于WCF中怎么實現(xiàn)異步調(diào)用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

wcf
AI