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

jun*_*ace 5 timeout downgrade websocket signalr

我有一个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;
}
Run Code Online (Sandbox Code Playgroud)

除了连接到实际的websockets之外,一切似乎都能正常工作.每次客户端尝试建立连接时,都会有超时并且它会故障转移到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.
Run Code Online (Sandbox Code Playgroud)

我已经尝试过遵循signalR团队提供的指南,我看不出我错过了什么.

谢谢你的帮助!

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

jon*_*827 6

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

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

  • 救了我。非常感谢你。 (2认同)

dki*_*fer 0

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

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

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

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