2015-03-22 6 views
17

से तार्किक कॉल संदर्भ पास करना मैं स्टीफन क्लेरी के पोस्ट http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html के अनुसार तार्किक कॉल संदर्भ (CallContext.LogicalSetData(CallContextKey, value) का उपयोग करके) पर प्रासंगिक जानकारी पास करने का प्रयास कर रहा हूं; और https://github.com/neuecc/OwinRequestScopeContext में कोड से प्रेरित है।ओडिन पाइपलाइन से वेबएपी नियंत्रक

मूल्य ओडब्ल्यूआईएन पाइपलाइन के माध्यम से उपलब्ध होगा, लेकिन यह तब उपलब्ध नहीं है जब कॉल WebApi नियंत्रक में प्रवेश करता है, मान सेट नहीं होता है।

मैंने यह भी देखा कि नियंत्रक में ब्रेकपॉइंट सेट करते समय, मुझे कॉल स्टैक में ओविन पाइपलाइन दिखाई नहीं दे रही है। जाहिर है, एएसपी.नेट एक अलग कॉल संदर्भ पर नियंत्रक कॉल कर रहा है।

तो,

  • क्यों (और कैसे) ASP.NET WebAPI नियंत्रक से Owin पाइप लाइन से कॉल संदर्भ को अलग करता है?

  • मैं पाइपलाइन से नियंत्रक तक प्रासंगिक डेटा कैसे पास कर सकता हूं?

उत्तर

7

यह पता लगाने के लिए क्यों CallContext एपीआई नियंत्रक में स्पष्ट है कई दिनों मुझे ले गया जब तक मैं यह लेख पढ़ें: दो मिडलवेयर अलग आईआईएस चरण में चलाता है http://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline

हैं, वे अलग CallContext होगा।

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

0

मैं सच में यकीन है कि आप नियंत्रक करने के लिए पाइप लाइन से प्रासंगिक डेटा पारित करके क्या मतलब है नहीं कर रहा हूँ लेकिन शायद आप पहले से ही उपयोग करते हैं Microsoft.AspNet.Identity, आप का लाभ उठाने सकता है के उपयोग IAppBuilder.CreatePerOwinContext अपनी वस्तु को पाइपलाइन पर पंजीकृत करने के लिए।

मैं उस तरह कुछ करने के लिए उपयोग करें जब मैं WebAPI नियंत्रकों को Owin पाइपलाइन के माध्यम से हम अपने प्रासंगिक वस्तु पास करना चाहते हैं:

startup.cs

//Registration of a delegate factory 
app.CreatePerOwinContext<Foo>(Factory.CreateFoo); 

factory.cs

//Contextual Object 
public static Foo CreateFoo(IdentityFactoryOptions<Foo> options, IOwinContext context) 
    { 
     //Owin Context is available here 
    } 

नियंत्रक.cs

public FooController() 
    { 
     var fooObj= HttpContext.Current.GetOwinContext().Get<Foo>(); 
    } 

उम्मीद है कि यह मदद करता है!

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