0

私はメッセージバスを介してWCFトランスポートを拡張しています.request-replyモードはうまく機能します。入出力モードを実装しているときに問題が発生しました。状況は次のとおりです。

1、InputChannel と OutputChannel を作成し、TransportBindingElement がそれらを返すようにしました。

2、2 つのメソッドを持つコントラクト インターフェイスを作成しました。IsOneWay = true という属性があり、それが Method1 だとしましょう。もう 1 つは Method2 という名前ではありませんでした。

3. Method1 を呼び出すと、InputChannel と OutputChannel ではなく、RequestChannel と ReplyChannel が返されたことがわかります。また、応答チャネルは WCF メッセージを受信し、RequestContext を返すことができます。しかし、サービス コードは呼び出されませんでした。

4, Method1 で IsOneWay = false を設定すると、うまく機能します。

4, Method2 を呼び出すと、うまく動作します。

5、IsOneWay = true のメソッドが 1 つしかない別のサービス コントラクトを作成しました。このメソッドを呼び出すと、WCF は InputChannel と OutputChannel を提供し、うまく機能します (サービス コードが実行されました)。

私の質問は次のとおりです。1、 IsOneWay = true メソッドと IsOneWay = false メソッドを使用するサービスがある場合、WCF は要求応答チャネルを提供しますが、それは正しいですか?

2. メソッドは IsOneWay = true でしたが、同じサービス コントラクトに IsOneWay = false メソッドも含まれているサービス呼び出しを処理するにはどうすればよいですか?

ところで、IsOneWay = true メソッドへのリクエスト メッセージでは、MessageID が NULL であることに気付きました。リクエスト メッセージに新しい ID を設定しましたが、うまくいきませんでした。サービス コードはまだ呼び出されていません。

4

2 に答える 2

2

ようやく理由と解決策がわかりました。

WCF は、呼び出したサービス操作ではなく、サービス コントラクト全体に基づいて最適なチャネル形状を選択します。したがって、IsOneWay = true と IsOneWay = false のメソッドが混在するサービス コントラクトがある場合、WCF は、可能なすべての呼び出しをカバーできるため、要求/応答モードを使用します。

次に、WCF が要求/応答モードを使用して一方向メッセージを処理すると、応答メッセージは null になります。つまり、RequestContext.Reply メソッドでは、パラメーターからの受信メッセージは null です。したがって、通常の要求応答モードのように処理することはできません (そのモードでは、応答メッセージは null であってはなりません)。ここで、サーバー側のプロセスを続行させるために、空のメッセージを基礎となるトランスポートに送信する必要があります。

クライアント側では、RequestChannel.Request メソッドで、この場合 RequestContext.Reply から送信した空のメッセージも処理する必要があります。null を返すだけで問題ありません。

于 2012-03-21T07:31:16.410 に答える
1

私の意見では、すでに機能しているソリューションがあります。一方向の操作を要求応答操作から別のサービス契約に分離します。

操作間の通信パターンの違いは、技術的に可能かどうかに関係なく、これらの操作を同じサービスで一緒に公開するべきではないことを示唆しています。

アップデート

あなたのコメントから、同様の種類の転送サービスを実装しようとしているように聞こえますか? もしそうなら、あなたはこれを読みましたか? https://dzone.com/articles/single-wcf-generic-endpoint-on

于 2012-02-20T09:07:45.420 に答える