1

我有一个托管在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 套接字请求......

这可能是服务器上的配置问题...

肖恩

4

0 回答 0