gpt4 book ai didi

asp.net - Web API 2 不处理整数的 PATCH 请求

转载 作者:行者123 更新时间:2023-12-02 17:00:42 27 4
gpt4 key购买 nike

我在使用 Web API 2 (.net 4.5.1) 时遇到问题,因为它似乎忽略属性为整数的 PATCH 请求,但处理其他类型没有问题(我测试了字符串和十进制) )。

我已经在http://playapi.azurewebsites.net/api/products处使用“产品” Controller 设置了一个不安全的测试API 。如果您对该 URL 执行 GET,您将得到类似此产品的信息:

{"Id": 1,"Name": "Xbox One","Category": "gaming","Price": 300,"Stock": 5}

“名称”和“类别”都是字符串,“价格”是小数,“库存”是整数。

如果您发送这些请求,它们都会起作用(您将收到更新后的实体的 200/OK):

但是,如果您发送此消息,它会返回 200/OK,但不会进行更新,并且库存仍保持原始值

我的 Controller 代码是相当标准的样板代码(来自脚手架的 ODATA Controller ,但移至标准 API Controller 中):

// PATCH: api/Products/5
[AcceptVerbs("PATCH", "MERGE")]
public async Task<IHttpActionResult> PatchOrder(int id, Delta<Product> patch)
{
Validate(patch.GetEntity());
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var item = await db.Products.FindAsync(id);
if (item == null)
{
return NotFound();
}
patch.Patch(item);
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ProductExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return Ok(item);
}

我的“产品”模型如下:

namespace PlayAPI.Models
{
public class Product
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public double Price { get; set; }
public int Stock { get; set; }
}
}

当我调试 Controller 时,我看到“patch”对象有一个 _changedProperties 集合,当我执行整数请求时,该集合中没有任何项目,但当我执行任何其他类型的请求时它有我更改的 key 。

Web API 是否应该支持整数属性的 PATCH 请求?如果是这样,我需要在服务器或客户端上执行任何特殊操作才能使其正常工作吗?

最佳答案

作为快速修复,请将 PlayAPI.Models.Product 上的 int 更改为 Int64。

public Int64 Stock { get; set; }

据我了解,用于修补现有对象的 Delta 对象不使用 JSON.net 进行转换,并且在解析 JSON 然后与数据库中的现有对象进行比较时,会默默地抛出 Invalid 转换异常。您可以在此处阅读有关该错误的更多信息:http://aspnetwebstack.codeplex.com/workitem/777

关于asp.net - Web API 2 不处理整数的 PATCH 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29008248/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com