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 中始终降级为服务器发送事件的主要内容,如果未能解决你的问题,请参考以下文章
将 REST 与 SignalR 混合而不是仅使用 SignalR 的目的是啥? [复制]