SignalR - 在 Chrome/Firefox 中始终降级为服务器发送事件

Posted

技术标签:

【中文标题】SignalR - 在 Chrome/Firefox 中始终降级为服务器发送事件【英文标题】:SignalR - Always downgraded to server sent events in Chrome/Firefox 【发布时间】:2014-10-21 09:13:25 【问题描述】:

我有一个 API 应用程序和一个 Web 应用程序(为了简单起见,在同一台服务器上 -- 我稍后会做 CORS 的工作)。

带有 IIS 8.5 的 Windows Server 2012 通过“程序和功能”安装的 Websockets 防火墙已关闭

该 api 使用 owin + signalr 并进行了正确的初始化(将其修剪以发现错误):

public void Configuration(IAppBuilder app)

    GlobalHost.Configuration.TransportConnectTimeout = TimeSpan.FromSeconds(5);
    app.MapSignalR();
    app.UseWebApi(Startup.CreateConfiguration());


private static HttpConfiguration CreateConfiguration()

    HttpConfiguration configuration = new HttpConfiguration();
    configuration.MapHttpAttributeRoutes();
    return configuration;

除了连接到实际的 websocket 之外,一切似乎都运行良好。每次客户端尝试建立连接时,都会出现超时并故障转移到 SSE(或 IE 中的永久帧/长轮询)。我将超时时间增加到 25 秒,并且出现了相同的症状。

在客户端上,我在打开日志记录时一直收到此错误:

SignalR: Connecting to websocket endpoint 'ws://[myurl]'.
SignalR: Websocket opened.
SignalR: **webSockets timed out when trying to connect.**
SignalR: Closing the Websocket.
SignalR: Attempting to connect to SSE endpoint 'http://[myurl]'.
SignalR: EventSource connected.
SignalR: serverSentEvents transport selected. Initiating start request.
SignalR: The start request succeeded. Transitioning to the connected state.

我已尝试按照 signalR 团队提供的指南进行操作,但看不到我缺少什么。

感谢您的帮助!

更新: 我下载了一个示例并在服务器上按原样运行它。 同样的情况,所以这很可能是我错过的服务器配置设置。我仍然没有找到我错过的东西。

【问题讨论】:

您是否尝试过从您的 Windows Server 计算机建立 SignalR 连接?这可能与网络有关。客户端和服务器之间可能存在代理或其他不正确支持 WebSockets 的东西。 太棒了。对所有这些事情进行故障排除后,我忘记了检查电线的简单规则。请将此作为答案,以便我接受。 SignalR 团队由政治任命的伪开发人员组成。代码无关紧要,只有 PC 组隶属关系.. 【参考方案1】:

您需要在服务器管理器中为网站启用 WebSockets。

http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-websocket-protocol-support

【讨论】:

救了我的命。非常感谢。【参考方案2】:

尝试从您的 Windows Server 计算机本身建立 SignalR 连接。这可能与网络有关。客户端和服务器之间可能存在代理或其他不正确支持 WebSockets 的东西。

【讨论】:

【参考方案3】:

如果您位于带有“企业”防火墙的网络内部,它可能会破坏 websockets 握手。

但是,如果您通过 SSL 访问您的服务器,则可以防止这种干扰。我亲眼目睹了这多次成为企业环境中 websockets 问题的原因和解决方案。

【讨论】:

【参考方案4】:

这可能与您的 IIS 设置有关。我在http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/supported-platforms看到了这些

-IIS 必须在集成模式下运行;不支持经典模式。如果 IIS 使用服务器发送事件传输以经典模式运行,则可能会遇到长达 30 秒的消息延迟。

-托管应用程序必须在完全信任模式下运行。

此外,它还提到了 .NET 4.5 作为目标框架。希望这会有所帮助。

【讨论】:

谢谢。我仔细检查了所有这些,它们都设置正确。问题依然存在。

以上是关于SignalR - 在 Chrome/Firefox 中始终降级为服务器发送事件的主要内容,如果未能解决你的问题,请参考以下文章

SignalR系列教程:在MVC在使用SignalR

MVC5使用SignalR进行双向通信

将 REST 与 SignalR 混合而不是仅使用 SignalR 的目的是啥? [复制]

ASP.NET Core SignalR :SignalR Javascript 客户端

如何终止 SignalR 连接?

使用 .NET 客户端时的 SignalR 传输