如何将 Web API 控制器添加到现有的 ASP.NET 核心 MVC?
How to add Web API controller to an existing ASP.NET Core MVC?
我使用默认 ASP.NET 核心 MVC 模板创建了一个项目。我还想在 /api/{Controller}
下创建一个 RESTful API。我添加了一个新的 Web API 控制器(标准 Web API 控制器 class 模板)但我无法调用它。我收到一条错误消息,指出无法找到该页面。我尝试在 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)
{
}
}
尝试将名称设置为 "Admin"
app.UseMvc(routes =>
{
routes.MapRoute(
name: "Admin",
template: "api/{controller=Admin}");
});
两件事。
首先,当使用基于约定的路由时,更具体的路由应该在更通用的路由之前,以避免路由冲突。
app.UseMvc(routes =>
{
routes.MapRoute(name: "api", template: "api/{controller=Admin}");
routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
});
其次,您已经在控制器上使用属性路由,因此应该能够路由到控制器,除非您在控制器上没有接受 /api/{Controller}
[的路由模板=13=]
这需要默认路由。
[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
}
更新到 ASP.NET Core 的最新版本 v2.0.1(需要 VS2017 的版本)后,问题自行解决。我认为这可能是旧版本中的错误或缺陷。
如果有人在将 webapi 添加到 .net core MVC 中仍然有问题,只需在 class 之前插入 [ApiController]
和 [Route("api/[controller]")]
属性即可解决问题:
[Route("api/[controller]")]
[ApiController]
public class ListController
{ ... }
我没有在 Startup.cs
中添加路由映射,但仍然运行良好。我使用的 .net 版本是 2.1.402
我很幸运用 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。
我使用默认 ASP.NET 核心 MVC 模板创建了一个项目。我还想在 /api/{Controller}
下创建一个 RESTful API。我添加了一个新的 Web API 控制器(标准 Web API 控制器 class 模板)但我无法调用它。我收到一条错误消息,指出无法找到该页面。我尝试在 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)
{
}
}
尝试将名称设置为 "Admin"
app.UseMvc(routes =>
{
routes.MapRoute(
name: "Admin",
template: "api/{controller=Admin}");
});
两件事。
首先,当使用基于约定的路由时,更具体的路由应该在更通用的路由之前,以避免路由冲突。
app.UseMvc(routes =>
{
routes.MapRoute(name: "api", template: "api/{controller=Admin}");
routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
});
其次,您已经在控制器上使用属性路由,因此应该能够路由到控制器,除非您在控制器上没有接受 /api/{Controller}
[的路由模板=13=]
这需要默认路由。
[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
}
更新到 ASP.NET Core 的最新版本 v2.0.1(需要 VS2017 的版本)后,问题自行解决。我认为这可能是旧版本中的错误或缺陷。
如果有人在将 webapi 添加到 .net core MVC 中仍然有问题,只需在 class 之前插入 [ApiController]
和 [Route("api/[controller]")]
属性即可解决问题:
[Route("api/[controller]")]
[ApiController]
public class ListController
{ ... }
我没有在 Startup.cs
中添加路由映射,但仍然运行良好。我使用的 .net 版本是 2.1.402
我很幸运用 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。