在控制器中点击 GET 操作时的 405 状态

405 status when hitting actions for GET in controller

我的想法是,使用这些 ItemController 方法,我应该能够:

这是我在 GET 动词下的操作代码:

[HttpGet("query/{barcode:int}")]
public async Task<IActionResult> GetByBarcode(int barcode)
{
    var item = ...
    
    return Ok(item);
}

[HttpGet("query/{discount:int}")]
public async Task<IActionResult> GetByDiscount(int discount)
{
    var items =  ...
    
    return Ok(items);
}


[HttpGet("query/{name}")]
public async Task<IActionResult> GetByName(string name)
{
    var items = ...
    
    return Ok(items);
}

[HttpGet("query/{category}")]
public async Task<IActionResult> GetByCategory(string category)
{
    var items = ...
    
    return Ok(items);
}

问题是,当我尝试访问任何这些操作时,我不断收到 405 方法不允许。不知道是不是方法之间有歧义的问题,大家能帮帮我吗?

编辑:

Header 共 ItemController.cs:

using InventoryWebApi.DataAccess;
using InventoryWebApi.DTO;
using InventoryWebApi.Models;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq;
using System.Threading.Tasks;

namespace InventoryWebApi.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class ItemController : ControllerBase
    {
        private readonly IRepository repository;

        public ItemController(IRepository repository)
...

您使用的路由方式有误。

你的代码不会是偶数运行, 你的行动应该

[HttpGet("query/getbybarcode/{barcode:int})]
public async Task<IActionResult> GetByBarcode(int barcode)

[HttpGet("query/getbydiscount/{discount:int}")]
public async Task<IActionResult> GetByDiscount(int discount)

对于此路线,您必须使用此 urls

.../item/query/getbybarcode/{barcode}
..../item/query/getbydiscount/{discount}

如果您仍想以自己的方式创建 url,则必须更改属性路由

[HttpGet("query/getbybarcode)]
public async Task<IActionResult> GetByBarcode(int barcode)

[HttpGet("query/getbydiscount")]
public async Task<IActionResult> GetByDiscount(int discount)

你的url应该是

.../item/query/getbydiscount?discount={discount}"
..../item/query/getbybarcode?barcode={barcode}"

更新

如果您仍然需要将所有 url 用于您的学生项目,那么唯一的方法是对所有 url 使用一个操作

[HttpGet("query")]
public async Task<IActionResult> Get(int? barcode, int? discount, 
string name, string category )
{
 
   if (barcode != null) ...
else if (discount!=null) ...


    var item = ...
    
    return Ok(item);
}