2014-12-06 62 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