2012-05-20 85 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 –

相关问题