पिछले सभी जवाब एक समाधान प्रदान किए बिना समस्या का वर्णन करते हैं। यहाँ एक विस्तार विधि है जो किसी समस्या को हल करने की अनुमति देता है जिससे आप इसके स्ट्रिंग नाम के माध्यम से किसी भी हेडर को सेट कर सकते हैं।
प्रयोग
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