2010-11-03 17 views
10

अनुरोध करने के लिए शीर्षलेख जोड़ने के लिए यह एक साधारण ऑपरेशन की तरह लगता है।HttpModule

हमारे विकास वातावरण में आने वाले प्रत्येक एचटीपीआरक्वेट में कुछ शीर्षलेख जोड़ने के लिए हमारे विकास पर्यावरण (XP/IIS 5 पर चल रहा है) में हमें आवश्यकता है। (यह एक उत्पादन वातावरण अनुकरण करना है जिसे हम देव में उपलब्ध नहीं हैं)। पहले लाल पर, यह एक सरल HttpModule तरह लग रहा था, की तर्ज पर:

public class Dev_Sim: IHttpModule 
{ 
    public void Init(HttpApplication app) 
    { 
     app.BeginRequest += delegate { app.Context.Request.Headers.Add("UserName", "XYZZY"); }; 
    } 

    public void Dispose(){} 
} 

लेकिन ऐसा करने की कोशिश कर रहा पर, मैं केवल पढ़ने के लिए है कि अनुरोध के हेडर संग्रह है, और विधि जोड़ें के साथ विफल एक ऑपरेशन नॉट समर्थित अपवाद।

Google पर इस पर शोध करने में कुछ घंटों खर्च करते हुए, मुझे अपेक्षाकृत सीधे आगे की समस्या के बारे में कोई आसान जवाब नहीं मिला है।

क्या किसी के पास कोई संकेत है?

+0

प्रतिक्रिया स्ट्रीम को संशोधित करने की क्षमता है। क्या आपके पास कुछ विशिष्ट है जिसे आप एक हैंडल प्राप्त कर सकते हैं और प्रतिस्थापित कर सकते हैं? – brumScouse

+0

मैं प्रतिक्रिया को संशोधित नहीं करना चाहता हूं। मुझे अनुरोध को संशोधित करने की आवश्यकता है, और इसे शेष श्रृंखला में भेजना है, अंततः मेरे एमवीसी अनुप्रयोग में समाप्त होना। जब यह मेरे ऐप पर जाता है, तो मेरा ऐप उन शीर्षकों को देखने में सक्षम होना चाहिए जिन्हें मैं इस मॉड्यूल में सम्मिलित करने का प्रयास कर रहा हूं। –

उत्तर

15

ठीक है, एक सह कार्यकर्ता और कुछ प्रयोग की सहायता से, मैंने पाया यह कुछ संरक्षित गुण और विधियों की सहायता प्रतिबिंब के माध्यम से पहुँचा साथ किया जा सकता है कि:

var headers = app.Context.Request.Headers; 
Type hdr = headers.GetType(); 
PropertyInfo ro = hdr.GetProperty("IsReadOnly", 
    BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); 
// Remove the ReadOnly property 
ro.SetValue(headers, false, null); 
// Invoke the protected InvalidateCachedArrays method 
hdr.InvokeMember("InvalidateCachedArrays", 
    BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, 
    null, headers, null); 
// Now invoke the protected "BaseAdd" method of the base class to add the 
// headers you need. The header content needs to be an ArrayList or the 
// the web application will choke on it. 
hdr.InvokeMember("BaseAdd", 
    BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, 
    null, headers, 
    new object[] { "CustomHeaderKey", new ArrayList {"CustomHeaderContent"}}); 
// repeat BaseAdd invocation for any other headers to be added 
// Then set the collection back to ReadOnly 
ro.SetValue(headers, true, null); 

यह मेरे लिए काम करता है, कम से कम।

+0

हमारे पास विजेता है! –

+0

यह इतना गलत है। मैंने अनुरोध के पैरामीटर जोड़ने के लिए इसका इस्तेमाल किया (वे केवल पढ़ने के लिए भी हैं)। उस मामले में इसे एक ऐरेलिस्ट को मूल्य बनाने की आवश्यकता नहीं है, हालांकि - केवल एक स्ट्रिंग। +1 – iandisme

+0

बहुत बढ़िया! मैंने इसका उपयोग तब किया जब मुझे अपने परीक्षणों के लिए HttpRequest में हेडर जोड़ने की आवश्यकता होती है। https://gist.github.com/mrstebo/81288a96f55c0b74f6c5b37ee17533a6 – mrstebo

0

आप इस तरह हेडर में जोड़ सकते हैं। प्रमाणीकरण अनुक्रम दर्ज करने से पहले अनुरोध में क्रेडेंशियल जानकारी जोड़ने का यह एक तरीका है।

string cred = "UN:PW"; 
System.Web.HttpContext.Current.Request.Headers.Add("Authorization", "Basic " +Convert.ToBase64String(Encoding.ASCII.GetBytes(cred))); 
+2

मुझे यकीन नहीं है, और, चूंकि डेढ़ साल बाद, मेरे पास अभी भी परीक्षण करने के लिए एक परीक्षण वातावरण नहीं है, लेकिन मुझे विश्वास है कि आप करेंगे हेडर खोजें। इसमें शामिल होगा और ऑपरेशन नॉट समर्थित अपवाद जैसा कि मैंने अपने मूल उदाहरण में किया था। मैं गलत हो सकता हूं ... –

+0

मैंने इस विधि की कोशिश की और एक ही ऑपरेशन नॉट समर्थित अपवाद प्राप्त किया डेव हन्ना का समाधान मेरे लिए काम किया – Franklin

संबंधित मुद्दे