我有一个API应用程序和一个web应用程序(为了简单起见,我将在同一台服务器上做CORS的工作)。
- 带有IIS 8.5的Windows Server 2012
- 通过"程序和功能"安装的Websocket
- 防火墙已关闭
api使用owin+信号器,并进行了正确的初始化(对其进行了微调以查找错误):
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.
我试着遵循信号员团队提供的指南,但我看不出我缺少了什么。
谢谢你的帮助!
更新:我下载了一个示例,并在服务器上按原样运行。同样的情况,所以这可能是我一路上错过的服务器配置设置。我仍然没有找到我错过的东西。
您需要在服务器管理器中为网站启用WebSockets。
http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-websocket-protocol-support
尝试从Windows Server机器本身建立SignalR连接。这可能与网络有关。也许在客户端和服务器之间有一个代理或其他什么东西不正确地支持WebSockets。
如果你在一个有"公司"防火墙的网络中,它可能会破坏websockets握手。
但是,如果您通过SSL访问服务器,则可以防止这种干扰。我已经多次亲眼看到这是企业环境中websocket问题的原因和解决方案。
这可能与IIS设置有关。我在上面看到这些http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/supported-platforms
-IIS必须以集成模式运行;不支持经典模式。如果IIS使用"服务器发送的事件"传输以经典模式运行,则可能会出现长达30秒的消息延迟。
-托管应用程序必须在完全信任模式下运行。
此外,它还提到了.NET 4.5作为目标框架的一些内容。希望这能有所帮助。