C# 未使用属性调用HttpGet方法

C# 未使用属性调用HttpGet方法,c#,asp.net-core,C#,Asp.net Core,GetItems方法工作正常,但属性为“id”的GetItem不正常。我在发送get请求时返回了所有项目,这意味着调用了GetItems()。我错过了什么 // GET request: https://localhost:xxxxx/api/Items // Working [HttpGet] public async Task<ActionResult<IEnumerable<Item>>> GetItems() { return await _c

GetItems
方法工作正常,但属性为“id”的
GetItem
不正常。我在发送get请求时返回了所有项目,这意味着调用了
GetItems()
。我错过了什么

// GET request: https://localhost:xxxxx/api/Items
// Working
[HttpGet]
public async Task<ActionResult<IEnumerable<Item>>> GetItems()
{
    return await _context.items.ToListAsync();
}

// GET request: https://localhost:xxxxx/api/Items/2
// Not running
[HttpGet("{id}")]
public async Task<ActionResult<Item>> GetItem(long id)
{
   var item = await _context.items.FindAsync(id);

    if (item == null)
    {
        return NotFound();
    }

    return item;
}

在Startup.cs中配置方法:

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

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

        }

检查具有以下行的启动:

app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
同时检查第一项:

 [HttpGet("{id:int}")]
您也可以这样做:

GET request: https://localhost:xxxxx/api/GetItems?name=aaa 
[HttpGet]
public async Task<ActionResult<IEnumerable<Item>>> GetItems(string name)
{
var item = await _context.items.Where(x => x.Name == name).ToListAsync();

if (item == null)
{
    return NotFound();
}

return item;
GET请求:https://localhost:xxxxx/api/GetItems?name=aaa 
[HttpGet]
公共异步任务GetItems(字符串名称)
{
var item=await_context.items.Where(x=>x.Name==Name.toListSync();
如果(项==null)
{
返回NotFound();
}
退货项目;

}

您可以将
操作
添加到
路线
,如下所示:
[Route(“api/[controller]/[Action]”)
,下面是一个工作演示:

[Route("api/[controller]/[action]")]
[ApiController]
public class ItemsController : ControllerBase
{
   //...

    [HttpGet]
    public async Task<ActionResult<IEnumerable<Item>>> GetItems()
    {
        return await _context.Items.ToListAsync();
    }


    [HttpGet]
    public async Task<ActionResult<Item>> GetItemById(int id)
    {
       
        var item = await _context.Items.FindAsync(id);

        if (item == null)
        {
            return NotFound();
        }

        return item;
    }
    [HttpGet]
    public async Task<ActionResult<IEnumerable<Item>>> GetItemByName(string name)
    {
        var item = await _context.Items.Where(x => x.Name == name).ToListAsync();

        if (item == null)
        {
            return NotFound();
        }

        return item;
    }
}
[路由(“api/[控制器]/[操作]”)
[ApiController]
公共类项控制器:控制器库
{
//...
[HttpGet]
公共异步任务

2:
https://localhost:xxxxx/api/Items/GetItemById?id=xx

结果:

3:
https://localhost:xxxxx/api/Items/GetItemByName?name=xx

结果:

后请求:

https://localhost:xxxxx/api/Items/todoitem

结果:


使用路由属性装饰控制器,如下所示:

    [ApiController]
    [Route("api/Items")]
    public class ItemsController : ControllerBase
    {
        [HttpGet]
        public async Task<ActionResult<IEnumerable<Item>>> GetItems()
        {
            return await _context.items.ToListAsync();
        }

        [HttpGet("{id}")]
        public async Task<ActionResult<Item>> GetItem(long id)
        {
            var item = await _context.items.FindAsync(id);

            if (item == null)
            {
                return NotFound();
            }

            return item;
        }
    }
[ApiController]
[路线(“api/项目”)]
公共类项控制器:控制器库
{
[HttpGet]
公共异步任务GetItems()
{
return wait_context.items.toListSync();
}
[HttpGet(“{id}”)]
公共异步任务GetItem(长id)
{
var item=wait_context.items.FindAsync(id);
如果(项==null)
{
返回NotFound();
}
退货项目;
}
}

然后,您应该能够通过使用请求参数(如
https://localhost:xxxxx/api/Items/2

能否请您分享您的代码,该代码称为endapoints?以及您的路线谢谢您的帮助。路线已如您所述。当我发送时,我收到一个405错误(不允许使用方法)。谢谢,使用此解决方案,我不再使用GetItemById和GetItemByName获取所有项目,但由于每次调试时都会清除数据,因此我只得到“404 not found”。Post方法不适用于返回“HTTP错误400.请求URL无效”的此解决方案。我已经添加了我的POST方法代码。唯一有效的方法是GetItems不返回代码为200的数据。您正在清除什么类型的数据?为什么在清除数据后会导致404错误?正常情况下,这不会影响路由。您的POST方法将返回400,因为您没有传递正确的参数类型。我更新了我的答案,并且你可以看到post方法工作正常。我创建的所有项目都会在新的调试中从服务器上删除。我正在按照说明进行操作,在修复post方法后,它现在正在与你的解决方案一起工作-URL不包括该操作。非常感谢。
[Route("api/[controller]/[action]")]
[ApiController]
public class ItemsController : ControllerBase
{
   //...

    [HttpGet]
    public async Task<ActionResult<IEnumerable<Item>>> GetItems()
    {
        return await _context.Items.ToListAsync();
    }


    [HttpGet]
    public async Task<ActionResult<Item>> GetItemById(int id)
    {
       
        var item = await _context.Items.FindAsync(id);

        if (item == null)
        {
            return NotFound();
        }

        return item;
    }
    [HttpGet]
    public async Task<ActionResult<IEnumerable<Item>>> GetItemByName(string name)
    {
        var item = await _context.Items.Where(x => x.Name == name).ToListAsync();

        if (item == null)
        {
            return NotFound();
        }

        return item;
    }
}
    [ApiController]
    [Route("api/Items")]
    public class ItemsController : ControllerBase
    {
        [HttpGet]
        public async Task<ActionResult<IEnumerable<Item>>> GetItems()
        {
            return await _context.items.ToListAsync();
        }

        [HttpGet("{id}")]
        public async Task<ActionResult<Item>> GetItem(long id)
        {
            var item = await _context.items.FindAsync(id);

            if (item == null)
            {
                return NotFound();
            }

            return item;
        }
    }