मैं Asp.Net Mvc 3 में कस्टम त्रुटि पृष्ठों को कैसे प्रदर्शित करूं?




asp.net-mvc-3 error-handling (3)

मैं सभी 401 त्रुटियों को कस्टम त्रुटि पृष्ठ पर रीडायरेक्ट करना चाहता हूं। मैंने शुरुआत में अपने web.config में निम्न प्रविष्टि सेट की है।

<customErrors defaultRedirect="ErrorPage.aspx" mode="On">
  <error statusCode="401" redirect="~/Views/Shared/AccessDenied.aspx" />
</customErrors>

आईआईएस एक्सप्रेस का उपयोग करते समय मुझे स्टॉक आईआईएस एक्सप्रेस 401 त्रुटि पृष्ठ प्राप्त होता है।

यदि मैं आईआईएस एक्सप्रेस का उपयोग नहीं करता हूं तो एक खाली पृष्ठ लौटाया जाता है। प्रतिक्रिया का निरीक्षण करने के लिए Google क्रोम के नेटवर्क टैब का उपयोग करके, मैं देखता हूं कि पृष्ठ खाली होने पर हेडर में 401 स्थिति वापस आती है

मैंने अभी तक जो कोशिश की है, वह इस एसओ उत्तर से सुझावों का उपयोग कर रहा है क्योंकि मैं आईआईएस एक्सप्रेस का उपयोग कर रहा हूं लेकिन इसका कोई फायदा नहीं हुआ। मैंने किसी भी भाग्य के साथ संयोजन <custom errors> और <httpErrors> का उपयोग करने का प्रयास किया है - मानक त्रुटि या खाली पृष्ठ अभी भी प्रदर्शित होता है।

उपरोक्त SO प्रश्न के लिंक के आधार पर httpErrors अनुभाग इस समय इस तरह दिखता है (मुझे एक और बहुत ही आशाजनक उत्तर मिला, हालांकि कोई भाग्य नहीं - खाली प्रतिक्रिया)

<system.webServer>
  <httpErrors  errorMode="DetailedLocalOnly" existingResponse="PassThrough" >
    <remove statusCode="401"  />
    <error statusCode="401" path="/Views/Shared/AccessDenied.htm" />
  </httpErrors>

 <!-- 
 <httpErrors  errorMode="Custom" 
             existingResponse="PassThrough" 
             defaultResponseMode="ExecuteURL">
      <remove statusCode="401"  />
  <error statusCode="401" path="~/Views/Shared/AccessDenied.htm" 
         responseMode="File" />
 </httpErrors>
 -->
</system.webServer>

मैंने iis.net से जानकारी के आधार पर applicationhost.config फ़ाइल को भी संशोधित किया applicationhost.config और <httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath"> <httpErrors lockAttributes="allowAbsolutePathsWhenDelegated"> को iis.net । मेरे प्रयासों के दौरान मैंने एक और एसओ प्रश्न में वर्णित इस त्रुटि पर भी ठोकर खाई।

मैं Asp.Net Mvc 3 में कस्टम त्रुटि पृष्ठों को कैसे प्रदर्शित करूं?

अतिरिक्त जानकारी

निम्नलिखित नियंत्रक कार्यों को एक विशिष्ट उपयोगकर्ता के लिए Authorise विशेषता के साथ सजाया गया है।

[HttpGet]
[Authorize(Users = "domain\\userXYZ")]
public ActionResult Edit() 
{
   return GetSettings();
}

[HttpPost]
[Authorize(Users = "domain\\userXYZ")]
public ActionResult Edit(ConfigurationModel model, IList<Shift> shifts)
{
    var temp = model;
    model.ConfiguredShifts = shifts;
    EsgConsole config = new EsgConsole();

    config.UpdateConfiguration(model.ToDictionary());
    return RedirectToAction("Index");
}

मैं web.config और एमवीसी में कस्टम एक साथ अच्छा खेलने के लिए कस्टमर्रॉर्स प्राप्त करने में सक्षम नहीं था, इसलिए मैंने छोड़ दिया। मैं इसके बजाय ऐसा करता हूँ।

Global.asax में:

protected void Application_Error()
    {
        var exception = Server.GetLastError();
        var httpException = exception as HttpException;
        Response.Clear();
        Server.ClearError();
        var routeData = new RouteData();
        routeData.Values["controller"] = "Errors";
        routeData.Values["action"] = "General";
        routeData.Values["exception"] = exception;
        Response.StatusCode = 500;
        if (httpException != null)
        {
            Response.StatusCode = httpException.GetHttpCode();
            switch (Response.StatusCode)
            {
                case 403:
                    routeData.Values["action"] = "Http403";
                    break;
                case 404:
                    routeData.Values["action"] = "Http404";
                    break;
            }
        }
        // Avoid IIS7 getting in the middle
        Response.TrySkipIisCustomErrors = true;
        IController errorsController = new GNB.LG.StrategicPlanning.Website.Controllers.ErrorsController();
        HttpContextWrapper wrapper = new HttpContextWrapper(Context);
        var rc = new RequestContext(wrapper, routeData);
        errorsController.Execute(rc);
    }

त्रुटियों में नियंत्रक:

public class ErrorsController
{
    public ActionResult General(Exception exception)
    {
        // log the error here
        return View(exception);
    }

    public ActionResult Http404()
    {
        return View("404");
    }

    public ActionResult Http403()
    {
        return View("403");
    }
}

Web.config में:

<customErrors mode="Off" />

यह मेरे लिए काम करता है इससे कोई फर्क नहीं पड़ता कि त्रुटि कहां या कैसे बनाई गई है। 401 अभी वहां नहीं संभाला गया है लेकिन आप इसे आसानी से जोड़ सकते हैं।


मैं इन चरणों का उपयोग करता हूं:

// in Global.asax.cs:
        protected void Application_Error(object sender, EventArgs e) {

            var ex = Server.GetLastError().GetBaseException();

            Server.ClearError();
            var routeData = new RouteData();
            routeData.Values.Add("controller", "Error");
            routeData.Values.Add("action", "Index");

            if (ex.GetType() == typeof(HttpException)) {
                var httpException = (HttpException)ex;
                var code = httpException.GetHttpCode();
                routeData.Values.Add("status", code);
            } else {
                routeData.Values.Add("status", 500);
            }

            routeData.Values.Add("error", ex);

            IController errorController = new Kavand.Web.Controllers.ErrorController();
            errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
        }

        protected void Application_EndRequest(object sender, EventArgs e) {
            if (Context.Response.StatusCode == 401) { // this is important, because the 401 is not an error by default!!!
                throw new HttpException(401, "You are not authorised");
            }
        }

तथा:

// in Error Controller:
    public class ErrorController : Controller {

        public ActionResult  Index(int status, Exception error) {
            Response.StatusCode = status;
            return View(status);
        }

        protected override void Dispose(bool disposing) {
            base.Dispose(disposing);
        }
    }

और त्रुटि फ़ोल्डर में अनुक्रमणिका दृश्य:

@* in ~/Views/Error/Index.cshtml: *@

@model Int32    
@{
    Layout = null;
}    
<!DOCTYPE html>    
<html>
<head>
    <title>Kavand | Error</title>
</head>
<body>
    <div>
        There was an error with your request. The error is:<br />
        <p style=" color: Red;">
        @switch (Model) {
            case 401: {
                    <span>Your message goes here...</span>
                }
                break;
            case 403: {
                    <span>Your message goes here...</span>
                }
                break;
            case 404: {
                    <span>Your message goes here...</span>
                }
                break;
            case 500: {
                    <span>Your message goes here...</span>
                }
                break;
            //and more cases for more error-codes...
            default: {
                    <span>Unknown error!!!</span>
                }
                break;
        }
        </p>
    </div>
</body>
</html>

और अंतिम चरण:

<!-- in web.config: -->

<customErrors mode="Off"/>

हो सकता है कि मुझे कुछ याद आ रहा है, लेकिन एमवीसी में एक डिफ़ॉल्ट वैश्विक ErrorHandlerAttribute जो कस्टम त्रुटियों का उपयोग करता है। यह here काफी अच्छी तरह से समझाया गया here

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
}

आपको बस इतना करना है कि कॉन्फ़िगरेशन में custom errors चालू करें, और फिर कस्टम त्रुटि रीडायरेक्ट सेट करें, अधिमानतः एक स्थिर HTML फ़ाइल (यदि ऐप के साथ त्रुटियां हैं) में सेट करें।

<customErrors mode="On" defaultRedirect="errors.htm">
    <error statusCode="404" redirect="errors404.htm"/>
</customErrors>

यदि आप पसंद करते हैं तो त्रुटियों को प्रदर्शित करने के लिए कस्टम Controller को भी इंगित कर सकते हैं। निम्नलिखित उदाहरण में मैंने Error नामक Controller को डिफ़ॉल्ट रूटिंग का उपयोग किया है, Index नामक एक क्रिया के साथ, और id नामक स्ट्रिंग पैरामीटर (त्रुटि कोड प्राप्त करने के लिए)। आप निश्चित रूप से अपनी इच्छानुसार किसी भी रूटिंग का उपयोग कर सकते हैं। आपका उदाहरण काम नहीं कर रहा है क्योंकि आप सीधे Controller माध्यम से बिना Views निर्देशिका में लिंक करने का प्रयास कर रहे हैं। एमवीसी .NET Views फ़ोल्डर को सीधे अनुरोध नहीं करता है।

<customErrors mode="On" defaultRedirect="/error/index/500">
    <error statusCode="404" redirect="/error/index/404"/>
</customErrors>

Controllers/Actions से संबंधित नामों में त्रुटियों को पुनर्निर्देशित करने के लिए ErrorHandlerAttribute को Controllers/Actions साथ बड़े पैमाने पर भी उपयोग किया जा सकता है। उदाहरण के लिए MyArgumentError नाम का View दिखाने के लिए जब ArgumentException प्रकार का अपवाद होता है तो आप इसका उपयोग कर सकते हैं:

[ControllerAction,ExceptionHandler("MyArgumentError",typeof(ArgumentException))]
public void Index()
{
   // some code that could throw ArgumentExcepton
}

बेशक एक और विकल्प शेयर में शेयर Error पृष्ठ को अद्यतन करना है।





http-error