Web アプリから使用している WCF サービスがあります。使用しているクライアントは、Visual Studio の [サービス参照の追加] オプションを使用して生成されました。これは Web アプリであり、アプリの性質上、セッションは比較的短いものになる可能性が高いため、ユーザーがログインしたときにクライアントのインスタンスを作成し、セッションが終了するまでそれを保持することにしました。セッションが終了したときにそれを破棄します。
これは私の質問につながります.Faulted状態に入るクライアントのチャネルを処理する最善の方法を決定しようとしています. いくつかを検索した後、これを思いつきました:
if(client.State = CommuncationState.Faulted)
{
client = new Client();
}
try
{
client.SomeMethod();
}
catch //specific exceptions left out for brevity
{
//logging or whatever we decide to do
throw;
}
ただし、これは機能しません。少なくとも私たちの場合、サービスがダウンしていても、Open
実際にそれを使用して呼び出しを行うまで、クライアントは状態を表示し、その時点でFaulted
状態に入ります。 .
したがって、これにより、他のことを行う必要があります。私たちが思いついた別のオプションは次のとおりです。
try
{
client.SomeMethod();
}
catch
{
if(client.State == CommunicationState.Faulted)
{
//we know we're faulted, try it again
client = new Client();
try
{
client.SomeMethod();
}
catch
{
throw;
}
}
//handle other exceptions
}
しかし、それはにおいがします。明らかに、新しいクライアントを使用し、呼び出しごとに破棄することで、これを回避できます。それは不必要に思えますが、それが正しい方法であれば、それが私たちが選ぶものだと思います. では、クライアントが障害状態にあるかどうかを判断し、それに対して何かを行う最善の方法は何でしょうか? 通話ごとに新しいクライアントを取得するだけでよいのでしょうか?
もう 1 つ注意してください。クライアントのインスタンス化と、このすべてのチェックと処理は、クライアントのラッパー クラスで行われます。意図したとおりにこれを行うと、アプリ自体に対して透過的になります。呼び出しを行い、それらからの例外を処理するために特別なコードは必要ありません。