В настоящее время я работаю над давним проектом, в котором используется Newtonsoft.JSON. К сожалению, насколько мне удалось найти, эта библиотека не поддерживает асинхронную потоковую передачу.
Изначально мы планировали увеличить память сервера, чтобы вместить большие объемы возвращаемых данных. Однако вместо этого мы предпочитаем реализовать потоковый подход. Этот метод включает в себя запрос всех данных из базы данных, их пакетную обработку и возврат каждого пакета клиенту. Это хорошо работает до определенного размера (около нескольких ГБ, примерно 35 миллионов записей). Однако, как только мы превысим этот предел, я сталкиваюсь с ошибкой на клиенте: ответ завершился преждевременно. (Ответ закончился). Несмотря на это, все журналы сервера показывают, что приложение все еще работает и обрабатывает данные, а база данных и контейнеры работают нормально.
Учитывая, что для репликации проблемы требуется значительный объем данных , я пытаюсь определить, кроется ли проблема в коде или это ограничение Newtonsoft.JSON. В последнем случае может потребоваться переход на System.Text.Json (или другую альтернативу).
Код сервера:
[AcceptVerbs("POST", Route = "stream")]
public async Task StreamAsync([FromBody] Request request)
{
await using var sw = new StreamWriter(Response.Body, leaveOpen: true);
await foreach (var response in StreamDataAsync(request))
await StreamResponse(sw, response); // returns approximately 20k records at a time
}
private async Task StreamResponse(StreamWriter sw, object response)
{
await sw.WriteLineAsync(JsonConvert.SerializeObject(response));
await sw.FlushAsync();
}
Код клиента:
try
{
using (var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
{
response.EnsureSuccessStatusCode();
using (var stream = await response.Content.ReadAsStreamAsync())
using (var reader = new StreamReader(stream))
{
string streamedResponse = null;
while ((streamedResponse = await reader.ReadLineAsync()) != null)
{
results.Add(JsonSerializer.Deserialize(streamedResponse));
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); // Response Ended Prematurely Here
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... newtonsoft
Как я могу передавать большой объем данных (более 50 ГБ) с помощью Newtonsoft? ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как я могу передавать большой объем данных (более 50 ГБ) с помощью Newtonsoft?
Anonymous » » в форуме C# - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Передавать или не передавать модель представления в составной элемент
Anonymous » » в форуме Android - 0 Ответы
- 39 Просмотры
-
Последнее сообщение Anonymous
-