0

インターネットから大量のHTMLファイルをダウンロードし、HttpWebRequestを使用して取得しようとしています。

しかし、私が使用するとき

WebRequest.Create( " http://www.stackoverflow.com/ "); WebRequest.GetResponse();

HttpWebResponse.ContentLengthは常に-1です。これらのページのダウンロードの進行状況を表示する必要があります。既存のVB6バージョンでは、inetコントロールを使用しており、進行状況が適切に報告されます。

私のコードはこれに非常に似ています:

http://www.geekpedia.com/tutorial179_Creating-a-download-manager-in-Csharp.html

(つまり、「ダウンロード」メソッド)

何が間違っているのか、それが正常かどうかはわかりません。WebサーバーからContent-Lengthヘッダーが送信されていません。この場合、どのように進捗状況を計算しますか?

ありがとう、

4

3 に答える 3

1

Web サーバーがコンテンツの長さを送信しない場合、あとどれくらいのデータがあるかを知る方法がないため、基本的にはどれくらいの距離にあるかを知ることは不可能です。

サーバーは動的にデータを生成している可能性がありますが、 (データの最初の部分を取得したときに) 送信する必要があるデータの量がまだわかりません。

(完全なダウンロード サイズの割合として) 進行状況を示していると主張するものはすべて、嘘をついているか、フル サイズを提供する別の方法でデータをダウンロードしています。もちろん、複数のファイルをダウンロードしている場合は、ダウンロードを完了したファイルの数と、まだダウンロードしなければならないファイルの数をいつでも言うことができます (ただし、この場合でも、ダウンロードしている場合は後者の数がわからない場合があります)。クローラー スタイルのアプリ)。

一般的なアプローチの 1 つは、「進行中」であることを示すプログレス バーを表示することですが、ダウンロードの残り時間を推測しようとはしません。

于 2009-06-07T07:36:40.517 に答える
1

これは、試すことができるWebClientを使用したサンプルです。

class Program
{
    static void Main(string[] args)
    {
        var client = new WebClient();
        client.DownloadProgressChanged += (sender, e) =>
        {
            Console.WriteLine("{0}% completed", e.ProgressPercentage);
        };
        client.DownloadStringCompleted += (sender, e) =>
        {
            // e.Result contains downloaded string
            Console.WriteLine("finished downloading...");
        };
        client.DownloadStringAsync(new Uri("http://www.stackoverflow.com"));
        Console.ReadKey();
    }
}

WinForms アプリケーションで使用する場合は、UI スレッドで実行されないイベント ハンドラーからInvokeRequired / Invokeパターンを呼び出すようにしてください。

于 2009-06-07T07:48:39.527 に答える
0

リンクされた記事の Download() メソッドのコードは、クラスのプライベート メンバーに依存しているため、

WebRequest.Create("http://www.stackoverflow.com");

コンパイルされる可能性がありますが、実際にはクラスWebRequest のメソッドを呼び出してから、リクエストが実際に保存されている結果を破棄しています。ラインの頃には

WebRequest.GetResponse();

が呼び出されると、コードは Create() からの応答をすべて忘れてしまいます。(C# では大文字と小文字が区別されるため、WebRequest と webRequest は同じものではありません。また、WebRequest クラスのインスタンスに webRequest という名前を付けるのは非常に一般的です。)

だから線を入れてみてください

プライベート HttpWebRequest webRequest;
プライベート HttpWebResponse webResponse;

WebRequest および WebResponse オブジェクトのインスタンスとしてクラスの上部にあるメソッドの外側。

于 2009-06-07T07:30:51.887 に答える