2012-05-20 86 views
38

如何在一個項目中混合使用Web API和ASP.Net MVC頁面?在一個項目中混合使用Web Api和ASP.Net MVC頁面

例如,我有型號的用戶。我希望在同一個項目中擁有一個ApiController,它將響應所有用於管理用戶實體的HTTP動詞,並同時擁有一個Controller,根據請求的Action請求返回相應的強類型視圖。

我無法命名兩個控制器UserController。最好的解決辦法是什麼?我應該命名一個UserApiController和另一個UserController嗎?還有其他建議嗎?

+0

顯而易見的答案是有兩個名稱不同的控制器。你想要做什麼? – tzerb

+0

我只是尋找一個優雅的結構,讓我在同一個項目中做到這一點。我想一個單獨的命名空間是一個好主意。 –

回答

38

您可以將它們放在單獨的名稱空間中,例如MyApp.Controllers.UsersController和MyApp.Controllers.WebAPI.UsersController。

這將讓你在MVC和的WebAPI,如暴露類似的URI路徑:

/users/1  << MVC view 
/api/users/1 << Web API 
+0

謝謝。我喜歡這個比不同的命名類更好。 –

+15

然後在組合項目中設置兩個默認路由的正確方法是什麼? – BuddyJoe

+0

@MikeWasson只是爲了澄清 - 你是否建議一個控制器類有兩個命名空間? – AndrewRalon

8

的執行的WebAPI應添加爲MVC應用程序的獨立Area。這是天作之合。這樣做可以爲您提供Mike Wasson推薦的獨立名稱空間,此外它還爲您提供了設置/ api路由的自然方式。你得到一個單獨的模型文件夾

此外,它是從項目的其餘部分非常明確地分開。如果將來的需求永遠如此,以至於您需要將api實現分離爲單獨的項目,那麼將api實現分離到單獨的區域會使分離變得更容易。

+1

不可能將web api保留在區域內。不是沒有定製路由系統。 – Vegar

+1

@ Vegar路由系統的定製並不困難,但: 'configuration.Routes.MapHttpRoute(name:「DefaultApi」,routeTemplate:「api/{controller}/{id}」,默認值:new {id = ' –

8

我沒有改變的命名空間,我必須做的唯一的事情就是先註冊的WebAPI,然後MVC路線

//First register WebApi router 
GlobalConfiguration.Configure(WebApiConfig.Register); 
//and register Default MVC Route after 
RouteConfig.RegisterRoutes(RouteTable.Routes); 

,一切的偉大工程!

+1

這個人浪費了我的2天時間,我試圖在任何其他路由之前創建API路由,但應該首先調用「GlobalConfiguration.Configure(WebApiConfig.Register)」 中需要的東西。你太晚之前你救了我。 – Adeem

+6

評論似乎是相反的代碼...評論說,MVC然後WebAPI,但代碼是WebApi然後MVC –

相關問題