Посылает ли сервер 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-
Он пытается соединиться с WebSocket.
Если он не может подключиться, он пытается установить соединение с событиями, отправленными сервером.
Даже если это терпит неудачу, тогда это пытается с рамкой сервера.
Даже если это не удается, он использует длинный опрос в качестве запасного варианта.
Больше можно найти здесь.
А что касается его производительности, вы можете найти больше здесь.
Итак, проверено, что signalR может обрабатывать столько же запросов, сколько может обрабатывать сетевое устройство, поэтому практически нет ограничений в отношении передачи данных.
Ответ на ваш вопрос
В вашем случае там нужно проверить несколько вещей.
HTTPS включен? Если нет, перейдите по этой ссылке для настройки HTTPS, потому что без HTTPS вы никогда не сможете использовать WebSocket, и это рекомендуется.
Если HTTP включен, то он должен связываться с WebSocket, где такого рода проблемы никогда не возникнут, если сеть в порядке. Но для вашего случая, я думаю, есть проблема с вашей сетью, поэтому некоторые данные отсутствуют, поэтому она отправляет слишком много данных одновременно.
Пожалуйста, проверьте конфигурацию тайм-аута для signalR. Вы можете попробовать изменить настройки тайм-аута для signalR.
Я думаю, что если вы будете следовать этим 3 вещам, вы сможете найти решение своей проблемы.