我在网上找到了几个例子(特别是在StackOverflow上),用于在ASP.NET MVC中创建一个包含所有路径,但这似乎对我在MVC4中没有用处:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("elfinder.connector");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "CatchAll",
url: "{*url}",
defaults: new { controller = "Home", action = "CatchAll" }
);
}
控制器操作定义为:
public ActionResult CatchAll(string url)
{
// catch the URL and use it for something
}
此处的目标是拦截所有可能的404错误,并根据URL,使用404或其他内容进行响应。但是,我从未在CatchAll
操作中结束,我只获得了以下网址的默认404:
我在这里做错了吗?我想避免必须抓住Application_Error
中的错误,如果它是404,则从那里重新转发。它看起来有点混乱。在我看来,处理这些请求的正确方法是简单地将它们路由到正确的操作,不是吗?
更新虽然我的网址纯粹主义者希望避免使用Response.Redirect
,但我目前正在尝试将以下内容作为请求的全局搜索:
protected void Application_Error()
{
Exception exception = Server.GetLastError();
HttpException httpException = exception as HttpException;
if (httpException != null)
if (httpException.GetHttpCode() == 404)
{
Server.ClearError();
Response.Redirect(String.Format("~/Home/CatchAll/?url={0}", Request.Path));
}
}
但是,这仅在URL的结构与路径匹配时才有效。否则看起来IIS甚至不会将请求发送到应用程序,它只是直接返回404。我需要一个全局处理程序,其中任何未映射到某个动作的网站所请求的URL都会被定向。
更新:看起来两件事的组合应该对我有用。首先,在Application_Error
(或Application_EndRequest
中捕获404,正如某些人所建议的那样,无论哪种方式都符合我的需要)涵盖了与路径结构匹配但未找到动作的任何内容。但是,仍然存在与路由结构不匹配的请求。
由于各种原因,我不想为此调整IIS。解决方案应包含在应用程序本身中。幸运的是,我可以保证最新的.NET和IIS,它允许我使用Web.config
设置来指示IIS如何处理错误。所以我现在正在尝试这个:
<httpErrors errorMode="Custom" defaultResponseMode="Redirect" defaultPath="/Home/CatchAll">
<clear/>
</httpErrors>
然而,这似乎并不完全正确。 影响IIS,因为错误响应已更改,但它仍然是错误响应。这是:
HTTP错误500.19 - 内部服务器错误
无法访问请求的页面,因为页面的相关配置数据无效。
所以看起来我走在正确的轨道上,我很难找到在httpErrors
中使用Web.config
发送所有404(或甚至所有错误)的工作示例,这对我的行动没什么影响。