136

オブジェクトにHTTPヘッダーのキーと値のペアを追加しようとするとWebRequest、次の例外が発生します。

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

Add()メソッドを使用してコレクションに新しい値を追加しようとしましたHeadersが、それでも同じ例外が発生します。

webRequest.Headers.Add(HttpRequestHeader.Referer, "http://stackoverflow.com");

これを回避するには、WebRequestオブジェクトをHttpWebRequestにキャストし、などのプロパティを設定しますhttpWebReq.Referer ="http://stackoverflow.com"が、これは、プロパティを介して公開される少数のヘッダーに対してのみ機能します。

リモートリソースのリクエストを使用してヘッダーを変更する際に、よりきめ細かい制御を行う方法があるかどうかを知りたいです。

4

12 に答える 12

184

簡潔で技術的な回答が必要な場合は、回答の最後のセクションに進んでください。

もっと詳しく知りたい場合は、すべて読んでください。楽しんでいただければ幸いです...


今日もこの問題に対処しましたが、今日発見したことは次のとおりです。

  1. 上記の答えは次のように当てはまります。

    1.1 追加しようとしているヘッダーが既に存在するため、再度追加するのではなく、適切なプロパティ (たとえば、インデクサー) を使用してその値を変更する必要があることを示しています。

    1.2 のヘッダーを変更するときはいつでもHttpWebRequest、オブジェクト自体に適切なプロパティが存在する場合は、それらを使用する必要があります。

主要なガイドラインを提供してくれた FOR と Jvenema に感謝します...

  1. しかし、私が見つけたのは、それがパズルの欠けているピースだったということです:

    2.1WebHeaderCollectionクラスは通常、WebRequest.Headers またはWebResponse.Headers を介してアクセスされます。一部の一般的なヘッダーは制限されていると見なされ、API (Content-Type など) によって直接公開されるか、システムによって保護され、変更できません。

制限付きヘッダーは次のとおりです。

  • Accept
  • Connection
  • Content-Length
  • Content-Type
  • Date
  • Expect
  • Host
  • If-Modified-Since
  • Range
  • Referer
  • Transfer-Encoding
  • User-Agent
  • Proxy-Connection

したがって、次にこの例外に直面し、これを解決する方法がわからない場合は、制限されたヘッダーがいくつかあることを思い出してください。解決策は、WebRequest/HttpWebRequestクラスから適切なプロパティを明示的に使用してそれらの値を変更することです。


編集:(便利、コメントから、ユーザーKaidoによるコメント)

WebHeaderCollection.IsRestricted(key)解決策は、 add を呼び出す前に、ヘッダーが既に存在するか、制限されているか ( ) を確認することです。

于 2011-01-20T20:44:03.300 に答える
80

カスタムWebクライアントでこの問題が発生しました。これを行うには複数の方法があるため、人々は混乱しているのではないかと思います。を使用WebRequest.Create()する場合は、にキャストしHttpWebRequest、プロパティを使用してヘッダーを追加または変更できます。を使用するWebHeaderCollection場合は、を使用できます.Add("referer","my_url")

例1

WebClient client = new WebClient();
client.Headers.Add("referer", "http://stackoverflow.com");
client.Headers.Add("user-agent", "Mozilla/5.0");

例2

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Referer = "http://stackoverflow.com";
request.UserAgent = "Mozilla/5.0";
response = (HttpWebResponse)request.GetResponse();
于 2010-03-08T23:47:55.933 に答える
13

コードが次のように「Accept」ヘッダー値を設定しようとしたときに、同じ例外が発生しました。

WebRequest request = WebRequest.Create("http://someServer:6405/biprws/logon/long");
request.Headers.Add("Accept", "application/json");

解決策は、これを次のように変更することでした。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://someServer:6405/biprws/logon/long");
request.Accept = "application/json";
于 2016-03-16T14:27:40.243 に答える
12

のヘッダーを変更するときはいつでもHttpWebRequest、オブジェクト自体に適切なプロパティが存在する場合は、それらを使用する必要があります。プレーンがある場合は、WebRequest必ず最初にキャストしてHttpWebRequestください。次にReferrer、あなたの場合は 経由でアクセスできる((HttpWebRequest)request).Referrerため、ヘッダーを直接変更する必要はありません。プロパティを正しい値に設定するだけです。ContentLengthContentTypeUserAgentなど、すべてこのように設定する必要があります。

IMHO、これは MS 側の欠点です...ヘッダーを設定するHeaders.Add()と、必要に応じて、舞台裏で適切なプロパティが自動的に呼び出されます。

于 2008-12-01T16:20:18.530 に答える
7

WebRequestは抽象的です(そして、継承するクラスはHeadersプロパティをオーバーライドする必要があるため)。どの具体的なWebRequestを使用していますか?言い換えると、どのようにしてそのWebRequestオブジェクトを使用できるようにしますか?

ehr .. mnourの回答により、表示されたエラーメッセージが実際に特定されていることがわかりました。追加しようとしているヘッダーがすでに存在しているため、適切なプロパティ(たとえば、インデクサー)を使用してその値を変更する必要があることを示しています。 )、もう一度追加しようとする代わりに。おそらくそれがあなたが探していたすべてです。

WebRequestを継承する他のクラスには、特定のヘッダーをラップするさらに優れたプロパティがある場合があります。たとえば、この投稿を参照してください。

于 2008-10-27T12:37:59.763 に答える
2

上記の回答はすべて問題ありませんが、問題の本質は、一部のヘッダーが 1 つの方法で設定され、他のヘッダーが別の方法で設定されていることです。上記の「制限付きヘッダー」リストを参照してください。これらについては、プロパティとして設定するだけです。その他の場合は、実際にヘッダーを追加します。こちらをご覧ください。

    request.ContentType = "application/x-www-form-urlencoded";

    request.Accept = "application/json";

    request.Headers.Add(HttpRequestHeader.Authorization, "Basic " + info.clientId + ":" + info.clientSecret);
于 2014-12-30T17:35:03.833 に答える
1

基本的に、いいえ。これは http ヘッダーであるため、 (質問で示したように)にキャストしHttpWebRequestて設定するのが合理的です。.Referer

HttpWebRequest req = ...
req.Referer = "your url";
于 2008-10-27T13:19:27.950 に答える
0

私はちょうど使用しています:

request.ContentType = "application/json; charset=utf-8"
于 2015-03-11T17:16:47.747 に答える