1

'Custom-Username-Password-Validator'を実装するWCFサービスがあります。

サービス自体は、ユーザー名とパスワードをローカルファイルと照合します。

一致するものがない場合は、メッセージとともにFaultExceptionがスローされます。

サービスを同期的に使用すると、正常に動作します。

ASYNCを使用する場合、問題が発生します。

間違った「ユーザー名+パスワード」の資格情報を渡してクライアントを開くと、

'Channel_Faulted()'メソッドに入るサービスからすぐに戻る代わりに、

クライアントスレッドは、タイムアウトがトリガーされるまで待機します。

次に、「TimeoutException」が発生します。

try
{
    client = new MyServiceClient("WSDualHttpBinding_IMyervice");
    client.ClientCredentials.UserName.UserName = "username";
    client.ClientCredentials.UserName.Password = "bad password";
    client.ChannelFactory.Faulted += new EventHandler(ChannelFactory_Faulted);
    client.Open();   // This hangs for 01:00:00 minute

    // Doesn't reach here
    client.DoSomethingCompleted += new EventHandler<DoSomethingEventArgs(client_DoSomethingCompleted);
    client.DoSomethingAsync(param);
}
catch (Exception ex)
{
    // Enters here with a 'TimeoutException' exception
}

クライアントが私が持っている「Faulted」メソッドをトリガーしないのはなぜですか?

「CustomUserNameValidator」の「Validate」メソッド中に「FaultException」を介してサービスを実行しているのに、サービスからの応答を待機するのはなぜですか?

4

2 に答える 2

2

確かに、使用しているコードには、コード行の後に 3 行が欠けているようです。 client.ChannelFactory.Faulted += new EventHandler(ChannelFactory_Faulted);

ただし、このオプションをまだ使用していないため、暗闇で撮影しています。

var local = client.ChannelFactory.CreateChannel();

((IClientChannel)local).Faulted += ChannelFaulted;

local.Open();

さらに良いことに、ここで提供されているサンプルによると、open メソッドは必要ないようです: ChannelFactory

于 2012-07-18T20:46:30.713 に答える
0

個人的に ChannelFactory.Faulted イベント ハンドラーを使用したことはありませんが、考慮すべき投稿を次に示します。

于 2012-07-18T17:57:11.790 に答える