以前のすべての回答は、解決策を提供せずに問題を説明しています。これは、文字列名を使用してヘッダーを設定できるようにすることで問題を解決する拡張メソッドです。
使用法
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.SetRawHeader("content-type", "application/json");
拡張クラス
public static class HttpWebRequestExtensions
{
static string[] RestrictedHeaders = new string[] {
"Accept",
"Connection",
"Content-Length",
"Content-Type",
"Date",
"Expect",
"Host",
"If-Modified-Since",
"Keep-Alive",
"Proxy-Connection",
"Range",
"Referer",
"Transfer-Encoding",
"User-Agent"
};
static Dictionary<string, PropertyInfo> HeaderProperties = new Dictionary<string, PropertyInfo>(StringComparer.OrdinalIgnoreCase);
static HttpWebRequestExtensions()
{
Type type = typeof(HttpWebRequest);
foreach (string header in RestrictedHeaders)
{
string propertyName = header.Replace("-", "");
PropertyInfo headerProperty = type.GetProperty(propertyName);
HeaderProperties[header] = headerProperty;
}
}
public static void SetRawHeader(this HttpWebRequest request, string name, string value)
{
if (HeaderProperties.ContainsKey(name))
{
PropertyInfo property = HeaderProperties[name];
if (property.PropertyType == typeof(DateTime))
property.SetValue(request, DateTime.Parse(value), null);
else if (property.PropertyType == typeof(bool))
property.SetValue(request, Boolean.Parse(value), null);
else if (property.PropertyType == typeof(long))
property.SetValue(request, Int64.Parse(value), null);
else
property.SetValue(request, value, null);
}
else
{
request.Headers[name] = value;
}
}
}
シナリオ
私はラッパーを作成しHttpWebRequest
、13個の制限付きヘッダーすべてをラッパーのプロパティとして公開したくありませんでした。代わりに、シンプルなを使用したいと思いましたDictionary<string, string>
。
別の例は、リクエストでヘッダーを取得して受信者に転送する必要があるHTTPプロキシです。
プロパティを使用することが実際的または不可能であるシナリオは他にもたくさんあります。プロパティを使用してユーザーにヘッダーを設定することは、非常に柔軟性のない設計であるため、リフレクションが必要です。良い点は、リフレクションが抽象化されていること、それでも高速(テストでは0.001秒)、そして拡張メソッドとして自然に感じられることです。
ノート
ヘッダー名は、RFC、http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2に従って大文字と小文字を区別しません