我正在尝试将AJAX PATCH请求发送到Web API方法,并使修补的对象被Marvin.JsonPatch识别。
到目前为止,我发送到服务器的所有内容都导致收到一个空请求。
Web API控制器方法如下:
public async Task<IHttpActionResult> Update(long orderId, JsonPatchDocument<Order> patchedOrder)
我正在使用这样的HttpClient
进行发布(在此应用程序中不能使用async
)...
var patchDoc = new JsonPatchDocument<Order>();
patchDoc.Replace(e => e.Price, newPrice);
patchDoc.Replace(e => e.WordCount, newWordCount);
var request = new HttpRequestMessage(new HttpMethod("PATCH"), uri)
{
Content = new StringContent(JsonConvert.SerializeObject(patchDoc),
System.Text.Encoding.Unicode,
"application/json")
};
HttpResponseMessage response;
using (var client = new HttpClient(...))
{
response = client.SendAsync(request).GetAwaiter().GetResult();
}
但是当它是控制器时,patchedOrder
参数是null
。
在控制器上进行调试时,我也尝试过
var s = await Request.Content.ReadAsStringAsync();
但是这将返回一个空字符串-有人可以解释为什么吗?
更新:
这就是传递给HttpClient时JsonPatch文档的内容的样子。
{
"Operations": [{
"OperationType": 2,
"value": 138.7,
"path": "/price",
"op": "replace"
},
{
"OperationType": 2,
"value": 1320,
"path": "/wordcount",
"op": "replace"
}],
"ContractResolver": {
"DynamicCodeGeneration": true,
"DefaultMembersSearchFlags": 20,
"SerializeCompilerGeneratedMembers": false,
"IgnoreSerializableInterface": false,
"IgnoreSerializableAttribute": true,
"NamingStrategy": null
},
"CaseTransformType": 0
}
答案 0 :(得分:1)
在Marvin.JsonPatch的开发过程中的某个地方,JsonPatchDocument<T>
带有使用自定义JSON序列化程序的属性的注释:
[JsonConverter(typeof(JsonPatchDocumentConverter))]
This converter使您可以在这样的补丁文档上调用JsonConvert.SerializeObject()
并实际生成补丁文档,而不是JsonPatchDocument<T>
CLR对象的表示形式。
将Marvin.JsonPatch和Newtonsoft.Json升级到最新版本,并且序列化应该会成功。