6

System.Net.WebClientそれぞれ3〜15MBの範囲のいくつかのファイルをダウンロードするために使用する単純なC#システムトレイアプリがあります。WebClient は HTTPS 経由でダウンロードしており、ダウンロード元のサーバーを制御しています。ファイルはダイレクト パス経由で Web ブラウザーから正常にダウンロードされ、WebClient は.DownloadString()このサーバーからメソッドを完全に処理 (つまり、短いテキスト ファイルを文字列にダウンロード) できます。

奇妙なことに、24 時間以内に 3 つのことが起こりました。私はある種のマシン固有の構成またはキャッシングを疑っていWebClientますが、推測を危険にさらす可能性のある の内部について他の人が何を知っているのだろうかと思います。

  1. 開発マシン #1 は、このコードをデバッグ モードで実行し、ファイル (MegabyteFile1 および MegabyteFile2 と呼びます) を金曜日までダウンロードすることに問題はありませんでした。ダウンロードには最大で 3 ~ 5 秒かかりました。
  2. 突然、金曜日の午後、開発マシン #1 が MegabyteFile1 のダウンロードを停止しました。動作は次のとおりです。
    • WebClient.DownloadFile()無期限にハングする
    • のファイルtargetFileFullPathは作成されますが、0 バイトです。
    • メインスレッドは無期限にブロックされます。
    • アプリケーションを終了する必要があります。
  3. 同一の OS 構成を持つ他の開発マシンは、コードを正常に実行し、正常にダウンロードします。
  4. DevelopmentMachine1 で Chrome または Internet Explorer を使用してこれらのファイルを手動でダウンロードすると、クエリ パラメーターの有無にかかわらず問題なく動作します。
  5. Fiddler が実行されている場合 (Fiddler HTTPS 証明書の詐欺師がインストールされていなくても)、DevelopmentMachine1はファイルをダウンロードします。つまり、このマシンでワイヤーを盗聴しようとすると、すべて正常に動作します。

ダウンロード コードの関連セクションは次のとおりです。

using (WebClient client2 = new WebClient())
{
  client2.DownloadFile(String.Format("{0}?{1}", thePath, queryParams), targetFileFullPath);
}

このボックスで通常のシステム管理者のことを試しました。再起動し、Internet Explorer のキャッシュと一時ディレクトリをクリアするなどです。

ハングしたダウンロードに対処するための戦略を変更する必要があることはわかっています。現実の世界でダウンロードがハングすることは確実だからです。しかし、この特定の障害モードの原因を理解していない場合、すべてのまれなケースを考える自信はありません。WebClientこのマシンが「特別」である理由を推測する危険を冒すために、何が起こっているのかを十分に知っている人はいますか?

ありがとう!-ジェームズ

4

4 に答える 4

4

何時間も画面に頭をぶつけ、WireShark との快適なセッションとFiddlerとのいくつかの個別のセッションの、答えを見つけました。他の人が同じ問題を抱えている場合に備えて、ここで共有します。

オブジェクトが適切に d されていない場合、prior を使用するとこの動作が発生することが判明しました。複数またはオブジェクトを作成するかどうかは関係ありません。それらはすべて失敗します。HttpWebRequestWebResponse.Close()WebClientHttpWebRequest

手がかりは、次の観察から得られました。WireShark で TCP のやり取りを監視すると、2 番目の要求 (失敗していた要求) に対してサーバーに何も送信されていないことが明らかになりました。Fiddler の実行中にこれが機能したのに、そうでないときは機能しなかったのはなぜですか? 私は、Fiddler が「いい感じに」接続を強制的に閉じているのではないかと考えています。

于 2013-08-12T23:39:10.147 に答える