首页 > 解决方案 > SignalR 不在 IIS Express 10 上使用 websocket

问题描述

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

不幸的是,SignalR 不使用 WebSockets,不幸的是我没有找到强制它这样做的方法。

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

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

在客户端配置是:

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

使用以下答案协商来自 SignalR 结果客户端的请求:

{"connectionId":"1SyteS9TsDE5Q8LBRb2-VA","availableTransports":[]}

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

Error: Failed to start the connection: Error: Unable to initialize any of the available transports.

这显然意味着没有使用 websockets 并且 SignalR 无法初始化 websockets。

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

<section name="webSocket" overrideModeDefault="Allow" />

但没有任何改变。

如果要禁用协商,SignalR 客户端会尝试直接使用 url 使用 WebSocket,如下所示:

wss://localhost:44360/hubs/clients

但此请求导致错误代码 400:

Error during WebSocket handshake: Unexpected response code: 400

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

标签: websocket.net-coreiis-expressasp.net-core-signalr

解决方案


我没有回答你的问题,但有原因。

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

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

启动设置.json


推荐阅读