我有一個相當直接的WCF服務,爲一堆智能客戶端執行單向文件同步。我注意到,在通話過程中出現網絡或服務中斷時,客戶端將停止與服務器通信,直到整個應用程序重新啓動。WCF客戶端掛起服務中斷
該服務使用BasicHttpBinding
運行,並使用IIS6(.svc頁面),使用transferMode="Streamed"
和messageEncoding="Mtom"
。該服務被配置爲使用默認的InstanceContextMode(我認爲它是Per Call?)和ConcurrencyMode = Single。它使用默認的限制行爲,但我處於沒有其他人正在擊中的獨立測試環境中。
客戶端是Windows服務。我使用這個ServiceProxyHelper確保連接是Close()
'd或Abort()
'd當Dispose()
'd,雖然沒有會話,所以我不認爲這甚至很重要。發生錯誤時,客戶端對象被丟棄,然後超出範圍。在檢測到異常之後,服務會等待一段時間,然後創建一個新的客戶端對象並再次嘗試。所以它應該從失敗中恢復,但由於某種原因,後續對該服務的所有調用都會失敗。
我可以通過啓動客戶端來可靠地重現這一點,允許它傳輸幾個文件,然後重新設置服務器。首先,客戶端通常顯示「服務太忙」錯誤(映射到在應用程序重新啓動期間獲得的IIS 503錯誤)。之後,所有後續的服務呼叫超時。據我所知,這些呼叫甚至沒有被客戶嘗試。我啓用了跟蹤,看到的是:超時錯誤,後面跟着一個「無法通過HTTP發送請求消息」的警告,接着是另一個超時錯誤。
瘋狂的事情是,當我配置客戶端使用Fiddler(端口8888)作爲app.config中的代理時,一切都按需要工作。所以不知何故Fiddler作爲代理正在關閉或終結某種WCF本身不存在的連接。
想法?
編輯2009-10-30 8:54 PM:將服務屬性更改爲:InstanceContextMode = Single和ConcurrencyMode = Multiple。沒有不同。
在'WebRequest'中有關於100繼續功能的已知錯誤。 http://regis.decamps.info/blog/2010/12/c-bug-in-webrequest/ – rds 2011-01-03 18:15:51