【问题标题】:ASP.NET MVC service route overrides default routeASP.NET MVC 服务路由覆盖默认路由
【发布时间】:2015-03-17 05:07:43
【问题描述】:

我已将 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 和其他链接的变化方式相同。

如果我在“默认”路由之后添加 ServiceRoute,链接可以正常工作,但服务不可用。

为什么会发生(链接中没有“Service1”,为什么他们选择服务路由呢?)以及如何解决?

【问题讨论】:

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


【解决方案1】:

解决办法:

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”开头的控制器名称。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2010-11-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多