【发布时间】:2022-09-28 21:04:01
【问题描述】:
我正在尝试使用 Azure SignalR 服务(免费层)运行 .net 核心应用程序。 .net 核心应用部署在 Azure Kubernetes 服务中。我有一个尝试连接到 WebSocket 的 Angular 前端应用程序。以下是我在 Program.cs 文件中的配置:
services.AddCors(options => options.AddPolicy(\"testing\", builder =>
{
builder.WithOrigins(\"https://somebackendserver.com\");
builder.AllowCredentials();
builder.AllowAnyHeader();
builder.AllowAnyMethod();
}));
services.AddSignalR(options =>
{
options.EnableDetailedErrors = true;
}).AddAzureSignalR(connectionStringSignalR);
app.UseCors(\"testing\");
app.UseEndpoints(configure =>
{
configure.MapHub<GenerationNotificationHub>(\"/hub\");
});
这是我创建连接的 Angular 端代码:
public createConnection = (): void => {
this.hubConnection = new signalR.HubConnectionBuilder()
.configureLogging(signalR.LogLevel.Error)
.withUrl(`https://somebackendserver.com/hub`,
{
accessTokenFactory: () => this.sessionService.get(SignalrNotificationService.accessTokenStorageKey),
transport: signalR.HttpTransportType.WebSockets,
skipNegotiation: true
})
.withAutomaticReconnect()
.build();
this.hubConnection.start().then().catch();
}
在 AKS 中部署解决方案时,我在浏览器控制台窗口中收到以下错误:
错误:无法启动连接:错误:WebSocket 无法启动 连接。在服务器上找不到连接,要么 端点可能不是 SignalR 端点,连接 ID 不是 存在于服务器上,或者存在阻止 WebSockets 的代理。如果你 让多个服务器检查是否启用了粘性会话。
这是服务器端错误日志
连接失败 \'(主)https://xxx.service.signalr.net(hub=GenerationNotificationHub)\', 将在退避期后重试。错误详情:无法连接 到远程服务器。从 传输流.. ID:958c67ab-1e91-4983-83ad-bfaf02bc48da
这是我尝试连接到 WebSocket 时出现的 Postman 错误:
状态码:向 WebSocket 所在的站点发出 503 WebSocket 请求 禁用。请求标头 Sec-WebSocket-Version:13 Sec-WebSocket-Key: AjiVAXGSpcYCbiGbftHbcg== 连接:升级升级:websocket Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits 主机:somebackendserver.com 响应标头内容长度:27 内容类型:文本/html 日期:星期一,2022 年 9 月 19 日 13:44:16 GMT 服务器: 微软-IIS/10.0
当我尝试在 localhost 上运行该应用程序时,它运行良好,但当我将它部署为 Azure 中的 Kubernetes 服务时,似乎出现了问题。
编辑:我们有一个 Kong API 网关来管理我们的 API 网关服务,我怀疑它以某种方式阻止了 SignalR websocket 网络连接。我不断收到此 CORS 错误
访问 >\'https://api.XXX.dev.XXXXXX.com/hub/generation/negotiate?negotiateVersion=1\' 从源 \'https://XXXX.dev.XXXXXX.com\' 获取已 > 被 CORS 政策阻止: 对预检请求的响应未通过访问控制检查:\'Access-Control-Allow-Origin\' 标头的值 >\'https://portal.api.dev.XXXX.com\' 不是等于提供的 >origin。让服务器发送带有有效值的标头,或者,如果不透明的响应满足您的需求,请将请求的模式设置为 \'no-cors\' >以获取禁用 CORS 的资源。
标签: angular asp.net-core kubernetes kong azure-signalr