Есть клиент-серверное решение с использованием SignalR: обычные клиенты, сервер и админ. Обычный клиент отправляет данные серверу, а потом сервер перенаправляет их админу(ам). В какой-то момент при отправке больших данных клиентом серверу(как выяснилось больше 32kb) получал ошибку и пришлось на сервере добавить в параметры это:
services.AddSignalR(o =>
{
o.MaximumReceiveMessageSize = null;
});
Да, сейчас все работает, но правильно ли это? Или включение этой опции спасает даже при отправке условно данных на 1гб?
Я думаю разбить отправку по частям, но проблема в том, что отправляемые данные - коллекция классов(пример IReadOnlyCollection details, у которого есть внутри еще коллекции разного размера.
public class ChangeSet
{
//разные свойства
//какой-то список
}
public class Details
{
//разные свойства
public List<ChangeSet> Added { get; set; }
public List<ChangeSet> Removed { get; set; }
}
Думаю в такой ситуации нужно именно делить по байтам. Т.е, порядок действий должен быть такой:
- Клиент после аутентификации получает от сервера максимальный размер отправляемых данных.
- Клиент перед каждой отправкой любых данных должен отправлять их не как (IReadOnlyCollection details), а как (byte[] chunk, int current, int total)
- Сервер при каждом получении данных должен их сохранять и если current == total, то он пытается преобразовать byte [] chunks в IReadOnlyCollection details. Если ошибка, то удаляем из списка все полученные данные от клиента.
- Если успешно преобразовали данные, то в таком же порядке уже отправляем админу и он при получении их сам преобразует.
- При отключении клиента нужно удалять все полученные данные по ConnectionId.