Я работаю над веб-сайтом 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)
Есть идеи?