ASP.NET MVC服务路由覆盖默认路由

时间:2015-03-17 05:07:44

标签: c# asp.net-mvc asp.net-mvc-5

我已将WCF服务添加到MVC 5应用程序,并为其创建了一个路径:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.Add(new ServiceRoute("Service1.svc", new ServiceHostFactory(), typeof(Service1)));
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

问题是我的所有链接现在都会导致Service1.svc路由。 @Html.ActionLink("Passport Maker", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })成为http://localhost:50099/Service1.svc?action=Index&controller=Home,其他链接也会以同样的方式发生变化。

如果我在&#34之后添加ServiceRoute;默认"路由,链接正常,但服务不可用。

为什么会发生(在链接中没有" Service1"为什么他们选择服务路线呢?)以及如何修复它?

1 个答案:

答案 0 :(得分:2)

解决方案:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    constraints: new { controller = "^(?!Service1.svc).*" }
);

routes.Add(new ServiceRoute("Service1.svc", new ServiceHostFactory(), typeof(Service1)));

对可能遇到类似问题的人的解释:问题的原因是Html.ActionLink使用第一个匹配路由来生成链接。我的服务路线是第一个并且是匹配的,因为路线不需要包含{controller}{action}参数来匹配(正如我最初想的那样)。

解决方案是先将默认路由放入,Html.ActionLink使用它。并且仍然能够使用服务路由,需要使用约束将其从第一个路由中排除。正则表达式^(?!Service1.svc).*仅匹配那些不会从" Service1.svc"开始的控制器名称。