Alle vorherigen Antworten beschreiben das Problem, ohne eine Lösung bereitzustellen. Hier ist eine Erweiterungsmethode, die das Problem löst, indem Sie einen beliebigen Header über seinen Zeichenfolgennamen festlegen können.
Verwendung
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.SetRawHeader("content-type", "application/json");
Erweiterungsklasse
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;
}
}
}
Szenarien
Ich habe einen Wrapper für geschrieben HttpWebRequest
und wollte nicht alle 13 eingeschränkten Header als Eigenschaften in meinem Wrapper verfügbar machen. Stattdessen wollte ich eine einfache verwenden Dictionary<string, string>
.
Ein weiteres Beispiel ist ein HTTP-Proxy, bei dem Sie Header in einer Anforderung aufnehmen und an den Empfänger weiterleiten müssen.
Es gibt viele andere Szenarien, in denen es einfach nicht praktikabel oder möglich ist, Eigenschaften zu verwenden. Den Benutzer zu zwingen, den Header über eine Eigenschaft zu setzen, ist ein sehr unflexibles Design, weshalb Reflexion erforderlich ist. Der Vorteil ist, dass die Reflexion weg abstrahiert wird, immer noch schnell ist (0,001 Sekunden in meinen Tests) und sich als Erweiterungsmethode natürlich anfühlt.
Anmerkungen
Bei Headernamen wird gemäß RFC ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2) die Groß- und Kleinschreibung nicht berücksichtigt