System.Net.WebRequest の使用時に一部の HTTP ヘッダーを設定できません 質問する

System.Net.WebRequest の使用時に一部の HTTP ヘッダーを設定できません 質問する

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

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

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

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

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

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

ベストアンサー1

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

もっと詳しく知りたい方は、全部読んでみてください。楽しんでいただけると嬉しいです...


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

  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クラスから適切なプロパティを明示的に使用して、それらの値を変更することです。


編集: (役に立つ、コメントから、ユーザーによるコメントカイドウ

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

おすすめ記事