Tất cả các câu trả lời trước mô tả vấn đề mà không cung cấp giải pháp. Đây là một phương thức mở rộng để giải quyết vấn đề bằng cách cho phép bạn đặt bất kỳ tiêu đề nào thông qua tên chuỗi của nó.
Sử dụng
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.SetRawHeader("content-type", "application/json");
Lớp học mở rộng
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;
}
}
}
Kịch bản
Tôi đã viết một trình bao bọc cho HttpWebRequest
và không muốn để lộ tất cả 13 tiêu đề bị hạn chế làm thuộc tính trong trình bao bọc của mình. Thay vào đó tôi muốn sử dụng một cách đơn giản Dictionary<string, string>
.
Một ví dụ khác là proxy HTTP, nơi bạn cần lấy các tiêu đề trong yêu cầu và chuyển tiếp chúng đến người nhận.
Có rất nhiều tình huống khác trong đó các thuộc tính của nó không thực tế hoặc có thể sử dụng. Buộc người dùng đặt tiêu đề thông qua một thuộc tính là một thiết kế rất không linh hoạt, đó là lý do tại sao cần phải có sự phản chiếu. Mặt trái là sự phản chiếu được trừu tượng hóa, nó vẫn nhanh (0,001 giây trong các thử nghiệm của tôi) và như một phương pháp mở rộng tạo cảm giác tự nhiên.
Ghi chú
Tên tiêu đề không phân biệt chữ hoa chữ thường theo RFC, http://www.w3.org/Prot Protocol / rfc2616 / rfc2616-sec4.html # sec4.2