2016-06-20 12 views
9

हमारे एएसपी.नेट कोर आधारित वेब एप्लिकेशन में, हम निम्नलिखित चाहते हैं: कुछ अनुरोधित फ़ाइल प्रकारों को कस्टम कंटेंट टाइप को प्रतिक्रिया में प्राप्त करना चाहिए। जैसे .map को application/json पर नक्शा करना चाहिए। "पूर्ण" एएसपी.नेट 4.x में और आईआईएस के साथ संयोजन में वेब.कॉन्फिग <staticContent>/<mimeMap> का उपयोग करना संभव था और मैं इस व्यवहार को कस्टम एएसपी.नेट कोर मिडलवेयर से बदलना चाहता हूं।मिडलवेयर प्रतिक्रिया सेट करने के लिए ContentType

public async Task Invoke(HttpContext context) 
{ 
    await nextMiddleware.Invoke(context); 

    if (context.Response.StatusCode == (int)HttpStatusCode.OK) 
    { 
     if (context.Request.Path.Value.EndsWith(".map")) 
     { 
      context.Response.ContentType = "application/json"; 
     } 
    } 
} 

दुर्भाग्य से, निम्न अपवाद को मिडलवेयर श्रृंखला पैदावार के बाकी लागू करने के बाद context.Response.ContentType सेट करने का प्रयास:

तो मैं (संक्षिप्तता के लिए सरलीकृत) निम्नलिखित की कोशिश की

System.InvalidOperationException: "Headers are read-only, response has already started." 

कैसे क्या मैं एक मिडलवेयर बना सकता हूं जो इस आवश्यकता को हल करता है?

उत्तर

6

HttpContext.Response.OnStarting कॉलबैक का उपयोग करने का प्रयास करें। हेडर भेजे जाने से पहले यह आखिरी घटना है जिसे निकाल दिया जाता है।

public async Task Invoke(HttpContext context) 
{ 
    context.Response.OnStarting((state) => 
    { 
     if (context.Response.StatusCode == (int)HttpStatusCode.OK) 
     { 
      if (context.Request.Path.Value.EndsWith(".map")) 
      { 
      context.Response.ContentType = "application/json"; 
      } 
     }   
     return Task.FromResult(0); 
    }, null); 

    await nextMiddleware.Invoke(context); 
} 
1

OnStarting विधि की एक अधिभार का उपयोग करना:

public async Task Invoke(HttpContext context) 
{ 
    context.Response.OnStarting(() => 
    { 
     if (context.Response.StatusCode == (int) HttpStatusCode.OK && 
      context.Request.Path.Value.EndsWith(".map")) 
     { 
      context.Response.ContentType = "application/json"; 
     } 

     return Task.CompletedTask; 
    }); 

    await nextMiddleware.Invoke(context); 
} 
संबंधित मुद्दे