我想要做的是有多個客戶端註冊的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);
有人知道爲什麼發生這種情況或有任何線索,我怎麼可能繼續嘗試解決這個問題?
我的服務合同確實需要一個CallBackContract。我讀了你鏈接的文章。我將ConcurencyMode更改爲可重入,但它對手頭的問題沒有任何影響。文章還提到了我目前正在調查的另一個解決方案。 – Gilles 2011-03-03 13:55:49
您是否已將'ServiceBehavior'和'CallbackBehavior'指定爲'ConcurrencyMode.Reentrant'? – PaulF 2011-03-03 16:07:59