是否可以创建一个最终路由来捕获所有 .. 并将用户反弹到 ASP.NET MVC 中的 404 视图?
注意:我不想在我的 IIS 设置中进行设置。
是否可以创建一个最终路由来捕获所有 .. 并将用户反弹到 ASP.NET MVC 中的 404 视图?
注意:我不想在我的 IIS 设置中进行设置。
自己找到了答案。
理查德·丁沃尔 (Richard Dingwall ) 有一篇出色的文章,介绍了各种策略。我特别喜欢 FilterAttribute 解决方案。我不喜欢随意抛出异常,所以我会看看我是否可以改进:)
对于 global.asax,只需将此代码添加为您注册的最后一条路线:
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "StaticContent", action = "PageNotFound" }
);
这个问题首先出现,但更简单的答案出现在后面的问题中:
我通过创建返回本文中的视图的 ErrorController 使我的错误处理工作。我还必须将“Catch All”添加到 global.asax 中的路线。
如果它不在 Web.config.. 中,我看不到它如何到达这些错误页面中的任何一个?我的 Web.config 必须指定:
customErrors mode="On" defaultRedirect="~/Error/Unknown"
然后我还补充说:
error statusCode="404" redirect="~/Error/NotFound"
希望这可以帮助。
我现在喜欢这种方式,因为它很简单:
<customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="~/Error/PageNotFound/" />
</customErrors>
您也可以在 Global.asax.cs 中处理 NOT FOUND 错误,如下所示
protected void Application_Error(object sender, EventArgs e)
{
Exception lastErrorInfo = Server.GetLastError();
Exception errorInfo = null;
bool isNotFound = false;
if (lastErrorInfo != null)
{
errorInfo = lastErrorInfo.GetBaseException();
var error = errorInfo as HttpException;
if (error != null)
isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound;
}
if (isNotFound)
{
Server.ClearError();
Response.Redirect("~/Error/NotFound");// Do what you need to render in view
}
}
在您的项目根 web.config 文件下添加此行。
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" />
<error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" />
<remove statusCode="500" />
<error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" />
</httpErrors>
<modules>
<remove name="FormsAuthentication" />
</modules>
这可能是您使用时的问题
throw new HttpException(404);
当你想抓住它时,我不知道还有什么其他方法可以编辑你的网络配置。
创建包罗万象的路线的另一种方法是Application_EndRequest
向您的MvcApplication
per Marco's Better-Than-Unicorns MVC 404 Answer添加一个方法。
在里面RouterConfig.cs
添加以下代码:
routes.MapRoute(
name: "Error",
url: "{id}",
defaults: new
{
controller = "Error",
action = "PageNotFound"
});
如果无法解析路由,则 MVC 框架将通过 404 错误.. 最好的方法是使用异常过滤器...创建自定义异常过滤器并像这样..
public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
public void OnException(ExceptionContext filterContext) {
filterContext.Result = new RedirectResult("~/Content/RouteNotFound.html");
}
}