【发布时间】:2012-07-12 19:00:49
【问题描述】:
我有一个 MVC3 网站,我正在尝试正确显示 404 错误页面。我已经把它全部设置好了
- 不重定向 URL,
- 在标头中返回实际的 404 错误状态,
- 记录 URL,
- 是我创建的自定义页面,
- 并且是实际的操作/控制器页面,而不是 .aspx/.html 页面。
在 Visual Studio 中调试,效果很好。当我将它发布到我的测试或生产环境时,它不起作用并返回一个找不到标题中的 404 状态的通用文件。
错误页面不是默认的 404 错误(this 或 this),但似乎是服务器本身的全局自定义(服务器托管多个站点,所有 404 显示相同的简单行页面)。服务器上的错误页面实际上显示了一个 500 错误页面。另外,我设置了 Response.TrySkipIisCustomErrors = true 来尝试绕过它,但这不起作用。
在生产和测试服务器上,它被正确记录,如果我没有返回 404 状态代码,它会显示我的错误页面。因此,我很确定动作/视图正在工作,但它在某种程度上与服务器有关。它运行 ASP.NET 4 和 IIS 7。
有什么建议/在哪里调查以解决此问题?
。
到目前为止我的解决方案基于的代码资源
How can I properly handle 404 in ASP.NET MVC?
这是我在 Application_Error 中捕获异常的基础;我还是有点警惕它,因为它很容易导致循环,所以我尝试/捕获了一切以防止这种情况发生(错误发生在捕获另一个错误中)
global.asax 中的代码
protected void Application_Error(object sender, EventArgs e)
{
try
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = exception as HttpException;
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpException == null)
{
routeData.Values.Add("action", "NotFound");
}
else
{
switch (httpException.GetHttpCode())
{
case 404:
// Page not found.
routeData.Values.Add("action", "NotFound");
break;
case 500:
// Server error.
routeData.Values.Add("action", "ServerError");
break;
default:
routeData.Values.Add("action", "General");
break;
}
}
routeData.Values.Add("error", exception);
Server.ClearError();
Response.TrySkipIisCustomErrors = true;
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(
new HttpContextWrapper(Context), routeData));
}
catch
{
//
}
}
错误控制器中的代码
public ActionResult NotFound()
{
try
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
Response.TrySkipIisCustomErrors = true;
}
catch
{}
return View();
}
【问题讨论】:
标签: asp.net asp.net-mvc-3 iis error-handling http-status-code-404