0

私は WCF を学んでおり、本で学んだことからさまざまな例を試しています。

次のような簡単なサービス設定があります。

[ServiceContract]
interface MyService
{
    [OperationContract(IsOneWay = true)]
    void Throws();
}

私のクライアント コードは ChannelFactory クラスを使用してプロキシを作成しています。

var baseTcpAddress = new Uri("net.tcp://localhost/hello");

var tcpBinding = new NetTcpBinding();

// Create client channel.
ChannelFactory<ITestService> factory = new ChannelFactory<ITestService>(tcpBinding, new EndpointAddress(baseTcpAddress));
var channel = factory.CreateChannel();

var commObject = channel as ICommunicationObject;

commObject.Faulted += commObject_Faulted;
commObject.Closed += commObject_Closed;

このメソッドが呼び出されると、ハンドルされない例外 (FaultException から派生したものではない) がスローされ、同じプロキシを使用する後続の呼び出しで例外がスローされ、チャネルに障害が発生します。

問題は、プロキシ チャネルのFaultedイベントに登録されていることですが、プロキシにアクセスしようとした場合にのみ通知が届きません。

私の質問は、どのようにしてクライアントが障害のあるプロキシから自身を保護できるかということです。プロキシは、クライアントに試して使用させるのではなく、使用できないことをクライアントに通知するべきではありませんか?

4

1 に答える 1

0

「問題」は、メソッドが一方通行であることです。ある程度、これはファイアアンドフォーゲット(セッションを脇に置く)操作であり、例外がスローされた場合、クライアントはそれを知る方法がありません。クライアントの観点からは、要求は反対側で受信されるとすぐに成功します (受け取られて処理されません)。

最初は一方向ではなく同じことを試すことをお勧めします。

また、失敗したイベントをサブスクライブするために使用したコードを投稿してください。どのホスティングを使用していますか? どのようにプロキシを作成していますか? (チャンネルファクトリー?)

ServiceHost の Faulted イベント (ある場合) をサブスクライブして、これが発生するかどうかを確認できます。

また、プロキシの状態を問い合わせてみましたか?

また、SOのこの質問を参照してください。そこで答えが得られると思います。

乾杯

于 2012-08-14T18:07:45.970 に答える