HttpGetAttribute 在核心网络中不起作用 api

HttpGetAttribute doesn't work in core web api

众所周知的情况。我需要两个端点

GetAll -> api/brands

GetById -> api/brands/1

[ApiController]
[Route("api/[controller]")]
public class BrandsController : ControllerBase
{
    private readonly BrandRepository repository;

    public BrandsController(BrandRepository repository)
    {
        this.repository = repository;
    }

    [HttpGet("{id:int}")]
    public async Task<ActionResult> GetById(int id)
    {
        var brand = await repository.FindAsync(id);
        if (brand == null)
        {
            return NotFound();
        }

        return Ok(brand);
    }

    [HttpGet("")]
    public ActionResult<IEnumerable<Brand>> GetAll()
    {
        var brands = repository.GetAll().ToList(); 

        return Ok(brands);
    }}

所以,我总是进入 GetAll() 有任何想法吗?请帮忙:)

命名空间是否正确?

using Microsoft.AspNetCore.Mvc;

对于

[HttpGet]

Startup.cs

namespace BackOffice
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddDbContext<ApplicationDbContext>(
                options => 
                options.UseMySql(Configuration.GetConnectionString("local")));

            services.AddTransient<BrandRepository, BrandRepository>();
        }

        // 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();
                });

            app.UseCors();
        }
    }
}

dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddddddddddddd

将 GetAll 操作的属性更改为 [HttpGet],然后将 GetById 操作的属性更改为 [HttpGet("{id}")] 。

如果需要,您可以对 id 使用约束,但在您的情况下,我认为没有任何必要。通常,当您在同一路由上执行多个操作但参数类型不同时,您可以使用约束。例如,"api/brands/1" 通过整数 ID 获取,然后您可能有另一个映射到 "api/brands/gucci" 的操作将通过字符串名称搜索品牌。然后您可以在路由模板中使用 {id:int} 和 {id:string} 约束来定义要调用的操作。

还要确保在声明操作 return 类型时使用 IActionResult。您不想使用具体的 ActionResult 类型。下面的代码示例。

对于 GetById 操作:

[HttpGet("{id}")]
public async Task<IActionResult> GetById(int id)
{
    var brand = await repository.FindAsync(id);
    if (brand == null)
    {
        return NotFound();
    }

    return Ok(brand);
}

对于您的 GetAll 操作:

[HttpGet]
public IActionResult<IEnumerable<Brand>> GetAll()
{
    var brands = repository.GetAll().ToList(); 

    return Ok(brands);
}

这将告诉路由中间件要调用哪个操作。对于要映射到基本控制器路由(即 "api/brands")的操作,只需使用不带重载的属性。如[HttpGet]、[HttpPost]、[HttpDelete]。对于具有路由参数的操作,您可以根据 HTTP 方法使用 [HttpGet("{id}")] 等。不用担心在属性路由模板中定义参数的类型。您在操作的参数中定义参数。例如:

[HttpGet("{id}")]
public async Task<IActionResult> GetById(int id)
{
    // Code here

    return Ok();
}

如果您想将路由映射到 "api/brands/designers/2" 之类的内容,则可以使用 [HttpGet("designers/{id}")] 之类的模板来实现。不要在设计者前加上“/”。

编辑:忘记提及,请确保您的 Startup.cs 已正确配置为 Web API 路由。您可以阅读 ASP.NET Core 3.1 文档中的详细信息,了解所有不同选项的作用。如果您使用 Web API 模板,那么它可能没问题,但值得仔细检查,因为配置不当的端点路由可能会导致问题。确保在 Startup.cs.

中的 Configure 方法中包含以下内容
app.UseRouting();

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

确保 app.UseRouting();在 app.UseEndpoints();

之前调用