我在 ASPNET Core RC2 中托管了网络套件服务器。 它在我的本地开发盒上工作正常,只在kestrel上运行时,以及在IIS中托管kestrel时。 当使用谷歌浏览器连接到websocket服务器时,它可以在本地盒子和远程盒子上正常工作:
JavaScript的:
new WebSocket("wss://myServer:8087")
但是,当JavaScript连接到我们的构建计算机( OS: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 build 7601 - SP1
IIS管理器7.5.7600.16385
安装了ASPNET Core主机:DotNetCore.1.0.0.RC2-WindowsHosting.exe
我尝试了一些解决方法:
使用 http 作为网站,使用 ws:// 作为网络套接字网址
使用 https 作为网站,使用 wss:// 作为网络套接字网址
将 ReplaceFeature 选项添加到websocket服务器
还有其他人看过类似的问题吗?
我认为它与IIS充当了红场的反向代理,也许在那台特定的机器上,代理正在搞乱网络套接字请求......
这可能是服务器上的配置问题......
肖恩