Почему мой запрос PATCH пуст в контроллере ASP.NET? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующий основной контроллер ASP.net:

[ApiVersion(ApiConstants.Versions.V1)]
[Route(RouteConstants.ApiControllerPrefix + "/tenants/" + RouteConstants.TenantIdRegex + "/entities")]
public class EntityController
{
    [HttpPatch]
    [SwaggerOperation(OperationId = nameof(PatchEntity))]
    [Route("{controlId:guid}", Name = nameof(PatchEntity))]
    [SwaggerResponse(StatusCodes.Status204NoContent, "Result of the patch")]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    [Consumes(MediaTypes.Application.JsonPatch)]
    public async Task<IActionResult> PatchEntity(string tenantId, Guid entityId, JsonPatchDocument<EntityModel> entityPatches)
    {
        //
    }
}

Контроллер позволяет мне исправлять существующую сущность.Вот модель:

[JsonObject(MemberSerialization.OptIn)]
public class EntityModel
{
    [JsonProperty(PropertyName = "isAuthorized")]
    public bool IsAuthorized { get; set; }
}

Для моего теста я использую postman для отправки патча на объект.Я выбрал глагол PATCH, нацеленный на этот URL:

http://localhost:5012/api/v1/tenants/tenant-id/entities/01111111-0D1C-44D6-ABC4-2C9961F94905

В заголовках я добавил запись Content-Type и установил ее на application/json-patch+json.

Вот телозапроса:

[
    { "op": "replace", "path": "/isAuthorized", "value": "false" }
]

Я запустил приложение и установил точку останова на контроллере.Достигнута точка останова с правильным идентификатором клиента и идентификатором объекта.Однако entityPatches не выполняет никаких операций:

entityPatches.Operations.Count = 0

Следовательно, свойство IsAuthorized целевого EntityModel не может быть обновлено.Я ожидал, что у свойства Operations будет одна операция replace, как определено в HTTP-запросе.

Вопрос

Почему свойство Operationsкласса JsonPatchDocument, в котором отсутствуют операции исправления, определенные в теле HTTP-запроса?

1 Ответ

0 голосов
/ 11 октября 2018

Вам не хватает атрибута FromBody в параметре entityPatches, например:

public async Task<IActionResult> PatchEntity(
    string tenantId, 
    Guid entityId, 
    [FromBody] JsonPatchDocument<EntityModel> entityPatches)
  //^^^^^^^^^^ Add this
{
    //snip
}
...