Wszystkie poprzednie odpowiedzi opisują problem bez podania rozwiązania. Oto metoda rozszerzenia, która rozwiązuje problem, umożliwiając ustawienie dowolnego nagłówka za pomocą nazwy ciągu.
Stosowanie
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.SetRawHeader("content-type", "application/json");
Klasa rozszerzenia
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;
}
}
}
Scenariusze
Napisałem opakowanie dla HttpWebRequest
i nie chciałem ujawniać wszystkich 13 ograniczonych nagłówków jako właściwości w moim opakowaniu. Zamiast tego chciałem użyć prostego pliku Dictionary<string, string>
.
Innym przykładem jest serwer proxy HTTP, w którym musisz pobrać nagłówki w żądaniu i przesłać je do odbiorcy.
Istnieje wiele innych scenariuszy, w których użycie właściwości jest po prostu niepraktyczne lub niemożliwe. Zmuszanie użytkownika do ustawienia nagłówka za pomocą właściwości jest bardzo nieelastycznym projektem, dlatego potrzebne jest odbicie. Zaletą jest to, że odbicie jest wyabstrahowane, nadal jest szybkie (0,001 sekundy w moich testach), a jako metoda rozszerzenia wydaje się naturalne.
Uwagi
W nazwach nagłówków wielkość liter nie jest rozróżniana zgodnie z RFC, http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2