У меня возникают проблемы с 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); });
});
});
}