【发布时间】:2021-07-27 03:37:43
【问题描述】:
我有一个使用 dotnet core、singalR 和 react native 制作的聊天应用程序。当我在单个服务器上发布聊天时,我的聊天运行良好。但是当我通过 docker swarm 在 multiple 服务器上发布它时。我收到此错误。
无法使用任何可用的传输连接到服务器。 WebSockets 失败:错误:传输出错。
通过此错误消息,应用程序有时只能正常运行。当我离开页面并返回时,它不再工作了。
我正在使用 ubuntu 服务器。我都在服务器和客户端上对齐了 signalR 的版本。他们都使用5.0.3。我在应用程序前面没有代理服务器,我正在使用 docker swarm 的负载平衡功能。
配置服务
var tokenKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["TokenKey"]));
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(opt =>
{
opt.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = tokenKey,
ValidateAudience = false,
ValidateIssuer = false,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
opt.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken))
{
if (path.StartsWithSegments("/chat")
|| path.StartsWithSegments("/dialog"))
{
context.Token = accessToken;
}
}
return Task.CompletedTask;
}
};
});
配置无效
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<ChatHub>("/chat", opt => { opt.Transports = HttpTransportType.WebSockets; });
endpoints.MapHub<DialogHub>("/dialog", opt => { opt.Transports = HttpTransportType.WebSockets; });
});
【问题讨论】:
-
您是否在 azure 中使用您的应用程序?如果不是,那么我认为这是不可能的,因为您需要在那些容器前面提供一个服务来适当地重定向消息
-
不,我不使用 azure。你认为这是问题的原因吗?我应该使用 Azure 的哪个服务?我可以只使用该服务并将我的应用程序保存在另一台服务器上,还是应该在 azure 中发布我的所有 API 服务?
-
我想是的,遗憾的是我无法进一步帮助您,因为在我了解到不可能在 azure 之外大量使用 signalR 之后,我对它失去了兴趣。您可能希望将 azure 标签添加到您的问题中。祝你好运;)
-
非常感谢您花时间回答我:)
标签: .net-core signalr docker-swarm