2014-12-06 99 views
3

我有两个项目的解决方案。一个是ASP.NET Web API项目,另一个是ASP.NET MVC项目。网络API将从各种客户端消费。如果2个项目是一个我可以生成这样的链接,我的API:从ASP.NET MVC应用程序访问Web API路由

@Url.RouteUrl("ActionApi", new { httpRoute = string.Empty, controller = "User", action = "AddChildAsync" }); 

但现在,这两个项目是分离的,我不能这样做,因为MVC机应用无法找到该网页API的配置(虽然我有一个从mvc应用程序到web api的项目参考)。那么是否有任何优雅的方式来访问web api配置并动态生成链接?提前致谢。

+0

的配置的WebAPI是全球性的应用程序,所以如果你只是添加的WebAPI NuGet包到MVC项目,也许System.Web.Http命名空间添加到您的意见/ web.config中,是否不工作? – Rhumborl 2014-12-06 12:03:52

+0

@Rhumborl我尝试了你的建议,但是我得到了同样的错误('在Route集合中找不到'名为'ActionApi'的路由')。感谢您的回答。 – 2014-12-06 12:13:30

回答

2

您应该可以通过更改httproute = true来访问它。

@Url.RouteUrl("ActionApi", new { httpRoute = true, controller = "User", action = "AddChildAsync" }); 

或者你可以这样做来指定它的webapi路由。

@Url.HttpRouteUrl("ActionApi", new { controller = "User", action = "AddChildAsync" }); 

但是您确实需要在您的Global.asax中完成WebApi注册并安装了NuGet WebApi软件包。

另外,通常情况下,行动并未包含在路线中,正如您在链接中引用的那样。它们通常是未命名的,并通过请求提供(GET,POST PUT等)。这些被省略,除非你的路由配置看起来像这样。

routes.MapHttpRoute(
name: "ActionApi", 
routeTemplate: "api/{controller}/{action}/{id}", 
defaults: new { id = RouteParameter.Optional }); 
+0

谢谢你的回答。你的解决方案就像一个魅力。我已经修改了默认路由,这就是为什么我将路由添加到路由中的原因。 – 2014-12-07 12:37:12

1

我曾经有过类似的问题。

我的解决方案是为您的项目(MVC和WebApi)之间共享的每个WebApi控制器创建接口。为每个WebApi控制器添加一个操作(我将其称为“路由”操作),该操作返回键值元素的序列化集合,其中键是接口(WebApi)方法名称和值是包含路由和http方法(获取,发布等)(它是在WebApi项目中构建的,因此您可以访问它的路由表)。在MVC应用程序开始,您可以向您的WebApi路由操作发出请求并获取它的所有路由。然后,您可以将其存储在全局只读字典中以便快速访问。获取特定的路由变成一项简单的任务,因为您的接口方法名称是您先前填充的字典的关键。

+0

谢谢你的回答。您的解决方案看起来像个好主意。 – 2014-12-07 12:42:13