在一个项目中混合使用Web Api和ASP.Net MVC页面

Jon*_*gel 47 asp.net-mvc-4

如何在一个项目中混合Web API和ASP.Net MVC页面?

例如,我有模型用户.我希望,在同一个项目中,有一个ApiController,它将响应所有用于管理User实体的HTTP动词,同时拥有一个Controller,它将根据请求的Action返回相应的强类型视图.

我无法命名两个控制器UserController.围绕这个最好的方法是什么?我应该命名一个UserApiController和另一个UserController吗?还有其他建议吗?

Mik*_*son 49

您可以将它们放在单独的命名空间中,例如MyApp.Controllers.UsersController和MyApp.Controllers.WebAPI.UsersController.

这将允许您在MVC和WebAPI中公开类似的URI路由,例如:

/users/1      << MVC view
/api/users/1  << Web API
Run Code Online (Sandbox Code Playgroud)

  • 那么在组合项目中设置两个默认路由的正确方法是什么? (17认同)
  • 我不认为他建议使用相同的文件,但在Controllers下创建一个名为"WebAPI"的新文件夹,我是否正确? (3认同)

Ale*_*lex 13

我没有更改命名空间,我唯一要做的就是首先注册WebApi,然后注册MVC路由

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

一切都很棒!

  • 评论似乎与代码相反......评论说MVC然后是WebAPI,但代码是WebApi然后是MVC (7认同)

Cle*_*man 9

应将WebApi实现添加为MVC应用程序中的单独区域.这很自然.这样做可以为您提供Mike Wasson推荐的独立命名空间,此外它还为您提供了设置/ api路由的自然方式.你得到一个单独的模型文件夹

此外,它与项目的其余部分非常具体地分开.如果未来的需求永远需要将api实现分离到一个单独的项目中,那么将api实现隔离到一个单独的区域会使得分解更容易.

  • @Vegar 路由系统的定制并不难:`configuration.Routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.可选 });` (2认同)