2013-07-07 15 views
22

से प्रतिक्रिया ऑब्जेक्ट बदलना मेरा ओविन मिडलवेयर इस तरह है। (फ्रेमवर्क एएसपी.नेट वेब एपीआई है)।ओडब्ल्यूआईएन मिडलवेयर

public class MyMiddleware : OwinMiddleware 
{ 
    public MyMiddleware(OwinMiddleware next) : base(next) { } 

    public override async Task Invoke(OwinRequest request, OwinResponse response) 
    { 
     var header = request.GetHeader("X-Whatever-Header"); 

     await Next.Invoke(request, response); 

     response.SetHeader("X-MyResponse-Header", "Some Value"); 
     response.StatusCode = 403; 

    } 
} 

सवाल:

  1. यह OwinMiddleware से प्राप्त करने की सिफारिश की प्रथा है? मैं देखता हूं कि कटाना स्रोत में, कुछ मिडलवेयर वर्ग OwinMiddleware से प्राप्त होते हैं और कुछ नहीं करते हैं।

  2. मैं अनुरोध हेडर ठीक देख सकता हूं। मेरे मिडलवेयर में Next.Invoke के बाद प्रतिक्रिया शीर्षलेख या स्थिति कोड सेट करना क्लाइंट को वापस प्रतिक्रिया पर कोई प्रभाव नहीं पड़ता है। लेकिन अगर मैं Next.Invoke कॉल से पहले प्रतिक्रिया हेडर या स्थिति सेट करता हूं, तो हेडर और मेरे द्वारा सेट की गई स्थिति को क्लाइंट में वापस कर दिया जाता है। इन्हें स्थापित करने का सही तरीका क्या है?

उत्तर

25
  1. हाँ, OwinMiddleware से पाने की सिफारिश की है। कुछ मिडलवेयर वर्ग ओविन मिडलवेयर से प्राप्त नहीं होने का कारण यह है कि या तो उन्होंने अभी तक स्विच नहीं किया है क्योंकि कक्षा हाल ही में पेश की गई थी। या कुछ कारणों से असेंबली माइक्रोसॉफ्ट.ऑविन असेंबली पर निर्भरता लेने से बचने के लिए।

  2. अगला पर कॉल करने के बाद प्रतिक्रिया पर संभावित कारण सेटिंग सामग्री काम नहीं करती है, प्रतिक्रिया प्रतिक्रिया HTTP स्ट्रीम में प्रतिक्रिया लिखने के तुरंत बाद HTTP हेडर भेजा जाता है। तो मिडलवेयर घटक के बाद स्टेटस कोड या HTTP हेडर में कोई भी परिवर्तन प्रतिक्रिया निकाय को लिखना शुरू कर देता है इसका कोई प्रभाव नहीं पड़ेगा।

आप क्या करने का प्रयास कर सकते हैं ओडिन प्रदान करता है ऑन ऑनेंडिंग हैडर कॉलबैक का उपयोग करना है। यहां बताया गया है कि आप इसका उपयोग कैसे कर सकते हैं:

public override async Task Invoke(IOwinContext context) 
{ 
    var response = context.Response; 
    var request = context.Request; 

    response.OnSendingHeaders(state => 
    { 
     var resp = (OwinResponse)state; 
     resp.Headers.Add("X-MyResponse-Header", "Some Value"); 
     resp.StatusCode = 403; 
     resp.ReasonPhrase = "Forbidden"; 
    }, response); 

    var header = request.Headers["X-Whatever-Header"]; 

    await Next.Invoke(context); 
} 

मेरा उत्तर अपडेट करने के लिए बिस्कुट 314 पर क्रेडिट।

+0

धन्यवाद युसुफ:

यहाँ युसुफ के कोड के उस संस्करण है। बिंदु # 2 के लिए, क्या कटाना स्रोत या कहीं और एक उदाहरण कोड है जिसे मैं देखने के सर्वोत्तम अभ्यास पीटी से देख सकता हूं? मेरा मानना ​​है कि, मैं जो मांग रहा हूं वह काफी आम आवश्यकता है और क्या हम ओडिन मिडलवेयर का उपयोग करते हुए प्रतिक्रिया प्रतिक्रिया शीर्षलेख सेट करने के लिए बस इस स्ट्रीम स्विचिंग को करना चाहते हैं? किसी भी पॉइंटर्स की सराहना की जाएगी। – Badri

+0

मैं आपके सुझाव का पालन करके समस्या का समाधान करने में सक्षम हूं लेकिन क्या कोई आसान तरीका नहीं है? मेरा मतलब यह है कि रास्ते पर प्रतिक्रिया शीर्षलेख सेट करने के लिए यह बहुत अधिक काम है, खासकर अगर किसी को वेब एपीआई के संदेश हैंडलर में उपयोग किया जाता है। – Badri

+3

एक सरल विधि के साथ उत्तर अद्यतन किया गया। अगर यह काम करता है तो कृपया मुझे बताएं। –

7

मैंने एक मामूली बग को सही करने के लिए यूसुफ के उत्कृष्ट उत्तर को संपादित करने की कोशिश की और ओविन मिडलवेयर अब कैसे काम करता है इसके साथ उदाहरण अपडेट करें।

संपादन अस्वीकार कर दिया गया था (अच्छी तरह से, एक द्वारा अनुमोदित, बहुत नाबालिग होने के लिए एक द्वारा खारिज कर दिया गया, और दो प्रमुखों के लिए खारिज कर दिया गया)।

public override async Task Invoke(IOwinContext context) 
{ 
    var response = context.Response; 
    var request = context.Request; 

    response.OnSendingHeaders(state => 
    { 
     var resp = (OwinResponse)state; 
     resp.Headers.Add("X-MyResponse-Header", "Some Value"); 
     resp.StatusCode = 403; 
     resp.ReasonPhrase = "Forbidden"; // if you're going to change the status code 
             // you probably should also change the reason phrase 
    }, response); 

    var header = request.Headers["X-Whatever-Header"]; 

    await Next.Invoke(context); 
} 
+0

नया ओविन केवल इस ओवरराइड के साथ काम करता है – Raffaeu

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