我已将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"为什么他们选择服务路线呢?)以及如何修复它?
答案 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"开始的控制器名称。