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;   
   }   
}   

現在のチャネルでコールバックしています。これはデュプレックス チャネルです。

4

1 に答える 1

8

操作とコールバックが双方向の場合、おそらくデッドロックの問題が発生しています。サービス クラスを次の属性でマークします。

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

編集:

また、WPF アプリケーションで、これをコールバック実装の実装に追加します。

[CallbackBehavior(UseSynchronizationContext = false)]
于 2012-07-16T09:36:34.280 に答える