我有一个MVC C#应用程序,当发生错误时,我需要向用户显示一个特定的视图。
因此,如果错误是code=200、code=404、code=500或任何其他错误,我只需显示位于~/Views/Shared/Error.cshtml中的错误视图,并提供一条通用消息。
所以我的问题是:在global.asax中添加这个是否足够?
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}还是我也需要这样修改我的web.config:
<customErrors mode="RemoteOnly">
<error statusCode="404" redirect="~/Views/Shared/Error.cshtml"/>
<error statusCode="500" redirect="~/Views/Shared/Error.cshtml"/>
</customErrors>只有其中一个选项是必要的,还是我必须增加其中的两个?
发布于 2017-06-27 21:49:00
所以我的问题是:在global.asax中添加这个是否足够?
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}否,因为HandleErrorAttribute只捕获错误代码500 (内部服务器错误)。
如果您想要在500之外捕获404(未找到页面),最好的方法是使用httpErrors,因为它们还会捕获与您定义的任何路由不匹配的404。
自定义错误将只捕获与路由匹配的404。例如,404FROM:http://example.com/someNonExistantFile.html不会被自定义错误捕获(假设不存在匹配该URL的路由)。来自http://example.com/ControllerName/someNonExistentAction的404将被自定义错误捕获。
我在web.config system.webserver部分中设置了这样的web.config:
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="400" subStatusCode="-1" />
<remove statusCode="403" subStatusCode="-1" />
<remove statusCode="404" subStatusCode="-1" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="400" path="/Error/BadRequest" responseMode="ExecuteURL"/>
<error statusCode="403" path="/Error/NotAuthorized" responseMode="ExecuteURL" />
<error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" />
<error statusCode="500" path="/Error" responseMode="ExecuteURL" />
</httpErrors>然后,在我的错误控制器中,我相应地设置http响应代码。这样做可以防止google和其他人为您的错误页面建立索引。
下面是我使用的ErrorController:
[AllowAnonymous]
public class ErrorController : Controller
{
public ActionResult Index()
{
Response.StatusCode = 500;
return View("Error");
}
public ViewResult BadRequest()
{
Response.StatusCode = 400;
return View("BadRequest");
}
public ViewResult NotFound()
{
Response.StatusCode = 404;
return View("NotFound");
}
public ViewResult NotAuthorized()
{
Response.StatusCode = 403;
return View("NotAuthorized");
}
}https://stackoverflow.com/questions/44789117
复制相似问题