Webアプリケーションから消費しているWCFサービスがあります。使用しているクライアントは、Visual Studioの[サービス参照の追加]オプションを使用して生成されました。それはWebアプリケーションなので、アプリケーションの性質上、セッションが比較的短くなる可能性があるため、ユーザーがログインしてセッションの終了時にそれを保持すると、クライアントのインスタンスを作成することにしましたセッションが終了したときにその処理を処理します。フォールト状態に入った永続WCFクライアントの処理
これは私の疑問に繋がります。クライアントのチャンネルをフォールト状態にするのに最適な方法を決定しようとしています。我々は、このを作ってみたいくつかの周りを検索した後、:
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
}
しかし、それはにおいがします。明らかに、新しいクライアントを使用し、すべての呼び出しでそれを廃棄することで、これを回避できます。それは不必要だと思われますが、それが正しいとすれば、それが私たちが選ぶだろうと思います。だから、クライアントがフォールト状態にあるのかどうかを判断し、それについて何かしていることをうまく処理する最良の方法は何ですか?私たちは実際にすべてのコールに対して新しいクライアントを取得する必要がありますか?
クライアントのインスタンス化とすべてのチェックと処理は、クライアントのラッパークラスで行われます。私たちが意図したようにこれを行うと、アプリケーション自体は透過的です。呼び出しを行い、そこから例外を処理するには特別なコードは必要ありません。
クライアントが障害状態になる原因は何ですか?私はいつもWCFサービスが正常に障害を返すようにしてきましたが、クライアントはそのビジネスについて継続することができます。サーバーが応答していないか、何か? – Tridus
この場合、ASP.NETメンバーシップを使用しており、 "userIsOnlineTimeWindow"属性を超過して実行しました。明らかにそのような場合は、ユーザーをログインページにリダイレクトするだけですが、フォールト状態になる可能性のある他の状況に備えているかどうかを確認しようとしています。 – Zannjaminderson