6

次のコードを使用して、Web ページをバイト配列にダウンロードし、Response.Write で印刷します。

WebClient client = new WebClient();

byte[] data = client.DownloadData(requestUri);

  /***********        Init response headers    ********/
  WebHeaderCollection responseHeaders = client.ResponseHeaders;
  for (int i = 0; i < responseHeaders.Count; i++)
       {
            Response.Headers.Add(responseHeaders.GetKey(i), responseHeaders[i]);
       }
  /***************************************************/

応答ヘッダーに加えて、要求ヘッダーも追加する必要があります。私は次のコードでそれをやろうとします:

  /***********        Init request headers    ********/
  NameValueCollection requestHeaders = Request.Headers;
  foreach (string key in requestHeaders)
  {
      client.Headers.Add(key, requestHeaders[key]);
  }
  /***************************************************/

ただし、機能せず、次の例外が発生します。

このヘッダーは、適切なプロパティを使用して変更する必要があります。パラメータ名: name

誰でもこれで私を助けることができますか?WebClientでリクエストヘッダーを追加する正しい方法は何ですか?

ありがとうございました。

4

2 に答える 2

5

ヘッダーコレクションは、次のmsdnページで説明されているように、可能なヘッダーの一部を「保護」します。http: //msdn.microsoft.com/en-us/library/system.net.webclient.headers.aspx

そのページはあなたが必要とするすべての答えを与えるようですが、重要な部分を引用しています:

一部の一般的なヘッダーは制限されていると見なされ、システムによって保護されており、WebHeaderCollectionオブジェクトで設定または変更することはできません。WebClientオブジェクトに関連付けられたWebHeaderCollectionオブジェクトにこれらの制限されたヘッダーの1つを設定しようとすると、後でWebClient要求を送信しようとしたときに例外がスローされます。

システムによって保護される制限付きヘッダーには、次のものが含まれますが、これらに限定されません。

Date

Host

さらに、WebClientオブジェクトを使用する場合、他のいくつかのヘッダーも制限されます。これらの制限付きヘッダーには、次のものが含まれますが、これらに限定されません。

Accept

Connection

Content-Length

Expect (when the value is set to "100-continue"

If-Modified-Since

Range

Transfer-Encoding

HttpWebRequestクラスには、上記のヘッダーの一部を設定するためのプロパティがあります。アプリケーションがこれらのヘッダーを設定することが重要な場合は、WebRequestクラスの代わりにHttpWebRequestクラスを使用する必要があります。

これは、Dateやhostなどのヘッダーの多くが、リクエストごとに異なる方法で設定する必要があるためだと思います。それらをコピーするべきではありません。確かに、私はおそらくあなたがそれらのどれもコピーするべきではないことを個人的に提案するでしょう。独自のユーザーエージェントを配置する-取得するページが特定の値に依存している場合は、元のユーザーにその情報を提供するのではなく、常に有効な値を送信するようにしたいと思います。

自分が何をしているのかを完全に理解せずに、うまくいくものを見つけてそれを行うのではなく、基本的に何をする必要があるかを理解します。

于 2011-09-29T12:10:45.670 に答える
1

WebClient プロパティ ( CachePolicyContentLengthまたはContentType)のいずれかを使用して設定する必要があるヘッダーを設定しようとしているようです。

さらに、すべてのヘッダーをやみくもにコピーするのはあまり良くありません。本当に必要なものだけを取得する必要があります。

于 2011-09-29T11:35:36.920 に答える