プロパティが整数であるPATCHリクエストを無視しているように見えますが、他のタイプを問題なく処理するという点で、Web API 2(.net 4.5.1)に問題があります(文字列と10進数をテストしました)。
http://playapi.azurewebsites.net/api/productsで、「製品」コントローラーを使用して、セキュリティで保護されていないテスト API をセットアップしました。その URL に GET を実行すると、次のような製品が返されます。
{"Id": 1,"Name": "Xbox One","Category": "gaming","Price": 300,"Stock": 5}
'Name' と 'Category' はどちらも文字列で、'Price' は 10 進数、'Stock' は Integer です。
これらのリクエストを送信すると、どちらも機能します (更新されたエンティティで 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 要求をサポートする必要がありますか? もしそうなら、それを機能させるためにサーバーまたはクライアントで何か特別なことをする必要がありますか?