2014-05-09 8 views
19

मेरे पास थोड़ा सा कोड था जो मैं एएसपी.नेट और सिग्नलआर के लिए डुप्लिकेट कर रहा था और मैंने इस डुप्लिकेशंस को हटाने के लिए ओविन मिडलवेयर के रूप में इसे फिर से लिखने का फैसला किया।क्या ओडिन मिडलवेयर http सत्र का उपयोग कर सकता है?

एक बार जब मैं इसे चला रहा था, मैंने देखा कि HttpContext.Current.Session शून्य था, और मुझे IOwinContext पर कोई सत्र ऑब्जेक्ट नहीं मिला जो मेरे मिडलवेयर में है।

क्या ओविन से http सत्र तक पहुंचना संभव है?

उत्तर

24

हाँ, लेकिन यह काफी हैक है। यह सिग्नलआर के साथ भी काम नहीं करेगा क्योंकि लंबी सत्र ताले को रोकने के लिए सत्र से पहले सिग्नलर को चलाया जाना चाहिए।

यह किसी भी अनुरोध के लिए सत्र को सक्षम करने के लिए:

public static class AspNetSessionExtensions 
{ 
    public static IAppBuilder RequireAspNetSession(this IAppBuilder app) 
    { 
     app.Use((context, next) => 
     { 
      // Depending on the handler the request gets mapped to, session might not be enabled. Force it on. 
      HttpContextBase httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName); 
      httpContext.SetSessionStateBehavior(SessionStateBehavior.Required); 
      return next(); 
     }); 
     // SetSessionStateBehavior must be called before AcquireState 
     app.UseStageMarker(PipelineStage.MapHandler); 
     return app; 
    } 
} 

तो आप या तो HttpContext.Current.Session या

HttpContextBase httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName); 
+2

मेरा सत्र अभी भी शून्य है। इसका कारण क्या हो सकता है? – Rastko

+0

वही है, यह अभी भी 'शून्य' है !! – gdmanandamohon

5

के साथ सत्र का उपयोग कर सकते इस उत्तर the initial answer से एक रीमिक्स है, इसलिए का सार इसे @ ट्राचर के लिए जिम्मेदार ठहराया जाना चाहिए। संपादन के सुझाव देने के बजाय इसे अलग-अलग पोस्ट करने के लिए यह काफी अलग है।


जाना चाहिए तुम्हें बुनियादी परीक्षण प्रयोजनों के लिए एक छोटा सा Owin एप्लिकेशन बनाना चाहते (जैसे एक बड़ा API के लिए एक ठूंठ/नकली जब एकीकरण परीक्षण कर के रूप में), सत्र राज्य का उपयोग ठीक काम करेगा की एक से थोड़ा hakish रास्ता सहित ।

सबसे पहले, आप इन की जरूरत है:

public static void RequireAspNetSession(IAppBuilder app) 
{ 
    app.Use((context, next) => 
    { 
     var httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName); 
     httpContext.SetSessionStateBehavior(SessionStateBehavior.Required); 
     return next(); 
    }); 

    // To make sure the above `Use` is in the correct position: 
    app.UseStageMarker(PipelineStage.MapHandler); 
} 

तुम भी है कि के रूप में मूल जवाब किया बना सकते हैं एक विस्तार पद्धति के रूप में:

using Microsoft.Owin; 
using Microsoft.Owin.Extensions; 
using Owin; 

उन के साथ आप एक सहायक विधि बना सकते हैं ।

ध्यान दें कि अगर आप का उपयोग नहीं करते UseStageMarker आप इस त्रुटि का सामना करना होगा:

Server Error in '/' Application.
'HttpContext.SetSessionStateBehavior' can only be invoked before 'HttpApplication.AcquireRequestState' event is raised.

किसी भी मामले में, के साथ आप ऊपर अब इस तरह से अपनी Owin अनुप्रयोग में HttpContext उपयोग कर सकते हैं:

public void Configuration(IAppBuilder app) 
{ 
    RequireAspNetSession(app); 

    app.Run(async context => 
    { 
     if (context.Request.Uri.AbsolutePath.EndsWith("write")) 
     { 
      HttpContext.Current.Session["data"] = DateTime.Now.ToString(); 
      await context.Response.WriteAsync("Wrote to session state!"); 
     } 
     else 
     { 
      var data = (HttpContext.Current.Session["data"] ?? "No data in session state yet.").ToString(); 
      await context.Response.WriteAsync(data); 
     } 
    }); 
} 

आप इस छोटे अनुप्रयोग के साथ आईआईएस एक्सप्रेस अप आग, तो पहले आपको मिलेगा:

No data in session state yet.

तो अगर आप http://localhost:12345/write करने के लिए जाना आप प्राप्त करेंगे:

Wrote to session state!

तो अगर आप वापस जाने के लिए/किसी अन्य यूआरएल है कि मेजबान पर जाना आप प्राप्त करेंगे:

11/4/2015 10:28:22 AM

या कुछ इसी तरह की।

+4

'System.Web.HttpContext.Current।सत्र '***RRpponseSignIn *** विधि में शून्य है। कोड: 'प्रदाता = नया कुकी प्रमाणीकरणप्रदाता() { OnResponseSignIn = async संदर्भ =>' – Kiquenet

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