2014-01-15 87 views
2

是否有可能使用相同的路由託管MVC和Web API控制器,但提供不同的內容?MVC和Web API控制器:相同的路由,不同的內容

我想要的是根據請求的Accept頭中的內容類型來選擇正確的控制器。

例如:

GET /users/1 [Accept: text/html]將調用一個MVC響應。
GET /users/1 [Accept: application/json]將調用Web API響應。

我意識到可以直接從Web API渲染Razor視圖並直接返回HTML,但是之後我無法使用MVC的優點來呈現我的主站點(除非有人告訴我可以做任何事情在網絡的API,MVC可以做)

相關(但不相同)的問題:ASP.NET MVC 4 ApiController and Normal Controller Routes

回答

3

正如你已經張貼你的問題,開箱,沒有。

您可以在HttpHandler或HttpModule中檢測請求的數據類型並將請求重定向到您的WebAPI項目。

或者,你可以定義你的路線,讓您的WebAPI項目接受,有一個以.json甚至.XML extention請求,並適當地讓你的API請求,根據你的路由

routes.MapRoute("Default", "{controller}/{action}/{id}.json", new { controller = "Home", action = "Index" }); 

編輯1:如果您需要處理多種內容類型,你可以定義你的路由像下面和處理的內容類型在你的控制器動作

routes.MapRoute("Default", "{controller}/{action}/{id}.{contentType}", new { controller = "Home", action = "Index" }); 
+1

我喜歡一個HttpHandler或HTTP模塊,我正在考慮加入LOGI的想法如果請求是用於HTML以外的其他任何內容,但將它移到管道上更像是一個更好的主意,那麼MVC控制器將重定向到api/users/1。因爲我們有多種內容類型(json,xml和messagepack)和屬性路由而不是全局路由,所以我不那麼熱衷於擴展想法。 –

+1

添加了一個編輯處理contentType的替代方法,除了僅過濾允許的擴展類型外,您還可以使用正則表達式篩選器。 –

相關問題