2010-12-17 10 views
2

SilverlightアプリケーションとWCF Webサービスとの間のデュプレックスNet.TCP接続は、一時的なネットワークの問題や、クラッシュや再起動、そのようなもの。それが起こったら、私はこれをキャッチして、接続を再開したいと思います。聞こえます。 Silverlightで障害が発生したDuplexClientBase WCFプロキシを閉じて再度開く

private void Channel_Faulted(object sender, EventArgs e) 
{ 
    client.CloseCompleted += (sender, e) => 
     { 
      if (e.Error == null) 
       client = CreateClient(); 
      else 
       Debug.WriteLine(e.Error.ToString()); 
     }; 
    client.CloseAsync(); 
} 

しかし、私はCloseCompletedハンドラでe.Errorは、この例外があることをしようとすると:あなたはこのような何かを行うことができるはず

通信オブジェクト、System.ServiceModel.Channelsを。 ServiceChannelは、フォルト状態にあるため通信に使用できません。

私には、この同じテーマのバリエーションの全体の束を試してみた:

  • が故障した後、接続を閉じて、それを再作成されていません。
  • client.InnerChannel.Close()および/またはclient.ChannelFactory.Close()を手動で呼び出します。
  • client.InnerChannel.Dispose()および/またはclient.ChannelFactory.Dispose()を手動で呼び出します。
  • 私が今忘れてしまったことがたくさんあります。

これらの戦略は、さまざまなエラーをもたらしてきたが、のどれも言及した非Silverlightのソリューションの一種、たとえば、hereまたはhere(通常のCLRのアプリケーションのためのが、すべてではなく、シルバー)を含め、正しく働いていません。確かにこれはかなり簡単なことですが、明らかにチャンネルのキャッシュが途中にあります。私は何が欠けていますか? Silverlightでこれを行う正しい方法は何ですか?これがSilverlightのバグであれば、適切な回避策はありますか?

答えて

1

説明できない方法で動作しているように見えるほとんどのものと同様に、問題は私のせいでした。私が作業している実際のコードは、私が上に掲げた単純化されたバージョンよりもはるかに複雑です(驚くことではありません、私は願っています)。そして、それは私の実際のコードでは、私がテストしていた特定のコードパスで、この線路の等価が呼び出されなかっされなかったことが判明した:つまり

client = CreateClient(); 

は、クライアントが実際に後に再作成されていませんでした私が実行していたエラーは主に古いインスタンスを再利用しようとしたことが原因です。大騒ぎのために申し訳ありません。

関連する問題