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();
之前调用
众所周知的情况。我需要两个端点
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();
之前调用