【发布时间】:2015-03-12 11:13:26
【问题描述】:
我在使用 Web API 2 (.net 4.5.1) 时遇到问题,因为它似乎忽略了属性为整数的 PATCH 请求,但处理其他类型没有问题(我已经测试过字符串和小数)。
我在http://playapi.azurewebsites.net/api/products 设置了一个带有“产品”控制器的不安全测试 API。如果你对那个 URL 执行 GET,你会得到类似这个产品的东西:
{"Id": 1,"Name": "Xbox One","Category": "gaming","Price": 300,"Stock": 5}
‘Name’和‘Category’都是字符串,‘Price’是小数,‘Stock’是整数。
如果您发送这些请求,它们都可以工作(更新后的实体会得到 200/OK):
- 补丁,http://playapi.azurewebsites.net/api/products/1 和
{"Price": 600.00} - 补丁,http://playapi.azurewebsites.net/api/products/1 与
{"Category": "Electronics"}
但是,如果你发送这个,它会返回 200/OK,但不会进行更新,并且库存保持在原始值
- 补丁,http://playapi.azurewebsites.net/api/products/1 与
{"Stock": 4}
我的控制器代码是相当标准的样板代码(来自脚手架的 ODATA 控制器,但已移至标准 API 控制器):
// 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; }
}
}
当我调试控制器时,我看到“补丁”对象有一个 _changedProperties 集合,当我执行整数请求时,其中没有任何项目,但是当我执行任何其他类型的请求时,它具有我变了。
Web API 是否应该支持整数属性的 PATCH 请求?如果是这样,我是否需要在服务器或客户端上做一些特殊的事情才能让它工作?
【问题讨论】:
-
这个问题有永久解决方案here
标签: asp.net rest asp.net-web-api integer http-patch