【发布时间】:2018-09-02 11:11:12
【问题描述】:
我知道有几种方法可以捕获 404 和 500 错误。例如,我可以使用 web.config、route.config、global.asax 和一个控制器;但是,我没有将代码放在哪里以使其捕获这些错误。让我告诉你我做了什么。
路线配置:
route.config 适用于 404 错误,但不适用于 500 错误(据我所知)。无论如何,我不想使用它,因为我听说它有一些缺点。此外,这似乎是 IMO 这个问题的一个非常糟糕的解决方案。
网络/网络配置:
我已经尝试了所有可能的 Web 配置文件:web.config(system.web 和 system.webServer)和 Web.config(system.web 和 system.webServer)以及 Web 调试文件(system.web和 system.webServer)。所有这些都没有发现错误(这让我很沮丧,因为没有人会告诉我将代码准确放在哪里以便它捕获。即 place1 -> place2 -> place3 -> 等......每个答案都给了我代码或者说 Web.config 或 web.config - 我知道但在 Web.config 或 web.config 中的 WHERE?)我听说这种方式有限制,但它们与我无关。我知道它只适用于 IIS 7+。我认为我的团队和我正在使用 IIS 8,所以这对我来说应该不是问题。 我更喜欢 global.asax 或 web.config/Web.config 中的方法。
全球 Asax:
我正在使用两个应用程序错误处理程序方法 Application_EndRequest 和 Application_Error,它们都不起作用。我得到的唯一错误是 200 错误(此错误仅由 EndRequest 捕获),这不是错误,而是完全相反。我不知道为什么当我的页面显示 404 错误时我会得到这个。据我所知,这是因为 Global Asax 没有被编程来捕捉这些错误,而是 web.config 和/或 Web.config,正如你所知,我不知道如何让它工作。我会接受 global.asax 解决方案,因为我还没有听说过它有任何不好的地方。
控制器:
我只尝试了一种解决方案:protected override void HandleUnknownAction(string actionName),该解决方案要求在 route.config 中设置路由 {*url}。惊喜,惊喜,这也不起作用(如预期的那样)。我了解到这个解决方案使用代码{*url} 来查找 404 错误(或者至少它是我搜索的解决方案。)正如我之前所说,我不想要 route.config 解决方案。如果我是正确的,protected override void HandleUnknownAction(string actionName) 可能在全球范围内工作,但不适用于我。
尝试过的解决方案:
protected override void HandleUnknownAction(string actionName)protected void Application_EndRequest()protected void Application_Error(object sender, EventArgs e)protected override void OnException(ExceptionContext filterContext)
5.
<system.webServer>
<httpErrors errorMode="Custom" defaultResponseMode="File" >
<remove statusCode="404" />
<remove statusCode="500" />
<error statusCode="404"
path="404.html" />
<error statusCode="500"
path="500.html" />
</httpErrors>
</system.webServer>
6.
<httpErrors>
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" prefixLanguageFilePath=""
path="http://yoursite.com/index.asp?syserror" responseMode="Redirect" />
</httpErrors>
7.
<customErrors mode="On">
<error statusCode="404" redirect="/Custom404.html" />
<error statusCode="500" redirect="/Custom500.html" />
</customErrors>
8.
routes.MapRoute(
"Error", // Route name
"Error/{errorCode}", // URL with parameters
new { controller = "Page", action = "Error", errorCode= UrlParameter.Optional }
);
9.
if (Context.Response.StatusCode == 404)
{
Response.Clear();
var rd = new RouteData();
rd.DataTokens["area"] = "AreaName"; // In case controller is in another area
rd.Values["controller"] = "Errors";
rd.Values["action"] = "NotFound";
IController c = new ErrorsController();
c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
}
10.
Exception exception = Server.GetLastError();
// Log the exception.
ILogger logger = Container.Resolve<ILogger>();
logger.Error(exception);
Response.Clear();
HttpException httpException = exception as HttpException;
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpException == null)
{
routeData.Values.Add("action", "Index");
}
else //It's an Http Exception, Let's handle it.
{
switch (httpException.GetHttpCode())
{
case 404:
// Page not found.
routeData.Values.Add("action", "HttpError404");
break;
case 500:
// Server error.
routeData.Values.Add("action", "HttpError500");
break;
// Here you can handle Views to other error codes.
// I choose a General error template
default:
routeData.Values.Add("action", "General");
break;
}
}
注意:首先,我可能已经调整了其中的一些解决方案以适应我的代码,其次,我不相信这些解决方案。我在其他论坛页面上找到了大多数(如果不是全部)解决方案。第三,唯一有效的解决方案是第 8 个;但是,我相信它只适用于 404。不过,我不想使用它,因为我认为这是一个糟糕的解决方案(如果我错了,请纠正我。)
结论:
我并不是要你为我解决问题。我只需要两件事:一,如果我被误导(通过评论或回答),我需要得到纠正;第二,我需要知道将代码放在哪里以及代码的结果(通过图片或说明)。如果您放置以下内容:
这是对我有用的代码
[在此处插入代码]
[插入更多描述]
我很可能会复制代码、更改它、尝试它,如果/当它失败时,我不可避免地会感到沮丧。如果您能花时间解释如何捕获 404 错误以及 global.asax 或 web/Web 配置解决方案,我将不胜感激。我已经为这个问题苦苦挣扎了一段时间,我已经投入了大量的时间和精力,只是得到了模糊的解决方案,几乎没有解释为什么它会捕获 404/500 错误或将它放在哪里,没错。
编辑:
这里是我想打的错误方法。我可以向您保证,它们在我的 route.config 中使用routes.MapMvcAttributeRoutes();进行路由
[Route("~/page_not_found")]
public ActionResult PageNotFound()
{
Response.StatusCode = 404;
return View();
}
[Route("~/internal_server_error")]
public ActionResult InternalServerError()
{
Response.StatusCode = 500;
return View();
}
【问题讨论】:
标签: c# asp.net asp.net-mvc http-status-code-404 http-status-code-500