我有一个 MVC3 网站,我正在尝试让 404 错误页面正确显示。我已经设置好了
- 不重定向 URL,
- 在标头中返回实际的 404 错误状态,
- 记录 URL,
- 是我创建的自定义页面,
- 并且是实际的操作/控制器页面,而不是 .aspx/.html 页面。
在 Visual Studio 中调试,效果很好。当我将它发布到我的测试或生产环境时,它不起作用并返回一个在标题中找不到 404 状态的通用文件。
错误页面不是默认的 404 错误( this或 this),但似乎是服务器本身的全局自定义(服务器托管多个站点,所有 404 显示相同的简单行页面)。服务器上的错误页面实际上显示了一个 500 错误页面。另外,我设置了 Response.TrySkipIisCustomErrors = true 来尝试绕过它,但这不起作用。
在生产和测试服务器上,它被正确记录,如果我没有返回 404 状态代码,它会显示我的错误页面。因此,我很确定动作/视图正在工作,但它在某种程度上与服务器有关。它运行 ASP.NET 4 和 IIS 7。
关于什么/在哪里调查以解决此问题的任何建议?
.
到目前为止,我的解决方案基于
如何在 ASP.NET MVC 中正确处理 404?
这是我通过在 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();
}