【发布时间】:2019-12-29 16:29:15
【问题描述】:
我有 .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 默认禁用 websockets,我必须先启用它们。我在文件 applicationhost.config 的 IISExpress/config 文件夹中找到了一些设置,并将其设置为 Allow(默认情况下为 Deny):
<section name="webSocket" overrideModeDefault="Allow" />
但没有任何改变。
如果禁用协商,SignalR 客户端会尝试使用 WebSockets 直接使用 url,如下所示:
wss://localhost:44360/hubs/clients
但是这个请求的结果是错误代码 400:
Error during WebSocket handshake: Unexpected response code: 400
是否有可能通过 IIS 10 强制 SignalR 使用 WebSockets? 还是强制 IIS 10 允许 SignalR 使用 WebSockets?
【问题讨论】:
-
我在使用 VS2017 时也遇到了这个问题。 IISExpress 基本上忽略了 ws:// 初始连接请求,我看不到任何调试端表明该请求已被听到。但是,当作为独立的 Kesteral 主机直接针对 Web 项目进行调试时,它运行良好并快速升级到 wss://。此外,我没有使用上面提到的任何强制协议,但不得不在 IISExpress 中强制使用 SSE。附加说明,如果相关的话,IIS 网络主机似乎也不接受 ws:// 连接。
-
你有没有找到任何解决方案,因为我面临同样的情况
标签: websocket .net-core iis-express asp.net-core-signalr