Marvin.JsonPatch无法识别PATCH请求

时间:2018-09-26 12:11:52

标签: c# json-patch

我正在尝试将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
}

1 个答案:

答案 0 :(得分:1)

在Marvin.JsonPatch的开发过程中的某个地方,JsonPatchDocument<T>带有使用自定义JSON序列化程序的属性的注释:

[JsonConverter(typeof(JsonPatchDocumentConverter))]

This converter使您可以在这样的补丁文档上调用JsonConvert.SerializeObject()并实际生成补丁文档,而不是JsonPatchDocument<T> CLR对象的表示形式。

将Marvin.JsonPatch和Newtonsoft.Json升级到最新版本,并且序列化应该会成功。