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

Fre*_*son 6 c# asp.net-mvc-5

在我的web.config打击你可以看到redirectMode ="ResponseRewrite".我读到这是保存状态代码所需要的.不幸的是,只要我有它,我得到:

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

省略此变量成功将我重定向到〜/ Error/Index.cshtml但响应为200. doh.任何方向都将非常感谢,谢谢.

<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>
Run Code Online (Sandbox Code Playgroud)

在我的filterconfig.cs中:

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

Geo*_*son 1

不记得我在哪里看到了这段代码,或者我更改了什么,但它在我的 MVC Web 应用程序中运行良好

网页配置

<system.web>
    <compilation debug="true" targetFramework="4.5.1" />
    <httpRuntime targetFramework="4.5.1" />
    <customErrors mode="Off" />
  </system.web>
Run Code Online (Sandbox Code Playgroud)

全局.aspx

protected void Application_EndRequest(Object sender, EventArgs e)
        {
            ErrorConfig.Handle(Context);
        }
Run Code Online (Sandbox Code Playgroud)

错误配置.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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

错误控制器

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");
        }
    }
Run Code Online (Sandbox Code Playgroud)

错误视图模型

namespace Web.UI.Models.Errors
{
    public class ErrorViewModel
    {
        public string DisplayErrorMessage   { get; set; }
        public string DisplayErrorPageTitle { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@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;
    }
} 
Run Code Online (Sandbox Code Playgroud)

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