2016-02-28 46 views
0

我使用wsHttpBindingInstanceContextMode.PerCall。在服務器端,我需要檢測客戶端是否已正確接收response。如果沒有,我需要清除服務器端的一些東西。爲此,我嘗試使用OperationContext.Current.InstanceContext.ClosedOperationContext.Current.InstanceContext.Faulted。無論我做什麼,發生的事件都不會觸發(超時連接,關閉客戶端,同時仍然接收數據,拔掉電纜)。另外OperationContext.Current.InstanceContext.State總是關閉。WCF PerCall not firing故障事件

如何檢測客戶端未收到請求? 作爲一種替代解決方案,我想如果我在客戶端捕獲錯誤,在服務器端調用清理方法,但這可能會使事情變得複雜,因爲互聯網連接可能會停止一段時間。

+0

我不認爲這是可能的。確認始終從服務器到客戶端。如果您需要從客戶端到服務器的確認,則必須通過調用其他Web服務來完成。 –

回答

0

當客戶端成功調用Close()時,會觸發服務端的通道事件,因爲客戶端出現故障並且超時,服務器端不會觸發通道事件,直到服務器回覆爲止,這非常愚蠢。

解決你的問題,你有三種解決方法:

1如果客戶是你的,使用雙面調用客戶端上的虛擬方法,則該通道將觸發其事件。

2-使用可靠的會話(sessionfull綁定+可靠的會話打開),所以你可以設置「InactivityTimeout」,當KeepAlive消息等infra消息不再來時,它將觸發。我猜InactivityTimeout默認值爲10分鐘,而Windows KeepAlive頻率爲1秒,因此您可以將InactivityTimeout設置爲5秒。

3-使用IIS託管一個http綁定,因此在您的操作中創建一個循環,用於在「System.Web」命名空間中的「HttpContext.CurrentlResponse」中保持檢查「ClientDisconnectedToken.IsCancellationRequested」。