如何将 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。