2015-06-11 4 views
11

मैं हर स्थिति कोड उदाहरण के लिए विभिन्न त्रुटि संदेश प्रदर्शित करना चाहते हैं:ASP.NET MVC 6 से निपटने HTTP स्थिति कोड के आधार पर त्रुटियों

  • 400 गलत अनुरोध
  • 403 निषिद्ध
  • 500 आंतरिक सर्वर त्रुटि
  • 404 नहीं मिला
  • 401 अनधिकृत

कैसे कर सकते हैं मैं इसे नए एएसपी.नेट एमवीसी 6 अनुप्रयोगों में प्राप्त करता हूं? क्या मैं इसे अंतर्निहित UseErrorHandler विधि का उपयोग कर कर सकता हूं?

application.UseErrorHandler("/error"); 

इसके अलावा, मैंने देखा है कि यहां तक ​​कि इसके बाद के संस्करण हैंडलर के साथ, एक न के बराबर यूआरएल उदा में प्रवेश/यह-पृष्ठ-अस्तित्व में नहीं है, आईआईएस से एक बदसूरत 404 नहीं मिला त्रुटि पृष्ठ का कारण बनता है। इसे कैसे संभाला जा सकता है?

MVC 5 में हम ASP.NET और system.webServer httpErrors web.config फ़ाइल में अनुभाग के लिए system.web customErrors अनुभाग का उपयोग करना पड़ा है लेकिन यह एक बोझल के साथ काम करना मुश्किल था, बहुत से बहुत अजीब व्यवहार। क्या एमवीसी 6 इसे बहुत आसान बनाता है?

उत्तर

11

आप इसके लिए StatusCodePagesMiddleware का उपयोग कर सकते हैं।

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) 
{ 
    app.UseStatusCodePagesWithReExecute("/StatusCodes/StatusCode{0}"); 

    app.UseMvcWithDefaultRoute(); 

नियंत्रक जो स्थिति कोड अनुरोधों को प्रबंधित:

public class StatusCodesController : Controller 
{ 
    public IActionResult StatusCode404() 
    { 
     return View(viewName: "NotFound"); // you have a view called NotFound.cshtml 
    } 

    ... more actions here to handle other status codes 
} 

कुछ नोट्स: UseStatusCodePagesWithRedirects और UseStatusCodePages अन्य क्षमताओं के लिए की तरह

  • चेक अन्य विस्तार तरीकों का पालन एक उदाहरण है।
  • मैंने स्टेटस कोड को मेरे उदाहरण में एक क्वेरी स्ट्रिंग के रूप में रखने का प्रयास किया, लेकिन ऐसा लगता है कि यह मिडलवेयर क्वेरी स्ट्रिंग को संभाल नहीं करता है, लेकिन आप this कोड पर एक नज़र डाल सकते हैं और इस समस्या को ठीक कर सकते हैं।
+1

नोट: यह एक बेहतर समाधान है जिसे मैंने नीचे प्रदान किया है। –

+0

यह कोड सभी अनुरोधों के लिए निष्पादित करता है। क्या मैं यह कहकर सही हूं कि इसे एक्शन प्रतिनिधि में जोड़ा जाएगा जिसे UseErrorHandler को पास किया जा सकता है? –

+1

@RehanSaeed: हाँ, यह सभी अनुरोधों के लिए निष्पादित किया जा सकता है क्योंकि इसे स्थिति कोड को सत्यापित करने के लिए प्रतिक्रियाओं को अवरुद्ध करने की आवश्यकता है। मैं आपके दूसरे प्रश्न के बारे में स्पष्ट नहीं हूं। यह 'UserErrorHandler' की तुलना में एक अलग मिडलवेयर है। क्या आप और विस्तार कर सकते हैं? –

3

मैं इसे नए एएसपी.नेट एमवीसी 6 अनुप्रयोगों में कैसे प्राप्त कर सकता हूं? क्या मैं इसे अंतर्निहित UseErrorHandler विधि का उपयोग कर कर सकता हूं?

त्वरित जवाब: नहीं एक सुरुचिपूर्ण फैशन में।

स्पष्टीकरण/वैकल्पिक: शुरू करने के लिए पहली बार में देखो देता है क्या UseErrorHandler विधि वास्तव में क्या कर रहा है: https://github.com/aspnet/Diagnostics/blob/6dbbe831c493e6e7259de81f83a04d1654170137/src/Microsoft.AspNet.Diagnostics/ErrorHandlerExtensions.cs#L25 जो निम्नलिखित मिडलवेयर जोड़ता है: https://github.com/aspnet/Diagnostics/blob/6dbbe831c493e6e7259de81f83a04d1654170137/src/Microsoft.AspNet.Diagnostics/ErrorHandlerMiddleware.csनोट लाइनों 29-78 (आह्वान विधि)

आह्वान जब भी कोई अनुरोध आता है तो विधि निष्पादित की जाती है (आपके Startup.cs में आपके application.UseErrorHandler("...") के स्थान द्वारा नियंत्रित)। तो UseErrorHandler एक कस्टम मिडलवेयर जोड़ने का एक शानदार तरीका है: middleware = घटक जो http अनुरोध पर कार्य कर सकता है।

अब उस पृष्ठभूमि के साथ, यदि हम अपने स्वयं के त्रुटि मिडलवेयर को जोड़ना चाहते हैं जो अलग-अलग अनुरोधों को जोड़ना चाहते हैं। हम इन लाइनों को संशोधित करके डिफ़ॉल्ट ErrorHandlerMiddleware की तरह एक समान मिडलवेयर जोड़कर ऐसा कर सकते हैं: https://github.com/aspnet/Diagnostics/blob/6dbbe831c493e6e7259de81f83a04d1654170137/src/Microsoft.AspNet.Diagnostics/ErrorHandlerMiddleware.cs#L48-L51 उस दृष्टिकोण के साथ हम स्थिति कोड के आधार पर रीडायरेक्ट पथ को नियंत्रित कर सकते हैं।

MVC 5 में हम ASP.NET के लिए system.web customErrors अनुभाग और web.config फ़ाइल में system.webServer httpErrors अनुभाग का उपयोग करना पड़ा है लेकिन यह एक बोझल के साथ काम करना मुश्किल था, बहुत से बहुत अजीब व्यवहार। क्या एमवीसी 6 इसे बहुत आसान बनाता है?

उत्तर: यह सुनिश्चित करता है :)। उपर्युक्त उत्तर की तरह ही फिक्स्ड मिडलवेयर जोड़ने में निहित है। में IApplicationBuilder के माध्यम से सरल मिडलवेयर जोड़ने के लिए एक शॉर्टकट है; अपने Configure विधि के अंत में आप जोड़ सकते हैं निम्नलिखित:

app.Run(async (context) => 
{ 
    await context.Response.WriteAsync("Could not handle the request."); 

    // Nothing else will run after this middleware. 
}); 

इसका कारण यह है इसका मतलब है कि आप अनुरोध के बिना अपने http पाइप लाइन के अंत तक पहुँच संभाला जा रहा (क्योंकि यह आपके Configure विधि के अंत में है काम करेंगे Startup.cs में)।

app.Use(async (context, next) => 
{ 
    await context.Response.WriteAsync("Could not handle the request."); 

    // This ensures that any other middelware added after you runs. 
    await next(); 
}); 

आशा इस मदद करता है: क्या आप के बाद मिडलवेयर निष्पादित करने के लिए विकल्प के साथ यह मिडलवेयर जोड़ने के लिए (त्वरित फैशन में) चाहते हैं, तो यहां इसका तरीका!

+0

मुमकिन है यह केवल web.config की customErrors अनुभाग के लिए एक स्थानापन्न है और कार्य नहीं करेगा 404 के लिए त्रुटियों को नहीं मिला। इसके लिए हमें अभी भी httpErrors का उपयोग करने की आवश्यकता होगी? –

+1

यह 404 त्रुटि त्रुटियों के लिए भी काम करेगा। 404 तब होता है जब अनुरोध अनुरोध को संभाल नहीं सकता है। –

0

नियंत्रक में प्रत्येक व्यक्ति को अलग-अलग निर्दिष्ट किए बिना विभिन्न स्थिति कोड के साथ काम करता है।

Startup.cs:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) 
{ 
    app.UseStatusCodePagesWithRedirects("/StatusCodes?statusCode={0}"); 
    app.UseMvcWithDefaultRoute(); 

नियंत्रक:

public class StatusCodesController : Controller 
    { 
    public IActionResult Index(string statusCode) 
    { 
     if(statusCode == null) statusCode = ""; 
     if(statusCode == "404") return View("Error404"); 
     return View("Index",statusCode); 
    } 

    public IActionResult Test404() { return StatusCode(404); } 
    public IActionResult Test500() { return StatusCode(500); } 

दृश्य:

@model string 
@{ ViewData["Title"] = Model + " Oops!"; } 

<style> 
    .error-template { 
    padding: 40px 15px; 
    text-align: center; 
    } 

    .error-actions { 
    margin-bottom: 15px; 
    margin-top: 15px; 
    } 

    .error-actions .btn { 
     margin-right: 10px; 
    } 
</style> 

<div class="container"> 
    <div class="row"> 
    <div class="col-md-12"> 
     <div class="error-template"> 
     <h2>Oops!</h2> 
     <h2>@Model Error</h2> 
     <div class="error-details">Sorry, an error has occurred!</div> 
     <div class="error-actions"> 
      <a class="btn btn-primary btn-lg" href="/"><span class="glyphicon glyphicon-home"></span> Take Me Home </a> 
      <a class="btn btn-default btn-lg" href="/Home/ContactUs"><span class="glyphicon glyphicon-envelope"></span> Contact Support </a> 
     </div> 
     </div> 
    </div> 
    </div> 
</div> 
संबंधित मुद्दे