2013-07-11 5 views
1

У меня возникают проблемы с SignalR (1.1.2), которые пытаются создать базовую настройку чата в реальном времени и потратив на нее неделю (включая траление через источник SignalR). Я как бы конец того, что я могу попробовать ...Проблемы с подключением SignalR

у меня есть (я думаю) довольно сложная установка, состоящая из SignalR:

  • балансировки нагрузки серверов
  • Redis сообщение шина
  • двух сайтов на каждом сервере (Рабочий стол ASP.NET Webforms VB.NET и MVC3 C# mobi le site)

Каждый из сайтов включает в себя центр самого себя и другого сайта, поэтому каждая страница может отправлять сообщения на каждый сайт.

Глядя в инспекторе Chrome (в данном примере на мобильном сайте), концентраторы оба загружены, переговоры шаг для мобильных устройств является успешным, но попытка подключения не удается через 3 секунды с ошибкой:

EventSource лет ответ имеет тип MIME («текст/html»), который не является «текстом/потоком событий». Прерывание соединения.

, который, конечно, наша страница ошибки 500 пользовательских после Microsoft.Owin.Host.SystemWeb бросил:

Соединение идентификатор находится в неправильном формате.

Как только это произойдет, большую часть времени это будет получить в какой-то странный цикл, где он будет продолжать бросать сотни этих ошибок и отправлять много пингов сопровождаемых longPolling подключить

Решение отлично работает в моей среде разработки (один экземпляр IIS), но переход к тестовой среде с балансировкой нагрузки - это то, где я вижу ошибки.

Я не знаю, есть ли что-нибудь еще, что я могу добавить, что может помочь, но я рад добавить его.


Я добавил следующее в файлах web.config на обоих сайтах:

<validation validateIntegratedModeConfiguration="false"/> 
<modules runAllManagedModulesForAllRequests="true"/> 

и

<add name="Access-Control-Allow-Origin" value="*"></add> 
<add name="Access-Control-Allow-Headers" value="Content-Type" /> 

В global.asax файлы имеют:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 

    RedisScaleoutConfiguration redisConfig = new RedisScaleoutConfiguration([redisIP], [port], String.Empty, "Name"); 
    redisConfig.Database = 9; 
    GlobalHost.DependencyResolver.UseRedis(redisConfig); 
} 

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    HubConfiguration hubConfig = new HubConfiguration(); 
    hubConfig.EnableCrossDomain = true; 
    hubConfig.EnableDetailedErrors = true; 
    RouteTable.Routes.MapHubs(hubConfig); 

    <snip> 
} 

Код JS у меня есть по строкам:

function setUpSignalR() { 
     //Set up the connections 
     webConnection = $.hubConnection(pageInfo.webUrl); 
     mobConnection = $.hubConnection(pageInfo.mobUrl); 

     //Get the hubs for web and mobile 
     webHub = webConnection.createHubProxies().messagingHub; 
     mobHub = mobConnection.createHubProxies().messagingHub; 

     //Hook up the call back functions 
     <snip> 

     //Now, start it up! 
     mobConnection.logging = true; 
     mobConnection.start().done(function() { 
      mobHub.server.joinConversation(pageInfo.conversationGuid, "mobile").fail(function (error) { console.log('JoinConversation for mobile connection failed. Error: ' + error); }); 
      webConnection.start().done(function() { 
       webHub.server.joinConversation(pageInfo.conversationGuid, "mobile").fail(function (error) { console.log('JoinConversation for web connection failed. Error: ' + error); }); 
      }); 
     }); 
    } 

ответ

1

От SignalR troubleshooting document:

"The connection ID is in the incorrect format" or "The user identity cannot change during an active SignalR connection" error

This error may be seen if authentication is being used, and the client is logged out before the connection is stopped. The solution is to stop the SignalR connection before logging the client out.

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