1

C# で httpwebrequests を使用して Web サーバーからの応答を読み取ろうとしています。次のコードを使用します。

UriBuilder urib = new UriBuilder();
urib.Host = "wikipedia.com";

HttpWebRequest req = WebRequest.CreateHttp(urib.Uri);
req.KeepAlive = false;
req.Host = "wikipedia.com/";
req.Method = "GET";

HttpWebResponse response = (HttpWebResponse) req.GetResponse();
byte[] buffer = new byte[response.ContentLength];
System.IO.Stream stream = response.GetResponseStream();
stream.Read(buffer, 0, buffer.Length);

Console.WriteLine(System.Text.Encoding.ASCII.GetString(buffer, 0, buffer.Length));

コードは確かに正しい量のデータを取得します (バッファの作成に使用された contentlength とコンソール出力の長さを比較しましたが、それらは同じです。私の問題は、応答の最後の 80% 程度が空白であることです。 chars. They are all 0x00. wikipedia.com を含むいくつかのページでこれをテストしたところ、何らかの理由でファイルの途中で途切れてしまいました。

webrequests の使用方法を誤解/誤用したことがありますか、それともここでエラーを見つけることができますか?

4

2 に答える 2

2

この方法を使用してみてください:

public static String GetResponseString(Uri url, CookieContainer cc)
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
    request.Method = WebRequestMethods.Http.Get;
    request.CookieContainer = cc;
    request.AutomaticDecompression = DecompressionMethods.GZip;

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    StreamReader reader = new StreamReader(response.GetResponseStream());

    String responseString = reader.ReadToEnd();

    response.Close();

    return responseString;
}
于 2012-10-31T13:20:54.347 に答える
1

コードにはいくつかの問題があります。

  1. Stream.Readを使用して一度に応答全体を読み取ろうとしていますが、これは設計された目的ではありません。これは、4KB チャンクなどのより最適な読み取りに使用する必要があります。

  2. HTML 応答を ASCII エンコーディングとして読み込んでいます - ページに Unicode 文字が含まれていませんか? 安全のために UTF-8 エンコーディングに固執します (または、代わりContent-Typeに応答のヘッダーを読み取ります)。

バイトストリームから文字を読み取る場合 (これresponseは本質的にはあなたのものです)、推奨されるアプローチはStreamReaderを使用することです。より具体的には、ストリーム全体を一度に読み取りたい場合は、StreamReader.ReadToEndを使用します。

コードは次のように短縮できます。

HttpWebRequest req = WebRequest.CreateHttp(new Uri("http://wikipedia.org"));
req.Method = WebRequestMethods.Http.Get;
using (var response = (HttpWebResponse)req.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
    Console.WriteLine(reader.ReadToEnd());
}
于 2012-10-31T14:10:03.837 に答える