如何将 Web API 控制器添加到现有的 ASP.NET Core MVC?
Posted
技术标签:
【中文标题】如何将 Web API 控制器添加到现有的 ASP.NET Core MVC?【英文标题】:How to add Web API controller to an existing ASP.NET Core MVC? 【发布时间】:2017-07-04 22:30:43 【问题描述】:我使用默认的 ASP.NET Core MVC 模板创建了一个项目。我还想在/api/Controller
下创建一个 RESTful API。我添加了一个新的 Web API 控制器(标准 Web API 控制器类模板),但我不能调用它。我收到一条错误消息,提示找不到该页面。我尝试在 Startup.cs 中添加一条路线,但它什么也没做:
app.UseMvc(routes =>
routes.MapRoute(name: "default", template: "controller=Home/action=Index/id?");
routes.MapRoute(name: "api", template: "api/controller=Admin");
);
编辑:
就像我说的,这都是默认模板。这是我添加的 Web API 控制器:
[Route("api/[controller]")]
public class AdminController : Controller
// GET api/values/5
[HttpGet("id")]
public string Get(int id)
return "value";
// POST api/values
[HttpPost]
public void Post([FromBody]string value)
// PUT api/values/5
[HttpPut("id")]
public void Put(int id, [FromBody]string value)
// DELETE api/values/5
[HttpDelete("id")]
public void Delete(int id)
【问题讨论】:
嗯,我不在我的家用电脑上,所以我可能错了,但我认为您不需要为 API 添加新路由。我认为你只是从 APIController 基类继承,并从中派生出你自己。那么 MVC 应该为你做路由。此时,在您的路由中,您唯一拥有的就是您的默认路由,MVC 将为您处理 API 路由。 这就是我的想象,但导航到 localhost:27891/api/Admin 会导致 ERR_CONNECTION_REFUSED。 docs.microsoft.com/en-us/aspnet/web-api/overview/… 向下滚动到 ProductsController 大约一半。它继承自 ApiController,而不是控制器。 那是旧的。他们合并了 Controller 和 ApiController 所以现在两者之间没有真正的区别:***.com/questions/32353866/… 【参考方案1】:两件事。
首先,在使用基于约定的路由时,更具体的路由应位于更通用的路由之前以避免路由冲突。
app.UseMvc(routes =>
routes.MapRoute(name: "api", template: "api/controller=Admin");
routes.MapRoute(name: "default", template: "controller=Home/action=Index/id?");
);
其次,您已经在控制器上使用属性路由,因此应该能够路由到控制器,除非您在控制器上没有可以接受/api/Controller
的路由模板
这需要一个默认路由。
[Route("api/[controller]")]
public class AdminController : Controller
[HttpGet("")] //Matches GET api/admin <-- Would also work with [HttpGet]
public IActionResult Get()
return Ok();
[HttpGet("id")] //Matches GET api/admin/5
public IActionResult Get(int id)
return Ok("value");
//...other code removed for brevity
【讨论】:
我的第一个意图是不要触及 app.UseMvc 中的路由。但是,开箱即用,它不起作用。 [Route("api/[controller]")] 是不够的。我确实遵循了您的建议,并在通用路线之前添加了特定路线,就像上面一样。如果我尝试导航到localhost:27891/api/Admin,它仍然不起作用。令人惊讶的是,如果我转到localhost:27891/[WHATEVER],它会触发 AdminController 中的 Get() 方法并将 [WHATEVER] 作为参数传递。这真的很奇怪。【参考方案2】:我很幸运在 v3.1 中做到了这一点:
将文件夹 Controllers 添加到项目中。将名为 TestController 的 Controller 添加到文件夹中。 然后将以下内容添加到 Startup.cs:
services.AddControllers();
到
public void ConfigureServices(IServiceCollection services)
services.AddRazorPages();
services.AddControllers();
和:
endpoints.MapControllers();
到
app.UseEndpoints(endpoints =>
endpoints.MapRazorPages();
endpoints.MapControllers();
);
然后我就可以调用 /api/Test。
【讨论】:
这对我有用!使用我现有的项目,我创建了模板 dot net core API 项目并将控制器和类复制过来,这两行代码是唯一缺少的其他内容。 在 dotnetcore v5.0 中为我工作【参考方案3】:如果有人在将 webapi 添加到 .net core MVC 中仍然存在问题,只需在 class 之前插入 [ApiController]
和 [Route("api/[controller]")]
属性即可解决问题:
[Route("api/[controller]")]
[ApiController]
public class ListController
...
我没有在Startup.cs
中添加路由映射,并且仍然运行良好。我使用的 .net 版本是 2.1.402
【讨论】:
【参考方案4】:更新到最新版本的ASP.NET Core v2.0.1(需要VS2017的那个)后,问题自行解决。我认为这可能是旧版本的错误或缺点。
【讨论】:
【参考方案5】:尝试将名称设置为“管理员”
app.UseMvc(routes =>
routes.MapRoute(
name: "Admin",
template: "api/controller=Admin");
);
【讨论】:
不起作用。文档说路由的名称并不重要,除了 URL 生成。以上是关于如何将 Web API 控制器添加到现有的 ASP.NET Core MVC?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 .net core Web API 项目添加到现有的 .NET core (3.1) Web Application 项目中?
将捆绑包添加到现有的 ASP.NET Webforms 解决方案
将 Angular 和 .net core web api 安全地集成到现有的 MVC 5 应用程序中