1

I've been trawling through 1000s of questions and blogs and still don't fully understand dam routing!

Along the lines of Scott Hanselman's blog I am trying to route a certain call to a .GIF to a custom HttpHandler while the rest of the MVC4 site behaves normally. I'm 90% of the way there.

So in the my RouteConfig I have

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;
}

and in my web.config I have

<handlers>
  ...
  <add name="analytics" verb="*" path="analytics/a.gif" type="Lms.Analytics.AnalyticsHandler, Lms.Analytics" preCondition="managedHandler" />
</handlers>

Now this way, http://mysite.com/analytics/a.gif routes correctly and all is happy, however all my ActionLinks are resolving as http://mysite.com/analytics/a.gif?action=Index&controller=Category

If I reverse the order in the RouteConfig i.e.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
    routes.Add("AnalyticsRoute", new Route("analytics/a.gif", new AnalyticsRouteHandler()));
    routes.RouteExistingFiles = true;
}

All the links resolve just fine, but a call to http://mysite.com/analytics/a.gif results in a 404 error?

I must be doing something stupid and just can't see it?!

Thanks in advance

4

3 回答 3

2

在终于看到一个类似的帖子后,我破解了它。帖子是为什么 httphandler 没有运行

您需要忽略您希望 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。我猜路由引擎过度统治了处理程序。

于 2013-06-13T07:15:26.913 回答
1

您需要做的是创建自己的自定义Route类。

在此类中,您必须覆盖该GetVirtualPath方法(在 MSDN 上),该方法将检查路由数据并生成正确的 Url。实现它,以便null如果您的特殊 Url 不在提供的 URL中,它会返回RequestContext

现在在您的应用程序中发生的事情是您正在使用标准Route类,它将RouteValue字典中的控制器和操作视为溢出参数,因此它们被添加到创建的 url。

当您将路由添加到路由集合时,请使用您的自定义类而不是默认Route类。

更多解释:当你使用任何方法比如Url.Action创建一个 Url 时,RouteCollection.GetVirtualPath都会被调用。并且此方法调用GetVirtualPath每个已注册的Route,直到其中一个返回不同于 null 的值(Url 字符串)。由于您没有提供自己的类,因此正在使用Route“标准”类,并返回不需要的 Url。Route如果您Route使用自己的实现创建自定义类,GetVirtualPath您将返回所需的 Url。

于 2013-06-12T11:47:47.350 回答
0

根据 Hanselman 的文章,您不想为图像添加路由,您只想在web.config. 你试过删除你的AnalyticsRoute,看看它是否有效?您可能还需要添加忽略路由以阻止 MVC 尝试处理请求。

我没有使用过它,但我听说由 Phil Haack 编写的RouteMagic 非常擅长解决路由问题。

于 2013-06-12T11:48:42.217 回答