2011-03-02 41 views
1

我想要做的是有多個客戶端註冊的wcf雙工服務。當客戶端調用服務時,其他客戶端會收到通知。爲什麼我的Wcf Duplex服務在首次調用服務之後會進入故障狀態?

現在,我有一個調用wcf雙工服務的Silverlight應用程序。在第一次通話中,一切工作正常,包括雙工通信。在第二次調用服務我得到一個:

The communication object, System.ServiceModel.Channels.ClientPollingDuplexSessionChannel, cannot be used for communication because it is in the Faulted state. 

我的服務有2種不同的方法; RegisterClient和ReassignOwner。如果我以任何順序調用兩次相同的方法或同時調用兩次方法,我仍然收到此錯誤。

經過對這個問題的研究,我認爲這可能是一個超時問題。我檢查了什麼是默認的超時值,它是10分鐘。我在2-3分鐘的時間內打了兩個電話。我還增加了不活動超時和接收超時到4小時,以確保我仍然遇到這個問題。

接下來,我想我的服務可能會產生一個異常,這將導致客戶端進入故障狀態。爲了測試這個,我在我的服務的2個方法中放入了try/catch語句,並以調試模式運行程序。我沒有發現任何異常。我也試着從這兩個方法中註釋掉所有的代碼(所以不會產生異常),只是調用這兩個空方法,我仍然有例外。

通過閱讀其他相關的帖子,所以我決定嘗試WCF跟蹤。我在我的web.config中啓用它,並將開關值設置爲警告。我得到2個警告:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, AutomaticSessionShutdown = false)] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class NotificationService : BaseService, INotificationDuplexService 

在我的服務合同,我的方法都具有以下屬性:

Description Faulted System.ServiceModel.Channels.ServicePollingDuplexSessionChannel 
Description Faulted System.ServiceModel.Channels.ServiceChannel 

下面是我的服務是在.svc.cs文件後面的代碼定義

[OperationContract(AsyncPattern = true, IsOneWay = true, 
        Action = "http://www.abc.org/NotificationDuplex/INotificationDuplexService/MethodName")] 

我的方法都是以異步方式實現的,有Begin和End方法。

這是我如何調用我的方法

base.InvokeAsync(this.onBeginRegisterClientDelegate, new object[] { 
        id}, this.onEndRegisterClientDelegate, this.onRegisterClientCompletedDelegate, userState); 

有人知道爲什麼發生這種情況或有任何線索,我怎麼可能繼續嘗試解決這個問題?

回答

2

您的ServiceContract是否需要CallbackContract?如果是這樣,我建議你閱讀關於回調重入here - 這是一個很好的描述WCF如何主動錯誤的通信渠道,以防止當你使用回調時發生死鎖,以及你應該怎麼做以防止它。

+0

我的服務合同確實需要一個CallBackContract。我讀了你鏈接的文章。我將ConcurencyMode更改爲可重入,但它對手頭的問題沒有任何影響。文章還提到了我目前正在調查的另一個解決方案。 – Gilles 2011-03-03 13:55:49

+0

您是否已將'ServiceBehavior'和'CallbackBehavior'指定爲'ConcurrencyMode.Reentrant'? – PaulF 2011-03-03 16:07:59

1

我見過的另一個解決方案是我自己實現的,它是建立一個「心跳」。我將我的配置設置爲MultipleMessagesPerPoll,並且該服務保持正常運行,因爲我有客戶端至少每9秒鐘ping一次服務器。這似乎有點神奇 - 9秒後通道超時並進入故障狀態。只需設置一個線程來ping服務(使用ping或其他方法),服務就可以用「pong」迴應客戶端。

同意此問題在Chrome或其他瀏覽器上似乎不成問題。