如何使用自定义错误并保留响应代码

本文关键字:保留 响应 代码 错误 何使用 自定义 | 更新日期: 2023-09-27 18:34:33

在我的web.config吹气中,你可以看到redirectMode="ResponseRewrite"。我读到这是我保留状态代码所需要的。不幸的是,一旦我把它放进去,我就会得到:

"处理您的请求时发生异常。此外,在执行第一个异常的自定义错误页时发生了另一个异常。请求已终止。

省略此变量成功地将我重定向到 ~/Error/Index.cshtml,但响应为 200。任何方向将不胜感激,谢谢。

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Index">
      <error statusCode="404" redirect="~/Error/Index"/>
      <error statusCode="500" redirect="~/Error/Index"/>
    </customErrors>
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
      <remove statusCode="403"/>
      <remove statusCode="404"/>
      <remove statusCode="500"/>
      <error statusCode="403" path="~/Error/Index" responseMode="File"/>
      <error statusCode="404" path="~/Error/Index" responseMode="File"/>
      <error statusCode="500" path="~/Error/Index" responseMode="File"/>
    </httpErrors>
  </system.webServer>

在我的过滤器配置中.cs:

public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            // does this conflict?
            filters.Add(new HandleErrorAttribute());
        }
    }

如何使用自定义错误并保留响应代码

不记得我在哪里看到过这段代码,或者我更改了什么,但它在我的 MVC Web 应用程序中工作正常

网络.config

<system.web>
    <compilation debug="true" targetFramework="4.5.1" />
    <httpRuntime targetFramework="4.5.1" />
    <customErrors mode="Off" />
  </system.web>

全球.aspx

protected void Application_EndRequest(Object sender, EventArgs e)
        {
            ErrorConfig.Handle(Context);
        }

错误配置.cs

namespace Web.UI.Models.Errors
{
    public static class ErrorConfig
    {
        public static void Handle(HttpContext context)
        {
            switch (context.Response.StatusCode)
            {
                case 401:
                    Show(context, 401);
                    break;
                case 404:
                    Show(context, 404);
                    break;
                case 500:
                    Show(context, 500);
                   break;
            }
        }
        //TODO uncomment 500 error
        static void Show(HttpContext context, Int32 code)
        {
            context.Response.Clear();
            var w = new HttpContextWrapper(context);
            var c = new ErrorController() as IController;
            var rd = new RouteData();
            rd.Values["controller"] = "Error";
            rd.Values["action"] = "Index";
            rd.Values["id"] = code.ToString(CultureInfo.InvariantCulture);
            c.Execute(new RequestContext(w, rd));
        }
    }
}

错误控制器

public class ErrorController : Controller
    {
        // GET: Error
        [HttpGet]
        public ViewResult Index(Int32? id)
        {
            var statusCode = id.HasValue ? id.Value : 500;
            var error = new HandleErrorInfo(new Exception("An exception with error " + statusCode + " occurred!"), "Error", "Index");
            int errorCode = statusCode;
            ViewBag.error = errorCode;
            return View("Error");
        }
    }

错误视图模型

namespace Web.UI.Models.Errors
{
    public class ErrorViewModel
    {
        public string DisplayErrorMessage   { get; set; }
        public string DisplayErrorPageTitle { get; set; }
    }
}

然后在共享文件夹错误页面中添加

@model Web.UI.Models.Errors.ErrorViewModel
@{
    int errorCode = Convert.ToInt32(@ViewBag.error);

    switch (errorCode)
    {
        case 404:
            ViewBag.Title = "404 Page Not Found";
            Html.RenderPartial("~/Views/Shared/ErrorPages/HttpError404.cshtml");
            break;
        case 500:
            ViewBag.Title = "Error Occurred";
            Html.RenderPartial("~/Views/Shared/_Error.cshtml");
            break;
        default:
            ViewBag.Title = @Model.DisplayErrorPageTitle;
            Html.RenderPartial("~/Views/Shared/ErrorPages/HttpNoResultsFound.cshtml");
            break;
    }
} 

上面返回页面未找到的 404 状态和错误 500 的状态,希望有帮助