SignalR在IIS Express 10上不使用websockets

Vla*_*lev 7 websocket iis-express .net-core asp.net-core-signalr

我有带SignalR的.NET Core 2.2 + ASP.NET Core 2.2。在我的开发环境中,我具有带有IIS Express 10的Win7。

不幸的是,SignalR不使用WebSockets,不幸的是,我没有找到强迫它使用的方法。

在服务器端,SignalR的配置如下:

app.UseSignalR(
    routeBuilder => routeBuilder
        .MapHub<ClientsHub>(
            "/hubs/clients",
            options => options.Transports = HttpTransportType.WebSockets)
);
Run Code Online (Sandbox Code Playgroud)

在客户端配置是:

this._connection = new signalR.HubConnectionBuilder()
  .withUrl(this.api.getHubUrl(url), {
    transport: HttpTransportType.WebSockets
  })
  .build();
Run Code Online (Sandbox Code Playgroud)

来自SignalR客户端的协商请求结果如下:

{"connectionId":"1SyteS9TsDE5Q8LBRb2-VA","availableTransports":[]}
Run Code Online (Sandbox Code Playgroud)

结果,SignalR的客户端将此消息写入控制台:

Error: Failed to start the connection: Error: Unable to initialize any of the available transports.
Run Code Online (Sandbox Code Playgroud)

显然,这意味着未使用websocket,SignalR无法初始化websocket。

我发现使用Google时,IIS Express默认禁用了websocket,我必须先启用它们。我在文件applicationhost.config的IISExpress / config文件夹中找到了一些设置,并将其设置为Allow(默认为Deny):

<section name="webSocket" overrideModeDefault="Allow" />
Run Code Online (Sandbox Code Playgroud)

但是什么都没有改变。

如果要禁用协商,SignalR客户端将尝试通过url直接使用WebSockets,如下所示:

wss://localhost:44360/hubs/clients
Run Code Online (Sandbox Code Playgroud)

但是,此请求的结果是错误代码400:

Error during WebSocket handshake: Unexpected response code: 400
Run Code Online (Sandbox Code Playgroud)

是否有可能通过IIS 10强制SignalR使用WebSockets?还是要强制IIS 10允许SignalR使用WebSockets?

Vik*_*ini 1

我不是要回答你的问题,而是要说明原因。

Window 7 不支持 IIS Express 的 Web 套接字。这里这里的SO 答案证明了这一点。

但是,如果您使用Kestrel Web 服务器来运行您的项目,它肯定会在 Window 7 上使用 Web 套接字。我已经在使用 VS 2019 在 .NET Core 3.1 上构建的项目中进行了相同的测试。

启动设置.json