2017-03-09 8 views
1

この問題があります。私は2つのWCFサービス - ServiceAServiceBを持っています。どちらのサービスも異なるWindowsサービスのホストであり、net.tcpを介して通信します。クライアントアクセスService AService AではService Bにアクセスします。私が得た問題は、私が二重に通信したいということです。多層WCF二重通信

クライアントがTestAのメソッドをServiceAに呼び出そうとしています。このメソッドはのメソッドTestBを呼び出します。メソッドTestBは長時間の動作を行い、コールバックをクライアントに返すようにServiceAにコールバックを戻します。方法TestAおよびTestBは片道契約です。

communication schema

私はServiceAが戻って、クライアントへのコールバックを発生させているポイントを得ることができます。次に、InvalidCastExceptionでクラッシュし、操作コンテキストでコールバックチャネルを取得しようとしました。

IServiceACallback Callback 
    { 
     get 
     { 
      return OperationContext.Current.GetCallbackChannel<IServiceACallback>(); 
     } 
    } 

私は別のスレッドに属していて、操作コンテキストは単に完了していないためですか? ServiceBからの別のコールバックからコールバックを実行していないときにコールバックをクライアントに戻すことができるからです。多分いくつかのサービス属性でそれを解決できますか?または、私が使用できる通信パターンがありますか?

+0

アーキテクチャが動作するはずです。あなたのような例外は、通常、部分的なメッセージを受け取ったときに発生します。受信コードが各メッセージの終わりをはっきりと知っていることを確認してください。入力バッファに存在するよりも多くのデータを読み込もうとすると、アンダーフローが発生し、例外が生成されます。 – jdweng

+0

invalidCastExceptionを意味しますか? –

+0

はい、InvalidCastExceptionです。 – benderto

答えて

0

わかりました。

コールバックをServiceBからServiceAに上げると、私は別のOperationContextに入っていました。このコンテキストは全く別のスレッド上にあったので、Clientとの接続はなく、代わりにOperationContextの一部がServiceBになっています。

私はOperationContextを指すServiceAのCallbackHandlerに新しいメンバーを追加しました。これには、を使用して、ServiceBの作成中に現在のコンテキストを渡します。このコンテキストは正しいもので、コールバックをClientに戻すために使用できます。私はそのコードが理解できるように願っています。 ServiceBServiceA中の

作成:ServiceA

InstanceContext context = new InstanceContext(new CallbackHandler(OperationContext.Current)); 
ChannelFactory<IService> factory = new DuplexChannelFactory<IServiceB>(context, binding, address); 
IServiceB service = factory.CreateChannel(); 

のCallbackHandler:

public class CallbackHandler : IServiceBCallback 
{ 
    OperationContext _context; 

    public CallbackHandler(OperationContext context) 
    { 
     _context = context; 
    } 

    public void TestProgress(string msg) 
    { 
     IServiceACallback callback = _context.GetCallbackChannel<IServiceACallback>(); 
     callback.TestProgress(msg); 
    } 
} 
関連する問題