質問: WCFサービスアプリケーションを作成し、HTTPSで「信頼できるセッション(reliableSession)」を用いて接続できるように設定しております。 次にクライアントプログラムをWPFで作成し、上記WCFサービスへのサービス参照を作成して通信を行っています。基本的にはそれで通信できているのですが、サーバ側の応答に時間がかかる場合、タイムアウト時間(1分間に設定しております)を待たずに同じリクエストを再送しているようなのです。 Fiddler4で確認したのですが、サーバへ要求を投げてから応答もなく、タイムアウト時間にもなっていない時にもう一度同じ要求を投げています。またしばらく同じ状況が続くともう一度要求が投げられる、というようなことが繰り返され、最初の要求から1分後に、それらの要求がほぼ同時にタイムアウトとなります。 クライアントプログラム自体には、特にタイムアウト時に同じ要求を繰り返すようなコードは組んでおりません。再送が起こる間隔は、3秒程度から20秒以上とばらつきがあります。 渡す引数によってサーバの応答時間に開きがあるようなメソッドを呼び出した際は、応答時間が短いときにはこの現象は起こらず、応答時間が長いとこの現象が起きてしまいます。 この現象を回避することは可能でしょうか? もしこの再送のたびに、WCFサービスの処理がされているならサーバの負荷増大の原因になるので回避したいのですが。 WCFサービスの処理内(*.svc.csのメソッド内)にログ出力を仕込んで検証したところ、再送が起こってもWCFサービスの処理は一回しか実行されていないように見えました。何度も同じ処理がサーバ側で発生しないという確証があれば、無理にこの現象を回避しなくても良いとは考えているのですが、確証が持てないので回避できるものなら回避したいと考えています。
回答: Proxyの仕事ですね。 > > HTTP を使用しているとき、要求側に未確認応答を検出させるため、応答側は簡単なトリックを使用します。要求メッセージに対する確認通知を、常に応答と共に送信するのです。その結果、応答が失われた場合に要求側は確認通知を受け取ることができないので、同じ要求を再送信します。実際には元の要求が応答側に到着しており、既に処理されている場合でも同様です。応答側はメッセージのシーケンス番号を調べ、再送信された要求であることがわかると、そのメッセージを再処理する代わりに、メッセージ > > キャッシュ内からキャッシュした応答を返します。これは最初に受け取った要求に対応して生成されていた応答です。 > > >