HttpPatchAsync работает в Windows, но не в Linux

#.net #linux #docker #asp.net-core #.net-core

Вопрос:

У меня есть конечная точка в API .Net Core, работающая в контейнере Linux

 [HttpPatch] // inside controller called Customer
public async Task<IActionResult> PatchAsync([FromBody] TestObject entity)
{
    return Ok(await _service.PatchAsync(entity));
}
 

Поко

 public class TestObject 
{
    [JsonProperty(PropertyName = "Code")]
    public string Code { get; set; }
    [JsonProperty(PropertyName = "Name")]
    public string Name { get; set; }
}
    
 

из моего приложения Blazor у меня есть следующий код для обновления сущности

 public async Task<bool> UpdateEntity(TestObject entity)
{
    var content = new StringContent(JsonConvert.SerializeObject(entity), Encoding.UTF8, "application/json");
    using (var httpClient = new HttpClient())
    {
        using (var response = await httpClient.PatchAsync(@"http://someserverpath:5000/api/v1/Customer", content))
        {
            string apiResponse = await response.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<bool>(apiResponse);
        }
    }
}
 

Проблема, с которой я сталкиваюсь, когда запускаю код локально в Windows 10, работает. Когда я запускаю этот код в контейнере докеров Linux, я получаю следующее исключение

Ошибка: Newtonsoft.Json.JsonReaderException: Неожиданный символ, обнаруженный при анализе значения: «Путь «, строка 1, позиция 1.

Комментарии:

1. Что работает в Linux? API? Что возвращает API? Я предполагаю, что он возвращает сообщение об ошибке, поэтому вам следует проверять код ответа HTTP при использовании HttpClient.

2. API всегда работает в контейнере linux. Приложение запускается из visual studio в Windows 10, и это работает, когда я запускаю приложение локально в контейнере Linux, я получаю исключение

3. api не возвращает код ответа, я получаю фатальную ошибку (исключение Newtonsoft.Json.JsonReaderException) внутри blazor.server.js:21, поэтому я предполагаю, что это происходит до того, как api будет поражен

4. единственная разница-linux против Windows

5. Я использую патч с Blazor Wasm на Mac, и у меня нет проблем. Я не использую JSON.NET либо, поскольку HTTP-патч не имеет ничего общего с сериализатором JSON. Ваш собственный код просто сериализует содержимое, которое может быть прекрасно обработано System.Text.Json. Исключение жалуется на строку json . Где возникает эта ошибка? На клиента? Сервер? Каков полный текст исключения? Каков полный текст?

Ответ №1:

Попробуйте что-нибудь вроде этого:

 public async Task<bool> UpdateEntity(TestObject entity)
{
    var content = new StringContent(JsonConvert.SerializeObject(entity), Encoding.UTF8, "application/json");
    using var httpClient = new HttpClient();
    using var response = await httpClient.PatchAsync(@"http://someserverpath:5000/api/v1/Customer", content);
        
    string apiResponse = await response.Content.ReadAsStringAsync();
    if (response.IsSuccessStatusCode) {
        return JsonConvert.DeserializeObject<bool>(apiResponse);
    } else {
        throw new Exception("Something went wrong when.... See inner excpetion.", new Exception(apiResponse));
    }
}
 

Скорее всего, вы получили неудачный ответ и вам необходимо вернуть исключение, созданное API. Справьтесь с этим так, как вы обычно поступаете в своем решении