Запрос PATCH не распознается Marvin.JsonPatch - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь отправить запрос 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.

При отладке на контроллере I 'Мы также пытались

var s = await Request.Content.ReadAsStringAsync();

Но это возвращает пустую строку - кто-нибудь может объяснить, почему?

ОБНОВЛЕНИЕ:
Так выглядит содержимое документа JsonPatch при передаче в HttpClient ...

{
    "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 голосов
/ 26 сентября 2018

Где-то во время разработки Marvin.JsonPatch JsonPatchDocument<T> был аннотирован атрибутом, который применял пользовательский сериализатор JSON:

[JsonConverter(typeof(JsonPatchDocumentConverter))]

Этот конвертер позволяет вам вызывать JsonConvert.SerializeObject() на таком патч-документе и фактически генерировать патч-документ, в отличие от представления объекта JsonPatchDocument<T> CLR.

Обновите Marvin.JsonPatch и Newtonsoft.Json до последней версии, и сериализация должна быть успешной.

...