2011-08-03 10 views
2

WCF接続のチェックに問題があります。私のWCF接続は双方向です。私はクライアントで接続の状態を確認するためにStateプロパティを使用します。 My機能:WCF接続のチェックに関する問題が発生しました

private bool ConnectionIsOpen() 
{ 
    if (m_Service != null && (m_Service.State | CommunicationState.Opened) == CommunicationState.Opened) 
    { 
     return true; 
    } 
    return false; 
} 

私は、接続の状態を確認するために、10秒ごとに実行中のスレッドでサービスを作成します。私はチェックのためにConnectionIsOpen()メソッドを使用します。すべてがWindows XP上で動作しています。ただし、Windows 7で動作しているときに問題があります。

接続を切断するためにネットワークケーブルを抜くと、Windows XPでアプリケーションを実行しているときに接続の状態が異常ですが、Windows 7で動作している場合は、まだ開かれた。

この場合、誰でも接続のオープンを確認する方法を教えてください。ありがとう。

+0

あなたの文がおかしい場合...なぜだけでなく:

は詳しくは、リンクを参照してください! (m_Service = nullの&& m_Service.State == CommunicationState場合。開いている) – c0deNinja

+0

if文が何をしているのかわからない場合は、別のdojoで訓練したいかもしれません。 (私は子供を育てています) "State"変数には、異なる通信状態を適用できます。 Lu Luが関係する唯一のものは、 "Opened"(作成されているかもしれません)の場合です – feathj

+0

'm_Service!= null'の場合、' ConnectionIsOpen() 'は常にtrueを返します。接続状態 – Damith

答えて

0

Windows 7で全く異なる結果を得ているという事実は驚くべきことではありません。マイクロソフトはWindows VistaでTCPスタックを完全に再設計しているため、コアネットワーク機能のXPとは機能が大きく異なります。

まず最初に、wiresharkを使用して実際にワイヤを通過していることを確認します。プラグを引っ張ったときにTCP接続が実際に終了するかどうか確認してください。接続がすぐに戻る場合、Windowsは何らかの接続永続化/バッファリングを行っている可能性があります。

2

私たち自身のシステムでも同様の問題が発生しました。ネットワークケーブルを切断するか、またはクライアントマシンまたはサーバをスリープモードにすることは、チャネル障害を生成しません。

私が知ることから、接続状態は、現在の接続状態ではなく、最後の呼び出し後の接続状態のみを示すようです。現在の状態を知る唯一の方法は、実際にサービスを呼び出すことです。

クライアントがサービスを頻繁に呼び出す必要はありませんが、接続が失われた場合に反応する必要がある場合は、定期的にサービスをポーリングするダミーコールをクライアント側で実装します。ダミーの呼び出しが行われたときに接続が利用できない場合、対処できるチャネルフォルトが発生します。

漁獲量は、あなたは、単にサービスへの次の呼び出しが動作することを保証するためにダミーのコールを使用することはできませんです。

public void SomeMethode() 
{ 
    if (ConnectionIsOpen()) 
    { 
     m_Service.Dummy(); 
     // Connection is lost here 
     m_Service.SomeMethode(); 
    } 
} 

は、この問題を回避するために、我々はシステムを実装している自動的に再実行接続が復元された後にチャネル障害を生成する失敗したサービス呼び出し。

4

これは常にtrue次のようになります。

(m_Service.State | CommunicationState.Opened) == CommunicationState.Opened

例、= 0 m_Service.State:あなたが代わりに&(AND)を使用したい

0 | CommuncationState.Opened == CommuncationState.Opened

2

最良の通信状態を確認する方法をasuredはオープンであるかどうか、以下のようなフォルトが発生したイベントを呼び出すことです:

proxyInstance.InnerChannel.Faulted -= new EventHandler(ProxyChannelFaulted); 

しかし、これはWsHttpBindingようReliableMessagingのサポートしているバインディングでのみ動作します。 WCF Proxy Client taking time to create, any cache or singleton solution for it

おかげで、 ジャイクマール

関連する問題