【问题标题】:Adding an API controller to an ASP.NET Core project将 API 控制器添加到 ASP.NET Core 项目
【发布时间】:2020-03-14 19:28:48
【问题描述】:

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

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 没有任何作用,但是例如在docs 中没有提到Startup.cs 需要任何东西——这听起来不太可能。

如何让它工作?

【问题讨论】:

  • 向我们展示您的启动文件

标签: c# asp.net-web-api asp.net-core-webapi


【解决方案1】:

我刚刚启动了 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();
    }
}

有效网址:

Startup.cs 如下所示:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

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

更新:另外请记住,您不能在一个控制器中拥有多个 GET/POST 等方法,只有当您像我一样为其他(或所有)使用注释时使用 OtherGet:HttpGet("OtherGet")]。如果你不使用这个注解并且有多个 GET、POST 等方法,你会遇到异常:AmbiguousMatchException: The request matched multiple endpoints.

【讨论】:

  • 这是个好主意——开始一个新的 webAPI 项目。事实上,我发现Startup.cs 的差异显而易见。
  • 很高兴听到,如果对您有帮助,请接受答案 :) 另外请记住,您不能在一个控制器中拥有多个 get/post 等方法,只有当您为其他控制器使用注释时(或全部)就像我对 OtherGet 所做的那样:HttpGet("OtherGet")]。如果您不使用此注解并且有多个 GET、POST 等方法,您将遇到异常:AmbiguousMatchException: The request matches multiple endpoints.
【解决方案2】:

经过大量非常不愉快的试验和错误后,我现在可以报告确实需要更新 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.
            });

【讨论】:

  • 我有这个 endpoints.MapControllers();在我的配置中,当我执行 localhost:8090/WeatherForecast 时,我得到 404。
【解决方案3】:

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

它们以这种方式符合 REST (Representational state transfer) 的做事方式。它基于资源和应用于它们的动词的概念;通常是 GET、UPDATE、POST、DELETE。

所以使用默认路由,这将匹配:

GET api/TheApi

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

当然,路由总是可以更改为更像 RPC。

【讨论】:

  • 所以,这正是 OP 所说的:“希望在 /api/TheApi/ 上看到它”
  • "默认情况下,Web API 路由是这样定义的:api/{controller}" ASP.NET Core 不正确
  • 您只需删除 [HttpGet] 并重命名操作并希望它可以工作吗?
  • @RomanMarusyk 没看到它是针对 Core 的;这适用于非核心。
  • 是的,但问题是关于 dotnet core 3.1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多