Simple.Odata.Client получает исключение «Обязательный экземпляр аннотации odata.context не найден» после успешного исправления - PullRequest
0 голосов
/ 27 марта 2019

Я работаю над веб-сайтом ASP.Net Core 2.1 MVC и использую Simple.OData.V4.Client v 5.6.2 для вызова API ASP.NET Core 2.2, размещенного в Azure. API реализует Microsoft.AspNetCore.OData v7.1.0

Когда я выполняю вызов PATCH от клиента, API корректно исправляет запись, но когда клиент получает ответ, я получаю следующую ошибку:

An unhandled exception occurred while processing the request.
ODataException: The required instance annotation 'odata.context' was not found at the beginning of a response payload.
Microsoft.OData.JsonLight.ODataJsonLightDeserializer.ReadContextUriAnnotation(ODataPayloadKind payloadKind, PropertyAndAnnotationCollector propertyAndAnnotationCollector, bool failOnMissingContextUriAnnotation)

API предназначен для возврата «204 Нет содержимого» (в соответствии с https://www.odata.org рекомендациями), и поэтому, конечно, в полезной нагрузке ответа «odata.context» нет.

Я искал в Google, используя сообщение об ошибке, и, кажется, должен быть способ справиться с этим в ODataClientSettings. Однако пока мне не повезло.

Я пытался ...

oDataClientSettings.IncludeAnnotationsInResults = false;

Но это не имело значения в ошибке.

Я тоже пытался ...

oDataClientSettings.PayloadFormat = ODataPayloadFormat.Json;

Опять же, без разницы в ошибке.

Вот мой метод Edit, который вызывает конечную точку API PATCH.

    [HttpPost]
    public async Task<IActionResult> Edit(EditAddressComplianceCodeViewModel editVm, string cancel)
    {
        if (!string.IsNullOrEmpty(cancel))
        {
            return RedirectToAction("Index", "AddressComplianceCodes");
        }

        if (!ModelState.IsValid) return View(editVm);

        try
        {
            var tokenSource = new CancellationTokenSource();
            var token = tokenSource.Token;

            var accessToken = await _psUtils.GetApiAccessToken(token);

            var oDataClientSettings = SetODataToken(_psUtils.GetBaseUspsReferenceApiUrl(), accessToken);
            oDataClientSettings.IncludeAnnotationsInResults = false;
            oDataClientSettings.PayloadFormat = ODataPayloadFormat.Json;

            var client = new ODataClient(oDataClientSettings);

            var response = await client.For<AddressComplianceCode>()
                .Key(editVm.Code)
                .Set(new
                {
                    editVm.Description,
                })
                .UpdateEntryAsync(token); //<-- ODataException occurs when this block of code is executed.


            _logger.LogInformation($"User ID [{User.Identity.Name}] edited the Address Compliance Code reocrd for code [{response.Code}].");

            return RedirectToAction("Index", "AddressComplianceCodes");

        }
        catch (Exception ex)
        {
            var message = $"An exception has occurred trying to edit the Address Compliance Code record for [{editVm.Code}].";
            _logger.LogError(ex, message);
            throw;
        }

    }

Ожидаемый результат - редактирование будет применено к записи, а страница будет перенаправлена ​​на список записей. Правка действительно применяется к записи в базе данных через API, однако я получаю ODataException в точке, указанной в коде выше. Не попадает в строку _logger.

Когда я тестирую API в Почтальоне, я получаю успешный статус 204 Нет содержимого и пустое тело ответа (как и следовало ожидать для ответа 204)

Есть идеи?

...