我有一个托管在ASPNET Core RC2中的Web 套接字服务器。它在我的本地开发盒上运行良好,仅在 kestrel 上运行时,以及当 kestrel 托管在 IIS 中时。当使用谷歌浏览器连接到 websocket 服务器时,它在本地盒子和远程盒子上都可以正常工作:
JavaScript:
new WebSocket("wss://myServer:8087")
但是,当 JavaScript 连接到托管在我们的构建机器(操作系统:Server 2008 R2)上的同一台服务器时,客户端会收到此302(重定向)错误:
WebSocket 连接到“wss://myBuildServer:8087/”失败:WebSocket 握手期间出错:意外响应代码:302
注意:当 JavaScript 在服务器本身的 Chrome 上运行时,错误是不同的:
WebSocket 连接到“wss://xxx:8087/”失败:WebSocket 打开握手被取消
添加 Web 套接字的 C# 源代码(Microsoft.AspNetCore.WebSockets.Server 0.1.0-rc2-final):
private void ConfigureWebSockets(IApplicationBuilder app)
{
DPT2.Web.Utils.Logger.Log("ConfigureWebSockets()");
_socketHandler = new Sockets.WebSocketHandler(_nodeServices);
app.UseWebSockets(new WebSocketOptions{
//try to fix 302 redirect on build m/c:
ReplaceFeature = true,
//TODO tune via these params:
KeepAliveInterval = TimeSpan.FromMinutes(2),
ReceiveBufferSize = 4 * 1024
});
app.Use(async (http, next) =>
{
if (http.WebSockets.IsWebSocketRequest)
{
var webSocket = await http.WebSockets.AcceptWebSocketAsync();
if (webSocket != null && webSocket.State == WebSocketState.Open)
{
await _socketHandler.Handle(webSocket);
}
}
else
{
// Nothing to do here, pass downstream.
await next();
}
});
}
看起来该请求以某种方式被“损坏”,并且此 C# 行不将其识别为 Web 套接字请求,因此将其传递给 MVC:
if (http.WebSockets.IsWebSocketRequest)
版本:
服务器操作系统:Windows 2008 R2
IIS 6.1 内部版本 7601 - SP1
IIS 管理器 7.5.7600.16385
安装了 ASPNET Core 主机:DotNetCore.1.0.0.RC2-WindowsHosting.exe
我尝试了一些解决方法:
使用http作为站点,使用ws://作为 Web 套接字 URL
对站点使用https ,对 Web 套接字 URL使用wss://
将ReplaceFeature选项添加到 websocket 服务器
有没有其他人看到过类似的问题?
我认为这与 IIS 作为 kestrel 的反向代理有关,也许在那台特定的机器上,代理正在搞乱 Web 套接字请求......
这可能是服务器上的配置问题...
肖恩