在mvc中将状态代码500更改为404

时间:2015-11-10 11:03:50

标签: asp.net-mvc asp.net-mvc-4 custom-errors

我想将我的所有错误重定向到mvc 4中状态代码为404的一个操作, 我已将此设置为web配置,但当发生内部错误时,页面将重定向到我的404操作,但状态代码为500

 <customErrors defaultRedirect="/_404" mode="On" redirectMode="ResponseRewrite">

    <error statusCode="404"
       redirect="http://www.khanoumi.com/_404"/>
<error statusCode="500"
       redirect="http://www.khanoumi.com/_404"/>
  </customErrors>

这也是我的行动:

 public ActionResult Index()
        {
            Server.ClearError();
            Response.Clear();
            Response.ClearHeaders();
            Response.StatusCode = 404;
            Response.TrySkipIisCustomErrors = true;
            return View();
        }

1 个答案:

答案 0 :(得分:1)

您可以使用

强制404错误
throw new HttpException(404, "Your error message");

或者对于Asp.Net MVC 4,您可以使用:

if (condition)
{
    return HttpNotFound("Your error message");
}

此外,您可以为此目的创建自定义属性,例如:

public class HandleNotFoundAttribute : ActionFilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        var httpException = filterContext.Exception.GetBaseException() as HttpException;
        if (httpException != null && (httpException.GetHttpCode() == 404 ||
                                      httpException.GetHttpCode() == 500))
        {
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.StatusCode = (int) HttpStatusCode.NotFound;
            filterContext.Result = new ViewResult
                                {
                                  ViewName = "404",
                                  ViewData = filterContext.Controller.ViewData
                                };
        }
    }
}