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

时间:2014-12-16 19:55:52

标签: 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>

在我的filterconfig.cs中:

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

1 个答案:

答案 0 :(得分:1)

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

的Web.config

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

Global.aspx

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

ErrorConfig.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));
        }
    }
}

ErrorController

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");
        }
    }

ErrorsViewModel

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表示错误,希望有帮助