2016-06-23 6 views
5

मेरा ऐप ASP.NET Core RC2 चला रहा है, और मैं इस बात से उलझन में हूं कि स्टेटस कोड और अपवाद हैंडलर मिडलवेयर कैसे काम करता है।अपवाद अलग-अलग पृष्ठों पर रीडायरेक्ट क्यों करता है?

मेरा ऐप निम्न मध्यवर्ती के साथ कॉन्फ़िगर किया गया है।

app.UseStatusCodePagesWithReExecute("/Error/Status/{0}"); 
app.UseExceptionHandler("/Error/ServerError"); 

नियंत्रक हैंडल जो देखने इसे वापस करना चाहिए:

[HttpGet] 
public IActionResult Status(int id) 
{ 
    switch (id) 
    { 
     case 404: 
      return View("404"); 
     case 400: 
      return View("400"); 
     case 500: 
      return View("500"); 
     default: 
      return View("501"); 
    } 
} 

[HttpGet] 
public IActionResult ServerError() 
{ 
    return View(); 
} 

जब मैं एक अज्ञात URL पर पहुंच यह 404 page वापस आ जाएगी स्थिति कार्रवाई से अपेक्षा के अनुरूप।

जब मैं अपवाद फेंकने वाली किसी क्रिया पर नेविगेट करता हूं तो यह स्थिति क्रिया से /Error/ServerError पर 500 page पर जाएगा।

public IActionResult ThrowException() 
{ 
    throw new Exception(); 
} 

अगर मैं एक ऐसी कार्रवाई StatusCodeResult(500); रिटर्न यह स्थिति कार्रवाई से 500 page वापस आ जाएगी पर जाएँ।

[HttpGet] 
public IActionResult Error500() 
{ 
    return new StatusCodeResult(500); 
} 

मुझे क्या confuses सांत्वना पता चलता है कि दोनों परिणाम वापस 500 (Internal Server Error) लेकिन वे कैसे वे मिडलवेयर के आधार पर एक अलग पेज पर पहुंच जाएंगे लौटा दिया जाता है पर निर्भर करता है है।

enter image description here

ऐसा क्यों है?

+0

मुझे यकीन है कि नहीं हूँ, लेकिन मैं की समीक्षा की 'aspnet/Diagnostics' और मैं' StatusCodePagesMiddleware' में हालत निम्नलिखित देखा: 'अगर (context.Response.HasStarted || ...) {वापसी;} '। इसके अलावा 'अपवाद हैडलर मिडलवेयर' संदर्भ में। प्रतिक्रिया। ऑनस्टार्टिंग (_clearCacheHeadersDelegate, संदर्भ। प्रतिक्रिया); '। मुझे लगता है कि 'StatusCodePagesMiddleware' ने स्टेटस कोड संभाला है, प्रतिक्रिया पहले से ही' अपवाद हैन्डलर मिडलवेयर 'द्वारा शुरू की गई है। –

उत्तर

4

जब मैं एक अपवाद फेंकने वाली किसी क्रिया पर नेविगेट करता हूं तो यह/त्रुटि/सर्वर त्रुटि पर नेविगेट करेगा और स्थिति कार्रवाई से 500 पृष्ठ नहीं होगा।

यह आशा की जाती है क्योंकि ExcetionHandlerMiddleware अपवाद बिना क्रिया संभालती है और यह भी पंजीकृत है after स्थिति कोड पृष्ठों मिडलवेयर और इतने पहले निष्पादित हो जब प्रतिक्रिया बाहर चला जाता है। मेरा मानना ​​है कि भले ही आप इन बिडवायर को दोबारा ऑर्डर करें, आपको व्यवहार में कोई अंतर नहीं दिखाई देगा क्योंकि स्टेटस कोड पेज मिडलवेयर आउटगोइंग एचटीपीआरस्पॉन्स इंस्टेंस पर स्टेटस कोड ढूंढता है और अनचाहे अपवादों के मामले में यह सेट नहीं किया जा सकता है।

अपडेटेडः एक टिप्पणी का जवाब। आप नीचे दिए गए की तरह कुछ कर सकते हैं:

[HttpGet] 
public IActionResult ServerError() 
{ 
    var exceptionHandlerFeature = HttpContext.Features.Get<IExceptionHandlerFeature>(); 
    if (exceptionHandlerFeature != null) 
    { 
     var exception = exceptionHandlerFeature.Error; 

     //TODO: log the exception 
    } 
    return View("500"); 
} 
+0

एक वैकल्पिक दृष्टिकोण अपने स्वयं के मिडलवेयर बनाना होगा, जो अपवाद को पकड़ता है और स्टेटस कोड सेट करता है, इसलिए यह उस बिंदु पर उपलब्ध हो जाता है जब UseStatusCodePagesWithReExecute का मूल्यांकन किया जा रहा है – Tseng

+0

मुझे यकीन नहीं है कि मैं अब तक जाऊंगा। आप मेरी अद्यतन पोस्ट में कुछ ऐसा कर सकते हैं। –

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

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