Semua jawaban sebelumnya menggambarkan masalah tanpa memberikan solusi. Berikut adalah metode ekstensi yang memecahkan masalah dengan memungkinkan Anda untuk mengatur header apa pun melalui nama string-nya.
Pemakaian
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.SetRawHeader("content-type", "application/json");
Kelas Ekstensi
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;
}
}
}
Skenario
Saya menulis pembungkus untuk HttpWebRequest
dan tidak ingin mengekspos ke-13 header terbatas sebagai properti di bungkus saya. Sebaliknya saya ingin menggunakan yang sederhana Dictionary<string, string>
.
Contoh lain adalah proksi HTTP di mana Anda perlu mengambil tajuk dalam permintaan dan meneruskannya ke penerima.
Ada banyak skenario lain di mana tidak praktis atau mungkin untuk menggunakan properti. Memaksa pengguna untuk mengatur header melalui properti adalah desain yang sangat tidak fleksibel, oleh karena itu diperlukan refleksi. Sisi baiknya adalah refleksi itu disarikan, masih cepat (0,001 detik dalam tes saya), dan sebagai metode ekstensi terasa alami.
Catatan
Nama tajuk tidak sensitif huruf per RFC, http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2