Asp.net mvc 以一种方式路由.GIF,MVC4站点的其余部分以另一种方式路由

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"

我已经浏览了1000多个问题和博客,仍然不完全了解大坝的路线

在MVC4站点的其余部分正常运行时,我尝试将对.GIF的某个调用路由到一个定制的HttpHandler。我有90%的路要走

所以在我的路线图中我有

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。无论如何谢谢你。