2012-01-02 13 views
5

मैं अपने खुद के कस्टम HTTP संदर्भ बनाने के साथ प्रयोग कर रहा हूँ आरंभ करने के लिए:एक कस्टम HTTP संदर्भ या HttpContextBase

CustomHttpContext : HttpContextBase 
{ 
    public override HttpRequestBase Request { } 
} 

एक बात मैं समझ नहीं कैसे

System.Web.HttpContext.Current 
साथ आधार वर्ग को प्रारंभ करने के लिए है

क्या किसी के पास कोई विचार है कि मैं वर्तमान एचटीपी के साथ कस्टम संदर्भ को कैसे शुरू कर सकता हूं, फिर अपने उद्देश्यों को पूरा करने के लिए कुछ तरीकों/गुणों को ओवरराइड कर सकता हूं?

उत्तर

7

सरल उत्तर नहीं है, यह संभव नहीं है। यह भी ध्यान रखें कि HttpContext को HttpContextBase से प्राप्त नहीं होता है, इसके बजाय, वे दोनों IServiceProvider लागू करते हैं। अंत में, एचटीपी कोंटेक्स्ट को सील कर दिया गया है, यह बताते हुए कि लेखक नहीं चाहते थे कि लोग इस वर्ग का उपभोग करने के अलावा कुछ और करें।

जैसा कि आपको कोई संदेह नहीं है कि HttpContextBase में एक पैरामीटर रहित कन्स्ट्रक्टर है, इसलिए आपको वर्तमान अनुरोध और HttpContext जैसे प्रतिक्रिया से इसे तुरंत चालू करने का विकल्प भी नहीं देता है!

के एक 'decompiler' का उपयोग HttpContext.Current के कार्यान्वयन पर एक नज़र लेने के लिए करते हैं:

// System.Web.HttpContext 
/// <summary>Gets or sets the <see cref="T:System.Web.HttpContext" /> object for the current HTTP request.</summary> 
/// <returns>The <see cref="T:System.Web.HttpContext" /> for the current HTTP request.</returns> 
public static HttpContext Current 
{ 
    get 
    { 
     return ContextBase.Current as HttpContext; 
    } 
    set 
    { 
     ContextBase.Current = value; 
    } 
} 

हम (System.Web.Hosting.ContextBase से) ContextBase.Current पर एक नज़र डालें, तो:

// System.Web.Hosting.ContextBase 
internal static object Current 
{ 
    get 
    { 
     return CallContext.HostContext; 
    } 
    [SecurityPermission(SecurityAction.Demand, Unrestricted = true)] 
    set 
    { 
     CallContext.HostContext = value; 
    } 
} 

और (System.Runtime.Messaging में) CallContext:

// System.Runtime.Remoting.Messaging.CallContext 
/// <summary>Gets or sets the host context associated with the current thread.</summary> 
/// <returns>The host context associated with the current thread.</returns> 
/// <exception cref="T:System.Security.SecurityException">The immediate caller does not have infrastructure permission. </exception> 
public static object HostContext 
{ 
    [SecurityCritical] 
    get 
    { 
     IllogicalCallContext illogicalCallContext = Thread.CurrentThread.GetIllogicalCallContext(); 
     object hostContext = illogicalCallContext.HostContext; 
     if (hostContext == null) 
     { 
      LogicalCallContext logicalCallContext = CallContext.GetLogicalCallContext(); 
      hostContext = logicalCallContext.HostContext; 
     } 
     return hostContext; 
    } 
    [SecurityCritical] 
    set 
    { 
     if (value is ILogicalThreadAffinative) 
     { 
      IllogicalCallContext illogicalCallContext = Thread.CurrentThread.GetIllogicalCallContext(); 
      illogicalCallContext.HostContext = null; 
      LogicalCallContext logicalCallContext = CallContext.GetLogicalCallContext(); 
      logicalCallContext.HostContext = value; 
      return; 
     } 
     LogicalCallContext logicalCallContext2 = CallContext.GetLogicalCallContext(); 
     logicalCallContext2.HostContext = null; 
     IllogicalCallContext illogicalCallContext2 = Thread.CurrentThread.GetIllogicalCallContext(); 
     illogicalCallContext2.HostContext = value; 
    } 
} 

हम शुरू HttpContext को पुनर्प्राप्त करने के तरीके के बारे में महसूस करने के लिए। यह वर्तमान उपयोगकर्ता द्वारा शुरू किए गए थ्रेड के साथ पैक किया जा रहा है जब उन्होंने वेबसाइट को झुकाया (जो सही समझ में आता है!)। आगे बढ़ते हुए हम देख सकते हैं कि यह प्रति अनुरोध पुनर्निर्मित भी हो जाता है (नीचे देखें)।

हम इंटरफ़ेस परत पर भी देख सकते हैं, HttpContext.Current को अपने स्वयं के HttpContext पर इंगित नहीं किया जा सकता क्योंकि संपत्ति वर्चुअल नहीं है। यह कई बीसीएल वर्गों का भी उपयोग करता है जो निजी या आंतरिक हैं, इसलिए आप अधिकतर कार्यान्वयन की प्रतिलिपि नहीं बना सकते हैं।

क्या आसान होगा, और किसी अन्य मुद्दे से भी कम प्रवण होगा, बस अपने स्वयं के कस्टमकॉन्टेक्स्ट ऑब्जेक्ट के साथ HttpContext को लपेटना होगा। आप बस बेसकॉन्टेक्स्ट प्रॉपर्टी में HttpContext.Current को लपेट सकते हैं, फिर कक्षा पर अपनी खुद की संपत्तियां लें (और जो भी सत्र, डेटाबेस, या अनुरोध आधारित राज्य भंडारण तंत्र का उपयोग करें जिसे आप स्टोर करना चाहते हैं और अपनी खुद की संपत्तियों को पुनर्प्राप्त करना चाहते हैं)।

व्यक्तिगत रूप से, मैं अपनी खुद की जानकारी संग्रहीत करने के लिए अपनी खुद की कक्षा का उपयोग करता हूं, क्योंकि यह मेरे आवेदन और उपयोगकर्ता आदि से संबंधित है और यह वास्तव में http पाइपलाइन या अनुरोध/प्रतिक्रिया प्रसंस्करण के साथ कुछ भी नहीं है।

यह भी देखें:

0

बस के पानी का छींटा के जवाब थोड़ा पर जोड़ने के लिए, आप भी उपयोग कर सकते हैं [ThreadStatic] कुछ स्थिर संपत्ति के साथ जोड़कर देखते हैं। Global.cs का उपयोग करके या अपने स्वयं के HttpModule/HttpHandler लिखकर, BeginRequest पर इसे प्रारंभ करें।

एक वेब मॉड्यूल बनाने के लिए कैसे: http://msdn.microsoft.com/en-us/library/ms227673(v=vs.100).aspx

थ्रेड स्थिर: http://msdn.microsoft.com/en-us/library/system.threadstaticattribute.aspx