代码之家  ›  专栏  ›  技术社区  ›  roufamatic

带wcf serviceroute的MVC2路由:html.actionlink呈现不正确的链接!

  •  25
  • roufamatic  · 技术社区  · 14 年前

    我有一个与MVC2网站并排运行的WCF服务。我希望该服务的URL如下所示:

    http://localhost/projdir/Service

    MVC站点还处于起步阶段,所以它仍然拥有所有的样板控制器等。

    以下代码在global.asax中第一眼就可以工作:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        routes.Add(new ServiceRoute("Service", new ServiceHostFactory(), 
                   typeof(MyService)));
    
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", 
                  id = UrlParameter.Optional } // Parameter defaults
        );
    }
    

    服务就出现在我描述的地方,工作方式如广告所示。伟大的。

    但是,我注意到用这种方式订购代码会改变 ActionLink 例如,MVC站点上的“关于”选项卡现在显示如下:

    http://localhost/projdir/Service?action=About&controller=Home

    这显然是错误的(应该是 http://localhost/projdir/Home/About/ )

    如果我移动 ServiceRoute 在默认值下添加 MapRoute() 打电话,然后我收到一个控制器丢失错误。(实际上,我得到一个“structureMapControllerFactory没有返回控制器的实例”错误,因为我连接了structureMap,duh,它不是控制器。)

    有趣的是,它似乎只影响 Html.ActionLink() . 我可以手动输入 http://localhost/projdir/home/about/关于/ 找到正确的页面。

    我犯了什么明显的新手错误?

    3 回复  |  直到 12 年前
        1
  •  18
  •   Steve Michelotti    14 年前

    尝试移动服务路线 之后 MVC路线。但是为了避免之前出现的“缺少控制器”错误,请添加MVC路由 具有 Route Constraint . 这些路由约束可以是regex-基本上您希望路由约束是 “服务”。当请求“服务”时,它将使其通过和他的WCF服务路由。

        2
  •  8
  •   js.dev    12 年前

    我决定:

         routes.MapRoute(
                 "Default", // Route name
                 "{controller}/{action}/{id}", // URL with parameters
                 new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                 new { controller = "^(?!api).*" }
            );
            routes.Add(new ServiceRoute("api", new DataServiceHostFactory(), typeof(dwService)));
    

    我希望这对你有好处

        3
  •  3
  •   VdesmedT    13 年前

    另一个解决方案是继承ServiceRoute并重写 GetVirtualPath 返回方法 null 如上所述 here

    public class AppServiceRoute : ServiceRoute
    {
        public AppServiceRoute(string routePrefix, ServiceHostFactoryBase serviceHostFactory, Type serviceType)
            : base(routePrefix, serviceHostFactory, serviceType)
        {
        }
    
        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            return null;
        }
    }
    

    这样,反向路由映射就不会为任何操作选择此路由。很有魅力