2014-01-15 55 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的替代方法,除了仅过滤允许的扩展类型外,您还可以使用正则表达式筛选器。 –

相关问题