ASP.NET MVC 自定义错误页面无法正常工作
ASP.NET MVC custom error page not working correctly
我正在尝试配置 ASP.NET MVC 自定义错误页面。
我添加了一个带有 Index
和 PageNotFound
操作的 Error
控制器。我还将以下内容添加到 web.config 文件的 <system.web>
部分。
<customErrors mode="On" defaultRedirect="~/Error">
<error statusCode="404" redirect="~/Error/PageNotFound"/>
<error statusCode="500" redirect="~/Error" />
</customErrors>
如果我输入 URL,例如 http://www.example.com/Home/BadPage,我确实看到了我的错误处理程序。
但是,任何人都可以帮助我了解以下问题以及如何解决这些问题吗?
- 在上面的例子中,似乎 return 发送到浏览器的结果代码是 200 而不是 404。因此 Google 等爬虫不会指示 URL 未找到。
- 在某些情况下,如果我的控制器操作确定 URL 无效,则操作将 return
HttpNotFound()
作为结果。但是当发生这种情况时,我的自定义错误处理程序页面 不会 显示。相反,它显示一个看似来自 IIS 的通用 404 页面。
我使用的是 Visual Studio 和 MVC 的当前版本。
除了在web.config里面设置,还要检查里面的Exception是不是HttpException 404 =]Application_Error.
<customErrors defaultRedirect="~/Common/Error" mode="On">
<error statusCode="404" redirect="~/Common/PageNotFound"/>
</customErrors>
Global.asax.cs
protected void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();
// Process 404 HTTP errors
var httpException = exception as HttpException;
if (httpException != null && httpException.GetHttpCode() == 404)
{
Response.Clear();
Server.ClearError();
Response.TrySkipIisCustomErrors = true;
IController controller = new CommonController();
var routeData = new RouteData();
routeData.Values.Add("controller", "Common");
routeData.Values.Add("action", "PageNotFound");
var requestContext = new RequestContext(
new HttpContextWrapper(Context), routeData);
controller.Execute(requestContext);
}
}
通用控制器
您还想 return Response.StatusCode = 404;
里面的 PageNotFound 操作方法。
public class CommonController : Controller
{
[AllowAnonymous]
public ActionResult PageNotFound()
{
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true;
return View();
}
[AllowAnonymous]
public ActionResult Error()
{
Response.StatusCode = 503;
Response.TrySkipIisCustomErrors = true;
return View();
}
}
我正在尝试配置 ASP.NET MVC 自定义错误页面。
我添加了一个带有 Index
和 PageNotFound
操作的 Error
控制器。我还将以下内容添加到 web.config 文件的 <system.web>
部分。
<customErrors mode="On" defaultRedirect="~/Error">
<error statusCode="404" redirect="~/Error/PageNotFound"/>
<error statusCode="500" redirect="~/Error" />
</customErrors>
如果我输入 URL,例如 http://www.example.com/Home/BadPage,我确实看到了我的错误处理程序。
但是,任何人都可以帮助我了解以下问题以及如何解决这些问题吗?
- 在上面的例子中,似乎 return 发送到浏览器的结果代码是 200 而不是 404。因此 Google 等爬虫不会指示 URL 未找到。
- 在某些情况下,如果我的控制器操作确定 URL 无效,则操作将 return
HttpNotFound()
作为结果。但是当发生这种情况时,我的自定义错误处理程序页面 不会 显示。相反,它显示一个看似来自 IIS 的通用 404 页面。
我使用的是 Visual Studio 和 MVC 的当前版本。
除了在web.config里面设置,还要检查里面的Exception是不是HttpException 404 =]Application_Error.
<customErrors defaultRedirect="~/Common/Error" mode="On">
<error statusCode="404" redirect="~/Common/PageNotFound"/>
</customErrors>
Global.asax.cs
protected void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();
// Process 404 HTTP errors
var httpException = exception as HttpException;
if (httpException != null && httpException.GetHttpCode() == 404)
{
Response.Clear();
Server.ClearError();
Response.TrySkipIisCustomErrors = true;
IController controller = new CommonController();
var routeData = new RouteData();
routeData.Values.Add("controller", "Common");
routeData.Values.Add("action", "PageNotFound");
var requestContext = new RequestContext(
new HttpContextWrapper(Context), routeData);
controller.Execute(requestContext);
}
}
通用控制器
您还想 return Response.StatusCode = 404;
里面的 PageNotFound 操作方法。
public class CommonController : Controller
{
[AllowAnonymous]
public ActionResult PageNotFound()
{
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true;
return View();
}
[AllowAnonymous]
public ActionResult Error()
{
Response.StatusCode = 503;
Response.TrySkipIisCustomErrors = true;
return View();
}
}