HttpWebRequest を使用して HTML ページをダウンロードすると、ContentLength が -1 として返されます。
-
12-09-2019 - |
質問
インターネットから大量の 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ヘッダーがないのかわかりません。この場合、進捗状況をどのように把握すればよいでしょうか?
ありがとう、
解決
これを使用したサンプルは次のとおりです ウェブクライアント あなたは試してみることができます:
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 スレッドで実行されないため、パターンをイベント ハンドラーから取得します。
他のヒント
Webサーバが、それはあなたがどこまでそれを通して知ることは基本的に不可能ですので、そこにどのように多くのデータを知る方法はありません、コンテンツ長を送信しない場合ます。
ヘック、サーバがデータを動的に生成することができるとの(あなたがデータの最初の部分を取得するときに)まだのそれが送信する必要がありますどのくらいのより多くのデータを知りません。
を何も主張は(完全なダウンロードサイズの割合として)進捗状況を示すべきでは嘘をついているか、を別の方法でデータをダウンロードしているのそれらを与えるんフルサイズ。複数のファイルをダウンロードしている場合はもちろん、あなたは常にあなたがダウンロードが終了しましたどのように多くのファイルとあなたがやっている場合でも、このような場合には後者の数は知られていないかもしれないが、あなたはまだ(ダウンロードするには持っているどのように多くの言うことができますクローラ・スタイルアプリ)。
一つの共通のアプローチは、「私は進歩を作ってるんだ」が、ダウンロードするには残っているどのくらいの推測しようとしません示す進行状況バーを表示することであることに注意してください。
リンク先の記事でダウンロード()メソッドのコードは、
もののので、クラスのprivateメンバーに依存していますWebRequest.Create("http://www.stackoverflow.com");
それは実際にその要求が実際に格納されている場所で結果を、廃棄、<私>クラスのWebRequestクラスのメソッドを呼び出している、コンパイルされる場合があります。時間によってライン
WebRequest.GetResponse();
と呼ばれ、コードの作成からの応答についてのすべてを忘れています()。 (WebRequestクラスおよびWebRequestクラスは同じものではないので、C#は、大文字と小文字が区別され;そして、それはWebRequestクラスのインスタンスに名前WebRequestクラスを与えるために、非常に従来'S)
だから、ラインを入れてみてください。
private HttpWebRequest webRequest; private HttpWebResponse webResponse;
WebRequestクラスとにWebResponseオブジェクトのインスタンスとしてクラスの上部の方法外部。