1

我在 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); });
            });
        });
    }
4

1 回答 1

1

SignalR 故障排除文档

“连接 ID 的格式不正确”或“ 在活动 SignalR 连接期间用户身份无法更改”错误

如果正在使用身份验证,并且客户端在连接停止之前已注销,则可能会出现此错误。解决方案是在注销客户端之前停止 SignalR 连接。

于 2013-07-17T20:18:23.390 回答