Нужно ли дробить данные при отправке через 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; }
}

Думаю в такой ситуации нужно именно делить по байтам. Т.е, порядок действий должен быть такой:

  1. Клиент после аутентификации получает от сервера максимальный размер отправляемых данных.
  2. Клиент перед каждой отправкой любых данных должен отправлять их не как (IReadOnlyCollection<Details> details), а как (byte[] chunk, int current, int total)
  3. Сервер при каждом получении данных должен их сохранять и если current == total, то он пытается преобразовать byte [] chunks в IReadOnlyCollection<Details> details. Если ошибка, то удаляем из списка все полученные данные от клиента.
  4. Если успешно преобразовали данные, то в таком же порядке уже отправляем админу и он при получении их сам преобразует.
  5. При отключении клиента нужно удалять все полученные данные по ConnectionId.

Ответы (0 шт):