C# 将API控制器添加到ASP.NET核心项目

C# 将API控制器添加到ASP.NET核心项目,c#,asp.net-web-api,asp.net-core-webapi,C#,Asp.net Web Api,Asp.net Core Webapi,这里是搭建和编辑的控制器 namespace TheAspNetCoreProject { [Route("api/TheApi")] [ApiController] public class TheApiController : ControllerBase { [HttpGet] public IActionResult GetInfo() { return Ok("Foo");

这里是搭建和编辑的控制器

namespace TheAspNetCoreProject
{
    [Route("api/TheApi")]
    [ApiController]
    public class TheApiController : ControllerBase
    {
        [HttpGet]
        public IActionResult GetInfo()
        {
            return Ok("Foo");
        }
    }
}
我希望在
/api/TheApi/
/api/TheApi/Info
/api/TheApi/GetInfo
上看到它,但什么都没有

脚手架没有对
Startup.cs
做任何事情,但是没有提到,例如,在
Startup.cs
中需要任何东西,这听起来不太可能


如何使其工作?

默认情况下,Web API路由的定义如下:
API/{controller}
。请注意,没有
{action}
存在

他们这样做是为了符合REST(代表性状态转移)的做事方式。它基于资源和动词的概念;通常获取、更新、发布、删除

因此,对于默认路线,这将匹配:

获取api/TheApi

namespace TheAspNetCoreProject
{
    [Route("api/TheApi")]
    [ApiController]
    public class TheApiController : ControllerBase
    {
        public IActionResult Get()
        {
            return Ok("Foo");
        }
    }
}

当然,路由始终可以更改为更像RPC。

默认情况下,Web API路由的定义如下:
API/{controller}
。请注意,没有
{action}
存在

他们这样做是为了符合REST(代表性状态转移)的做事方式。它基于资源和动词的概念;通常获取、更新、发布、删除

因此,对于默认路线,这将匹配:

获取api/TheApi

namespace TheAspNetCoreProject
{
    [Route("api/TheApi")]
    [ApiController]
    public class TheApiController : ControllerBase
    {
        public IActionResult Get()
        {
            return Ok("Foo");
        }
    }
}

当然,路由始终可以更改为更像RPC。

我刚刚启动了VS,并从模板中执行了一个新的.net core Web Api项目,它的工作方式与您预期的工作方式相同:

[ApiController]
[Route("api/TheApi")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
    [HttpGet("OtherGet")]
    public IEnumerable<WeatherForecast> OtherGet()
    {
        var rng = new Random();
        return Enumerable.Range(1, 2).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

更新:还请记住,一个控制器中不能有多个GET/POST etc方法,除非您像我使用OtherGet:HttpGet(“OtherGet”)一样为其他(或所有)控制器使用注释。如果您不使用此批注,并且有多个GET、POST等方法,则会出现异常:
含糊不清的MatchException:请求匹配了多个端点。

我刚刚启动了VS,并从模板中创建了一个新的.net core Web Api项目,它按照您的预期工作:

[ApiController]
[Route("api/TheApi")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
    [HttpGet("OtherGet")]
    public IEnumerable<WeatherForecast> OtherGet()
    {
        var rng = new Random();
        return Enumerable.Range(1, 2).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

更新:还请记住,一个控制器中不能有多个GET/POST etc方法,除非您像我使用OtherGet:HttpGet(“OtherGet”)一样为其他(或所有)控制器使用注释。如果不使用此批注并且具有多个GET,POST etc方法您将遇到异常:
含糊不清的MatchException:请求匹配多个端点。

经过许多非常不愉快的尝试和错误后,我现在可以报告,确实需要更新的是
Startup.cs
——webAPI控制器没有更新它

在我的

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
我有

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });

它需要改成

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
                endpoints.MapControllers(); // Added for webAPI.
            });

在经历了许多非常不愉快的尝试和错误之后,我现在可以报告说,确实需要更新的是
Startup.cs
——webAPI控制器没有更新它

在我的

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
我有

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });

它需要改成

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
                endpoints.MapControllers(); // Added for webAPI.
            });

所以,这正是OP所说的:“我们希望在/api/TheApi/上看到它。”“默认情况下,Web api路由的定义是这样的:api/{controller}“对于ASP.NET Core来说这不是真的,你只是删除
[HttpGet]
并重命名操作,希望它能工作?@RomanMarusyk没有看到它是针对Core的;是的,但问题是关于dotnet Core 3.1So的,这正是OP所说的:“我们希望在/api/TheApi/”默认情况下,Web api路由是这样定义的:api/{controller}“这对ASP.NET Core不是真的,您只需删除
[HttpGet]
并重命名操作,希望它能工作?@RomanMarusyk没有看到它是用于核心的;是的,但问题是关于dotnet Core 3.1如何显示您的启动文件如何显示您的启动文件这是个好主意--启动一个新的webAPI项目。事实上,我发现的
Startup.cs
之间的区别显而易见。很高兴听到,如果答案对您有帮助,请接受:)还要记住,您不能在一个控制器中有多个get/post etc方法,除非您像我对OtherGet:HttpGet(“OtherGet”)那样对其他(或所有)方法使用注释。如果不使用此注释,并且有多个GET、POST等方法,则会出现异常:AmbiguousMatchException:请求匹配了多个端点。这是个好主意--启动一个新的webAPI项目。事实上,我发现的
Startup.cs
之间的区别显而易见。很高兴听到,如果答案对您有帮助,请接受:)还要记住,您不能在一个控制器中有多个get/post etc方法,除非您像我对OtherGet:HttpGet(“OtherGet”)那样对其他(或所有)方法使用注释。如果不使用此注释,并且有多个GET、POST等方法,则会出现异常:AmbiguousMatchException:请求匹配了多个端点;在我的配置中,当我执行localhost:8090/WeatherForecast时,我得到404;在我的configure中,当我执行localhost:8090/WeatherForecast时,我得到404。