Önceki yanıtların tümü, bir çözüm sağlamadan sorunu açıklamaktadır. Dize adı aracılığıyla herhangi bir başlığı ayarlamanıza izin vererek sorunu çözen bir uzantı yöntemi.
kullanım
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.SetRawHeader("content-type", "application/json");
Uzatma Sınıfı
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;
}
}
}
Senaryolar
İçin bir sarmalayıcı yazdım HttpWebRequest
ve kısıtlanmış 13 başlığın tümünü sarmalayıcımdaki özellikler olarak göstermek istemedim. Bunun yerine basit kullanmak istedim Dictionary<string, string>
.
Başka bir örnek, bir istekte üstbilgiler almanız ve bunları alıcıya iletmeniz gereken bir HTTP proxy'dir.
Özelliklerin kullanılmasının pratik olmadığı veya mümkün olmadığı birçok başka senaryo var. Kullanıcıyı bir özellik aracılığıyla başlığı ayarlamaya zorlamak çok esnek olmayan bir tasarımdır ve bu nedenle yansıma gereklidir. Üst tarafı, yansımanın soyutlanmış olması, hala hızlı olması (testlerimde 0,001 saniye) ve bir uzatma yöntemi olarak doğal hissettiriyor.
notlar
Üstbilgi adları, RFC'ye göre büyük / küçük harfe duyarlı değildir, http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2