2012-07-16 19 views
3

我正在編程Azure上的WCF服務。在執行合同操作期間調用回調

在我的服務中,我需要在執行合同操作期間調用回調。當我嘗試這樣做時,會拋出異常並且客戶端將被鎖定。我認爲這是由於合約操作打開通道引起的,調用當前通道的回調會鎖定線程,對嗎?我想爲這種情況獲得解決方案。

這裏是超時異常消息:

此請求操作發送到 的net.tcp://127.255.0.0:8000/MytestWCFService沒有所配置的超時時間內收到答覆 (00:00 :59.9889989)。分配給此操作的時間 可能是更長時間的一部分。此 可能是因爲該服務仍在處理該操作或 ,因爲該服務無法發送答覆消息。請 考慮增加操作超時(通過將 頻道/代理投射到IContextChannel並設置OperationTimeout 屬性),並確保該服務能夠連接到 客戶端。

編輯:代碼示例

[ServiceContract(Namespace="testnamespace")] 
public interface ICallback 
{ 
    [OperationContract(IsOneWay=true)] 
    void Callbackmethod(); 
} 

然後,我在服務端實現IContract:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, 
    ConcurrencyMode=ConcurrencyMode.Reentrant, 
    AddressFilterMode=AddressFilterMode.Any)] 
public class WCFService : IContract 
{  
    public int Add(int a, int b) 
    { 
     int result = a + b; 
     ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>(); 
     callback.Callbackmethod(); 
     return result; 
    } 
} 

我打電話回來電流通道,它是一個雙工通道。

回答

8

如果您的操作和回調是雙向的,那麼您很可能會遇到死鎖問題。與此屬性標記您的服務類:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] 
public class MyService : IMyServiceContract { ... } 

編輯:

而且在WPF應用程序這增加了實施的回調實現的:

[CallbackBehavior(UseSynchronizationContext = false)] 
+0

嗨拉吉斯拉夫,我已經試過了。我也嘗試了三種解決方案:http://msdn.microsoft.com/en-us/magazine/cc163537.aspx#S4。但是,它似乎不適合我。我的情況是,如果我使用服務合約方法回撥,它會死鎖。請看我的編輯來查看代碼示例。 – 2012-07-17 01:39:44

+0

你的客戶端應用程序是什麼? – 2012-07-17 08:05:05

+0

我的客戶端應用程序沒有做WPF應用程序。像這樣的東西。公共部分類MainWindow:Window,ICallback {public void Callbackmethod(){}; } – 2012-07-17 09:55:35

相關問題