我有一个MVC C#应用程序,我需要在发生错误时向用户显示特定视图。
因此,如果错误是代码= 200,代码= 404,代码= 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>
只有一个选项是必要的,还是我必须添加其中两个?
答案 0 :(得分:1)
所以我的问题是:在global.asax
中添加它是否足够
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
否,因为HandleErrorAttribute
只会捕获错误代码500(内部服务器错误)。
除了500之外你想要捕捉404(页面未找到),最好的方法是使用httpErrors
,因为它们也会捕获不匹配的404 \ n您定义的任何路线。
自定义错误只会捕获与路径匹配的404。例如,来自http://example.com/someNonExistantFile.html的404 将不会被自定义错误捕获(假设不存在与URL匹配的路由)。来自http://example.com/ControllerName/someNonExistentAction的404将被自定义错误捕获。
我在web.config httpErrors
部分中设置了system.webserver
:
<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响应代码。这样做可以防止谷歌和其他人将您的错误页面编入索引。
这是我使用的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");
}
}
答案 1 :(得分:1)
You can use very simple approach here.
You can use **Application_Error()** events and write it in **Global.asax**
file.Its called automatically whenever system generates any type of error
Note : Create "ErrorController" and inside that make one view with name
"Errors.cshtml"
protected void Application_Error(object sender, EventArgs e)
{
if (null != Context && null != Context.AllErrors)
{
Exception exception = Server.GetLastError().GetBaseException();
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (exception == null)
{
routeData.Values.Add("action", "Index");
}
else
{
routeData.Values.Add("action", "Errors");
routeData.Values.Add("exceptionValue", exception);
}
Response.TrySkipIisCustomErrors = true;
IController errorController = new ErrorsController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
}
答案 2 :(得分:0)
您可以在基本控件中创建自定义过滤器,然后在每个控制器中应用该过滤器,因此当出现任何错误时,它将捕获通用逻辑并呈现定义的视图/ html。
请看下面的帖子。我已经描述了如何处理服务器以及属性中的客户端错误。