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