首页 > 解决方案 > 返回 ASP.NET Core 2.2 中新创建资源的 URI

问题描述

我想返回 ASP.NET Core 2.2 中新创建资源的位置 URI。以下是为食品供应商获取食品的方法:

[HttpGet("{foodVendorId}/foodItems/{foodItemId}", Name = "GetFoodItem")]
public IActionResult GetFoodVendorFoodItem(int foodVendorId, int foodItemId)
{
    if (!_foodDeliveryAPIRepository.FoodVendorExists(foodVendorId))
    {
        return NotFound();
    }

    var foodItem = _foodDeliveryAPIRepository.GetFoodItemForFoodVendor(foodVendorId, foodItemId);

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

    var foodItemResult = Mapper.Map<FoodItemDto>(foodItem);

    return Ok(foodItemResult);
}

以下是为食品供应商添加或创建食品的方法:

[HttpPost("{foodVendorId}/foodItems")]
public IActionResult CreateFoodItem(int foodVendorId, [FromBody] FoodItemForCreationDto foodItem)
{
    if (foodItem == null)
    {
        return BadRequest();
    }

    if (!_foodDeliveryAPIRepository.FoodVendorExists(foodVendorId))
    {
        return NotFound();
    }

    var finalFoodItem = Mapper.Map<Entities.FoodItem>(foodItem);

    _foodDeliveryAPIRepository.AddFoodItemForFoodVendor(foodVendorId, finalFoodItem);

    if (!_foodDeliveryAPIRepository.Save())
    {
        return StatusCode(500, "A problem happened while handling your request.");
    }

    var createdFoodItemToReturn = Mapper.Map<Models.FoodItemDto>(finalFoodItem);

    return CreatedAtRoute("GetFoodItem", new
        { foodVendorId = foodVendorId, id = createdFoodItemToReturn.Id }, createdFoodItemToReturn);
}

创建 FoodItem 后,值会进入数据库,但在创建后会返回 500 服务器错误。调试后,我意识到错误在 CreatedAtRoute 的返回语句中 -

return CreatedAtRoute("GetFoodItem", new
        { foodVendorId = foodVendorId, id = createdFoodItemToReturn.Id }, createdFoodItemToReturn);

我做错了什么?-并没有解决我的问题。

标签: c#asp.net-web-apiasp.net-core

解决方案


我试图重现你的异常,我做到了。调试后,我注意到当您返回时,您将id作为foodItemIdCreatedAtRoute的名称传递,这就是问题所在。

您的路由参数名称应该与您的 GET 操作输入名称完全相同。

所以这是我用来测试的简化代码:

[HttpGet("{foodVendorId}/foodItems/{foodItemId}", Name = "GetFoodItem")]
public IActionResult GetFoodVendorFoodItem(int foodVendorId, int foodItemId)
{
    return Ok(";)");
}

[HttpPost("{foodVendorId}/foodItems")]
public IActionResult CreateFoodItem(int foodVendorId)
{
    return CreatedAtRoute("GetFoodItem", new { foodVendorId, /* this was the problem => */ foodItemId = 5 }, new { result = "Done" });
}

推荐阅读