使用WCF ServiceRoute的MVC2路由:Html.ActionLink呈现错误的链接!

rou*_*tic 25 wcf routing asp.net-mvc-3 asp.net-mvc-2

我有一个与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
    );
}
Run Code Online (Sandbox Code Playgroud)

该服务出现在我描述的地方,并按宣传的方式工作.大.

但是,我只是注意到以这种方式命令我的代码会改变我ActionLink的所有代码.例如,MVC站点上的"关于"选项卡现在显示如下:

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

这显然是不正确的(它应该是http://localhost/projdir/Home/About/).

如果我将ServiceRoute添加移动到默认MapRoute()调用之下,那么我将丢失控制器错误.(实际上我得到一个"StructureMapControllerFactory没有返回控制器的实例"错误,因为我已经连接了StructureMap,呃,它不是一个控制器开始.)

有趣的是,它似乎只影响了产量Html.ActionLink().我可以手动输入http://localhost/projdir/Home/About/并进入正确的页面.

我制作了一个非常明显的新手错误?

Ste*_*tti 19

尝试在MVC路由移动服务路由.但要避免"丢失控制"的错误,你以前有,添加MVC路线一个路由约束.这些路由约束可以是正则表达式 - 基本上你希望你的路由约束是任何不是 "服务"的控制器.当请求"服务"请求时,它将使其失效并且他的WCF服务路由.

  • 谢谢,这很有帮助.未来googlers的更正:我使用的模式实际上是`^(?!Service).*` (5认同)
  • 谢谢!我使用`new {controller ="^ {?!Service}"}作为约束,它就像一个魅力.你明白为什么服务路线不能在MVC路线之前吗? (2认同)

小智 9

我解决了这个问题:

     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)));
Run Code Online (Sandbox Code Playgroud)

我希望这对你有好处