Asp.net mvc 以一种方式路由.GIF,MVC4站点的其余部分以另一种方式路由
我已经浏览了1000多个问题和博客,仍然不完全了解大坝的路线 在MVC4站点的其余部分正常运行时,我尝试将对.GIF的某个调用路由到一个定制的HttpHandler。我有90%的路要走 所以在我的路线图中我有Asp.net mvc 以一种方式路由.GIF,MVC4站点的其余部分以另一种方式路由,asp.net-mvc,asp.net-mvc-4,asp.net-mvc-routing,asp.net-routing,Asp.net Mvc,Asp.net Mvc 4,Asp.net Mvc Routing,Asp.net Routing,我已经浏览了1000多个问题和博客,仍然不完全了解大坝的路线 在MVC4站点的其余部分正常运行时,我尝试将对.GIF的某个调用路由到一个定制的HttpHandler。我有90%的路要走 所以在我的路线图中我有 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.Add("AnalyticsRoute"
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add("AnalyticsRoute", new Route("analytics/a.gif", new AnalyticsRouteHandler()));
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
routes.RouteExistingFiles = true;
}
<handlers>
...
<add name="analytics" verb="*" path="analytics/a.gif" type="Lms.Analytics.AnalyticsHandler, Lms.Analytics" preCondition="managedHandler" />
</handlers>
在我的web.config中
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add("AnalyticsRoute", new Route("analytics/a.gif", new AnalyticsRouteHandler()));
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
routes.RouteExistingFiles = true;
}
<handlers>
...
<add name="analytics" verb="*" path="analytics/a.gif" type="Lms.Analytics.AnalyticsHandler, Lms.Analytics" preCondition="managedHandler" />
</handlers>
所有链接的解析都很好,但是调用会导致404错误吗
我一定是在做傻事,就是看不见
提前感谢您需要做的是创建自己的自定义
路线
类
在这个类中,您必须重写GetVirtualPath
方法(),该方法将检查路由数据并生成正确的Url。实现它,使其返回null
,如果您的特殊Url不在提供的RequestContext
中
你的应用程序现在使用的是标准的Route
类,它将RouteValue
字典中的控制器和操作视为溢出参数,因此它们被添加到创建的url中
将路线添加到路线集合时,请使用自定义类,而不是默认的route
类
更多说明:当您使用诸如Url.Action
之类的任何方法创建Url时,将调用RouteCollection.GetVirtualPath
。这个方法调用每个注册的路由的GetVirtualPath
,直到其中一个返回一个不同于null的值(Url字符串)。
由于您没有提供自己的路由
类,因此正在使用“标准”路由
类,并返回不需要的Url。如果您使用自己的GetVirtualPath
实现创建自定义的Route
类,您将返回所需的Url。根据Hanselman的文章,您不想为图像添加路由,只需要在web.config
中设置处理程序。您是否尝试过删除分析路线
,并查看它是否有效?您可能还需要添加忽略路由,以防止MVC尝试处理请求
我没有用过它,但我听说Phil Haack写的这篇文章非常擅长解决路线问题。在最后看到一篇类似的文章后,我破解了它。该职位是
您需要忽略希望HttpHandler处理的文件的路径
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("analytics/a.gif");
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
routes.RouteExistingFiles = true;
}
问题是当我添加web.config并删除Route.Add时,我得到了一个404。我猜路由引擎过度控制了处理程序。Hmm,这可能也起了作用,但这不是我想要追求的路径。我确信它可以在HttpHandlers中处理。对不起,我没试过,用另一种方法解决了。你是怎么解决的?您应该共享您的解决方案,这样我们都可以看到它,并将其标记为正确的(我认为您可以在2天后执行)。这不是我从Hasselmans文章中得到的,我知道您可以使用runAllManagedModulesForAllRequests=“false”四处走动。Quote:“请记住,HttpHandler是针对特定路径、文件或通配符的,HttpModules总是在监视。为什么不直接使用HttpHandler并将其插入web.config级别,然后设置runAllManagedModulesForAllRequests=“false”?”他没有提到如何处理Route.Add。我试着把它移除,但只得到了404。无论如何谢谢你。