【发布时间】:2021-03-25 18:39:12
【问题描述】:
我有一个客户端(角度)应用程序服务和一个 api(net core 3.1)应用程序服务,我试图通过信号器相互交谈。它在带有 websocket 的 localhost 上运行良好,但在 azure app 服务上它仅适用于 longpolling 传输模式,即使我在配置中启用了 websocket。协商返回 200 以及 connectionId 和所有三个 availableTransport。但是wss请求返回404如下图。
WebSocket connection to 'wss://xxxx.azurewebsites.net/notifications?id=ZI0-a_p5G6YziWhCxxc7Kg&access_token=eyJhbGc.. failed: Error during WebSocket handshake: Unexpected response code: 404
Utils.js:218 [2021-03-25T18:21:13.045Z] Error: Failed to start the transport 'WebSockets': Error: There was an error with the transport.
我已尝试查看大量资源和文档来解决此问题,因此我们不胜感激。这是我的配置:
在startup.cs中
options.AddPolicy(MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("https://xxxxx-dev.azurewebsites.net").AllowAnyMethod().AllowAnyHeader().AllowCredentials();
builder.WithOrigins("http://localhost:4200").AllowAnyMethod().AllowAnyHeader().AllowCredentials();
});
....
services.AddControllers();
services.AddSignalR();
....
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<NotificationHub>("/notifications");
});
在客户端
import { HubConnectionBuilder } from '@microsoft/signalr';
....
this.hubConnection = new HubConnectionBuilder()
.withUrl("https://xxxx-dev.net/notifications",
{
accessTokenFactory: () => this.authService.getToken(),
skipNegotiation: false,
transport: signalR.HttpTransportType.None
}).configureLogging(signalR.LogLevel.Information).build();
this.hubConnection.on("test", (msg) => {
console.log("pushed data:", msg)
});
this.hubConnection.start()
.then(() => {
console.log("Connected")
})
.catch(err => {
console.error(err);
});
【问题讨论】:
-
感谢您的回复。是的,我已经检查过了。 ARR 亲和性适用于客户端和 api 应用程序,并且它使用正确的地址,因为它适用于长轮询。
-
您可以尝试为您的集线器启用/允许匿名访问,并在客户端删除
accessTokenFactory选项,然后检查它是否可以与 Azure 应用服务上的 WebSockets 传输一起正常工作。 -
@FeiHan 感谢您再次与我们联系。好的,我会检查的。
-
@FeiHan 它在 web socket 中工作,当我删除 accesstokenfactory 并将集线器设置为 AllowAnonymous 时。但我只需要授权人员连接到集线器。我该怎么办?
标签: azure .net-core signalr asp.net-core-signalr azure-signalr