Патч ODataV4 всегда получает нулевое значение - PullRequest
0 голосов
/ 22 февраля 2019

Я пытался получить значения от клиента к методу ODataV4.Но это было неудачно.Он всегда получает нулевые значения от клиента.Ниже мой код,

[HttpPatch]
    [EnableQuery]
    public IHttpActionResult Patch(int key, Delta<EmployeeDetail> patch)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var entity = _db.EmployeeDetails.Find(key);
        patch.Patch(entity);
        _db.SaveChanges();
        return Updated(entity);
    }

enter image description here

1 Ответ

0 голосов
/ 24 марта 2019

Спецификация: OData версия 4.0.Часть 1. Протокол плюс ошибки 03
8.2.8.7 Возврат предпочтения = представление и возврат = минимальный
В OData return = представление или возврат = минимальный определяется для использования с данными POST, PUT или PATCHЗапрос на изменение, отличный от свойства потока или запроса на действие.

Если заголовок Preference отсутствует, по умолчанию в реализации .Net предполагается return=minimal, что приводит к 204 No Content response.

Вы должны убедиться, что клиентский запрос имеет заголовок Preference или Prefer в сценариях, где вы ожидаете данные ответа, или вы можете изменить свой обработчик патчей для использования альтернативного значения по умолчанию:

[HttpPatch]
[EnableQuery]
public IHttpActionResult Patch(int key, Delta<EmployeeDetail> patch)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var entity = _db.EmployeeDetails.Find(key);
    patch.Patch(entity);
    _db.SaveChanges();


    // Return content by default
    // Disable this by sending in header { Prefer: "return=minimal" }
    if (!this.Request.Headers.Any(k => k.Key.Equals("prefer", StringComparison.OrdinalIgnoreCase) || k.Key.Equals("preference", StringComparison.OrdinalIgnoreCase)))
        this.Request.Headers.Add("Prefer", "return=representation");

    return Updated(entity);
}

ПРИМЕЧАНИЕ: заголовок Prefer не был жестко закодирован для всех запросов в этом решении, только те запросы, которые не указывают заголовок, таким образом, пользовательские запросы все еще могут манипулироватьответ, если вам нужно.

Значения Prefer отличаются в более ранних версиях OData v3 и в более ранней версии.В рамках реализации .Net версии 4 в ODataLIb вы найдете несколько документов, в которых говорится, что для заголовка Prefer требуется значение «content» или «return = content» ... эти решения больше не работают.

...