이전의 모든 답변은 솔루션을 제공하지 않고 문제를 설명합니다. 다음은 문자열 이름을 통해 헤더를 설정할 수있게하여 문제를 해결하는 확장 방법입니다.
용법
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.SetRawHeader("content-type", "application/json");
확장 클래스
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;
}
}
}
시나리오
래퍼를 작성했으며 래퍼의 HttpWebRequest
속성으로 13 개의 제한된 헤더를 모두 노출하고 싶지 않았습니다. 대신 나는 간단한을 사용하고 싶었다 Dictionary<string, string>
.
또 다른 예는 요청에서 헤더를 가져 와서 수신자에게 전달해야하는 HTTP 프록시입니다.
실용적이지 않거나 속성을 사용할 수없는 다른 시나리오가 많이 있습니다. 사용자가 속성을 통해 헤더를 설정하도록하는 것은 매우 융통성이없는 디자인이므로 리플렉션이 필요합니다. 단점은 반사가 추상화되어 여전히 빠르며 (테스트에서 .001 초) 확장 방법이 자연 스럽습니다.
노트
RFC, http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2에 따라 헤더 이름은 대소 문자를 구분하지 않습니다 .