我在 SignalR (1.1.2) 尝试创建基本的实时聊天设置时遇到了一些问题,在花了大约一周的时间(包括浏览 SignalR 源)之后,我有点结束了我可以尝试的事情...
我有(我认为)一个相当复杂的 SignalR 设置,包括:
- 负载平衡的服务器
- Redis 消息总线
- 每台服务器上有两个站点(ASP.NET Webforms VB.NET 桌面站点和 MVC3 C# 移动站点)
每个站点都包含自己的中心和另一个站点,因此每个页面都可以向每个站点发送消息。
查看 Chrome 检查器(在移动站点上的此示例中),集线器都已加载,移动设备的协商步骤成功,但连接尝试在 3 秒后失败并出现错误:
EventSource 的响应具有不是“text/event-stream”的 MIME 类型(“text/html”)。中止连接。
这当然是我们在 Microsoft.Owin.Host.SystemWeb 抛出后的自定义 500 错误页面:
连接 ID 的格式不正确。
一旦发生这种情况,大多数情况下它会进入某种奇怪的循环,它会继续抛出数百个这样的错误并发送大量 ping,然后是 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); });
});
});
}