#.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. Справьтесь с этим так, как вы обычно поступаете в своем решении