小さなクライアント/サーバー アプリケーションがあります。クライアントがサーバーを制御できるようにするために、手動でコーディングされた TCP 接続を使用していましたが、今ではそれを WCF に変換しました。これにより、大量のコードを節約できましたが、修正する必要のあるまったく新しい一連の問題も発生しました...
最新の問題は、しばらくすると、サーバーがクライアントを切断することです。どんな状況であっても、私はこれが決して起こらないことを望んでいます。現在、クライアントは実行の約 4 分の 1 を達成した後、サーバーが接続を切断したために爆発します。私はこれを止める必要があります。
問題を再現する単純な WCF クライアント/サーバーのペアを作成することができました。クライアントがメソッドを呼び出し、15 分間待ってから 2 番目のメソッドを呼び出すと、2 番目の呼び出しで例外がスローされ、ソケットが閉じられたことについて何かがバブリングされるようです。遅延を減らすと、すべて正常に動作します。
私はどこかで別の答えを読んで、その設定ReceiveTimeout
がこれを修正するはずです。ただし、試してみたところ、これは .NET でのみ問題を解決します。Mono で実行すると、それでも壊れます。Mono は実際のターゲット プラットフォームであるため、これはあまり役に立ちません。
(SSH について考えてみてください。しばらく何も入力しなかったからといって、SSH サーバーから切断されるのは望ましくありません。おそらく、実行時間の長いシェル コマンドか何かを発行したのでしょう...サーバーが何も受信していないという理由だけで、あなたからのデータは、何も起こっていないという意味ではありません! それは確かに、あなたの接続が切断されるべきだという意味ではありません...)
すべてのコードは C# です。サーバーは、自己ホスティング コンソール アプリです。クライアントはコンソール アプリでもあります。すべての設定はコードです。バインドはNetTcpBinding
デフォルト設定です。
クライアントが正常に完了できるようにするにはどうすればよいですか?
いくつかのアイデアがありますが、どれもきれいではありません。
- ハートビート メッセージを手動で送信します。(うん!)
- 切断を検出し、自動的に再接続しますか? (繰り返しますが、うんざりです。)
- 「信頼モード」をオンにします。(サーバーは意図的にセッションを終了するので、これは役に立たないと思います。)
- メソッド呼び出しごとに 1 つの接続を作成します。(かなりのコードになります...)
- WCF の使用を停止しますか?