Web API 2 不处理整数的 PATCH 请求

Mar*_*arn 5 asp.net rest integer asp.net-web-api http-patch

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

\n\n

我\xe2\x80\x99在http://playapi.azurewebsites.net/api/products上设置了一个带有“products”控制器的不安全测试 API 。如果您对该 URL 执行 GET,您\xe2\x80\x99 将得到类似以下产品的信息:

\n\n
{"Id": 1,"Name": "Xbox One","Category": "gaming","Price": 300,"Stock": 5}\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x98Name\xe2\x80\x99 和 \xe2\x80\x98Category\xe2\x80\x99 都是字符串,\xe2\x80\x98Price\xe2\x80\x99 是 Decimal,\xe2\x80\ x98Stock\xe2\x80\x99 是一个整数。

\n\n

如果您发送这些请求,它们都会起作用(您\xe2\x80\x99将获得更新实体的 200/OK):

\n\n\n\n

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

\n\n\n\n

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

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

我的“产品”模型如下:

\n\n
namespace PlayAPI.Models\n{\n    public class Product\n    {\n        [Key]\n        public int Id { get; set; }\n        public string Name { get; set; }\n        public string Category { get; set; }\n        public double Price { get; set; }\n        public int Stock { get; set; }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我调试控制器时,我看到 \xe2\x80\x98patch\xe2\x80\x99 对象有一个_changedProperties集合,当我执行整数请求时,其中没有任何项目,但是当我执行任何其他类型的请求时,它有我更改的密钥。

\n\n

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

\n

Mar*_*eby 5

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

\n\n
public Int64 Stock { get; set; }\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n