Посылает ли сервер Signalr все ожидающие запросы в виде одного ответа на опрос при длительном опросе?

Мы получаем ожидающие запросы для клиента-сигнализатора, сгруппированные в виде массива в ответе на опрос, как показано ниже:

{"C":"s-0,9E632",
"M":[
84
{"H":"MyHub","M":"SetSomething","A":[{"myProp1":"setting","myProp2":59.0}]}
1,
84
{"H":"MyHub","M":"SetSomething","A":[{"myProp1":"setting","myProp2":60.0}]}
1,
84
{"H":"MyHub","M":"SetSomething","A":[{"myProp1":"setting","myProp2":61.0}]} 
1,
84
{"H":"MyHub","M":"SetSomething","A":[{"myProp1":"setting","myProp2":62.0}]}
1,
6b
{"H":"MyHub","M":"SetMore","A":[{"myProp3":"Somestring","myProp4":0}]}
2
]}

Как правило, один ответ на опрос выглядит так:

{"C":"s-0,9E621","M":[
6b
{"H":"MyHub","M":"SetSomething","A":[{"myProp1":"setting","myProp2":59.0}]}
2
]}

Я полагаю, что кольцевой буфер хранит сообщения до предела DefaultMessageBufferSize и будет отправлять эти сообщения клиенту при опросе. Мой вопрос заключается в том, будут ли они отправляться одна за другой, как очередь, один ответ на один опрос, или все сообщения будут отправляться вместе в качестве ответа на первый опрос (как мы уже упоминали выше)?

Предыстория и актуальная проблема: у нас есть клиент сигнализатора (C1), работающий над longpolling, и наш сервер SignalR в облаке. Есть пользователь (U1), который подключается к серверу и отправляет сообщения для C1, и мы пересылаем эти сообщения в C1, используя Clients.User({C1}).{Method} на сервере. Когда U1 отправляет несколько быстрых запросов в C1, и C1 не может обработать их достаточно быстро, мы видим группированный ответ, отправленный в C1. C1 не настроен для обработки группового ответа, и он отклоняет этот ответ, и мы видим бесконечный цикл того же группированного ответа на C1 от сервера для каждого последующего опроса.

Был бы признателен за любые идеи в этом. Заранее спасибо.

1 ответ

Что касается ответа на этот вопрос, во-первых, signalR никогда не будет подключаться по умолчанию при длинном пуле.

Рабочая процедура для SignalR-

  1. Он пытается соединиться с WebSocket.

  2. Если он не может подключиться, он пытается установить соединение с событиями, отправленными сервером.

  3. Даже если это терпит неудачу, тогда это пытается с рамкой сервера.

  4. Даже если это не удается, он использует длинный опрос в качестве запасного варианта.

Больше можно найти здесь.

А что касается его производительности, вы можете найти больше здесь.

Итак, проверено, что signalR может обрабатывать столько же запросов, сколько может обрабатывать сетевое устройство, поэтому практически нет ограничений в отношении передачи данных.

Ответ на ваш вопрос

В вашем случае там нужно проверить несколько вещей.

  1. HTTPS включен? Если нет, перейдите по этой ссылке для настройки HTTPS, потому что без HTTPS вы никогда не сможете использовать WebSocket, и это рекомендуется.

  2. Если HTTP включен, то он должен связываться с WebSocket, где такого рода проблемы никогда не возникнут, если сеть в порядке. Но для вашего случая, я думаю, есть проблема с вашей сетью, поэтому некоторые данные отсутствуют, поэтому она отправляет слишком много данных одновременно.

  3. Пожалуйста, проверьте конфигурацию тайм-аута для signalR. Вы можете попробовать изменить настройки тайм-аута для signalR.

Я думаю, что если вы будете следовать этим 3 вещам, вы сможете найти решение своей проблемы.

Другие вопросы по тегам