【轉】WCF OpenTimeout, CloseTimeout, SendTimeout, ReceiveTimeout


關於這四個屬性,在MSDN中的解釋有點敷衍了事。
Open/Close/Receive/Send本是HTTP/TCP/SOCKET的概念,Read/Write Operation則是Web Service的概念。

1.OpenTimeout
客戶端與服務端建立連接時,如果超過指定時間都還沒完成,就引發TimeoutException。
在TCP通訊中,服務器必須首先准備好偵聽端口並在該端口上偵聽(Listen),而客戶端則必須首先向服務器發出連接(Connect)指令,服務器端收到后作出接受響應(Accept)后連接成功,此后兩者就可以互發消息了。
在WCF領域中,類似地,Open()表示建立一個Binding。
測試:撥網線。

2.CloseTimeout
與OpenTimeout類似, CloseTimeout用於關閉一個連接時。
一般情況下,客戶端比較隨意,不會在意這個超時異常。“Close()是我發出的,我自己決定何時清理資源。”
在服務器就不同了,她必須對客戶端負責,不能亂來,在收到Close()成功的響應之前,或收到超時異常之前,不能隨意清理與客戶端相關的資源。

3.SendTimeout
客戶端調用的超時,默認1分鍾。每次調用都必須在指定時間內完成,否則將引發TimeoutException。
在TCP通訊中,雙方建立連接后,客戶端如果需要發送消息給服務端,就發送一個數據包給服務器,服務器收到后必須給出一個響應,客戶端收到這個響應后才能宣告發送成功。類似地,服務器也可能主動發送消息給客戶端。這兩個動作,分別對於客戶端和服務器來說,都是發送(Send),而對於另一方來說都是接收(Receive)。
但是,在WCF領域中的SendTimeout中的Send與TCP的Send理念上類似,但是實質上完全不是一回事。SendTimeout中的Send是指客戶端發起調用。
在WCF客戶端,用proxy.InnerChannel.OperationTimeout可以取到SendTimeout的值。(此處,proxy 是自動生成的服務代理類XxxClient的一個實例)
測試:在服務器的調用處理代碼中插入MessageBox.Show(...)或Thread.Sleep(...)。

4.ReceiveTimeout
與SendTimeout同理, ReceiveTimeout中的Receive是指服務器端發起回調(Callback)。只有在雙向通訊綁定時適用,如WSDualHttpBinding, NetTcpBinding, NetNamedPipeBinding, ...
ReceiveTimeout是服務器回調(Callback)的超時,默認10分鍾。每次回調都必須在指定時間內完成,否則將在服務器端引發TimeoutException。
測試:在客戶端的回調處理代碼中插入MessageBox.Show(...)或Thread.Sleep(...)。 

個人理解:SendTimeout是指客戶端發送數據(請求)wcf服務,wcf服務響應(wcf發送回來數據),這兩個加起來的總時間。

ReceiveTimeout跟回調有關,並不是指wcf服務響應(wcf發送回來數據)的時間。

WCF三種操作模式請看【轉】WCF請求應答(Request-Reply)、單向操作(One-Way)、回調操作(Call Back)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM