2013-04-15 2 views
3

У меня есть уникальная ситуация. Я разработал веб-сайт MVC 4 и .NET-клиент, который подключается к сайту, на котором размещен концентратор SignalR. Объект hubConnection успешно подключается к концентратору. Однако созданный объект hubProxy просто не возвращается, если я вызываю hubProxy.Invoke («Test»). Wait(); который мой хаб просто возвращает обратно bool of true;Клиент SignalR .net подключается к концентратору, но не может hubProxy.Invoke()

Интересная часть заключается в том, что, когда я запускаю как сайт, так и .net-клиент локально через VS и IIS express, все работает правильно. Когда я запускаю веб-сайт на полном сервере 2008R2 IIS 7.5 и клиенте .net на моем ноутбуке, он терпит неудачу. Или более подходящим образом поток просто останавливается на HubProxy.Invoke («Тест»). Wait() и никогда не возвращается (он просто продолжает работать).

Еще более интересной является то, что я начал запускать Fiddler, чтобы посмотреть, что происходит, или если вызов перешел на веб-сервер, проблема затем решает сам, и все работает правильно.

Похоже, что какой-то скрипач, выступающий в качестве прокси-сервера для моего .net-клиента, делает работу hubProxy.Invoke(). Я бы подумал, что мой объект HubConnection потерпит неудачу, если мне понадобится прокси-сервер в любом случае? Это немного неверно, чтобы иметь возможность подключиться к подключению концентратора успешно только для того, чтобы понять, что поток, кажется, работает навсегда, пытаясь вызвать функцию на прокси-сервере?

Можно ли прояснить это поведение? И любые предложения о том, что мне нужно сделать, чтобы правильно создать HubConnection/Proxy на стороне клиента .net для вызова методов на сервере?

Кроме того, это может быть или не быть связано. Я заметил, что если я размещу свой сайт как:
http {s} // mywebsiteserver/mywebsite ", и я могу просматривать этот путь через веб-браузер, он НЕ будет работать как строка подключения signalr. Вместо этого я должен использовать полное DNS имя HTTP {S} // mywebsiteserver.mydomainname.xyz/mywebsite

Любые предложения?

Спасибо! Майк

ответ

7

мне кажется, что вам нужно установить ServicePointManager.DefaultConnectionLimit в значение больше, чем его значение по умолчанию 2 в .NET-клиенте до, начиная с вашего HubConnection или других HTTP-запросов. Я нашел 10, чтобы быть разумным пределом для запуска одного SignalR HubConnection.

Как правило, SignalR будет иметь только 2 или менее одновременных HTTP-соединения, но это не всегда так. Я обнаружил, что запуск Fiddler иногда скрывает эту проблему, но я не уверен, почему.

+1

Unreal, вы 100% правильно. Это ответ. Было бы очень полезно, если бы эта информация была помещена в SignalR Wiki. Казалось бы, все, кто попытается использовать клиент .NET signalR, будут иметь эту проблему? Странно, что он нигде не задокументирован, или я пропустил его где-нибудь? – user1686912

0

Другим объяснением может быть то, что вам нужно дважды проверить свой URL-адрес.

Давайте предположим, что ваш хаб на site.com и у вас есть 301 перенаправления из www.site.com к site.com.

Тогда SignalR может показаться, чтобы установить соединение при использовании

_hubConnection = new HubConnection("http://www.yoursite.com/signalr"); 

, но в этом случае вы должны использовать

_hubConnection = new HubConnection("http://yoursite.com/signalr"); 

В противном случае _hubConnection.Старт, похоже, работает, но _proxy.Invoke нет. Я сделал эту ошибку сам. :)

0

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

Смежные вопросы