Tutte le risposte precedenti descrivono il problema senza fornire una soluzione. Ecco un metodo di estensione che risolve il problema consentendo di impostare qualsiasi intestazione tramite il nome della stringa.
uso
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.SetRawHeader("content-type", "application/json");
Classe di estensione
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;
}
}
}
scenari
Ho scritto un wrapper per HttpWebRequest
e non volevo esporre tutte e 13 le intestazioni limitate come proprietà nel mio wrapper. Invece volevo usare un semplice Dictionary<string, string>
.
Un altro esempio è un proxy HTTP in cui è necessario prendere le intestazioni in una richiesta e inoltrarle al destinatario.
Ci sono molti altri scenari in cui non è solo pratico o possibile usare le proprietà. Costringere l'utente a impostare l'intestazione tramite una proprietà è un progetto molto flessibile, motivo per cui è necessaria una riflessione. Il lato positivo è che il riflesso viene sottratto, è ancora veloce (0,001 secondi nei miei test) e come metodo di estensione sembra naturale.
Appunti
I nomi delle intestazioni non fanno distinzione tra maiuscole e minuscole per RFC, http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2