Мой сценарий - у меня есть API, который реализует SignalR и IdentityServer4.Мой клиент - Vuejs SPA, обслуживаемый из приложения .net-core.После того, как у клиента vue есть access_token
, я инициирую соединение сигнализатора и сохраняю его в vuex
store.
Вот как я настраиваю свое соединение:
var connection = new signalR.HubConnectionBuilder()
.withUrl(http://example.com + '/notifyHub',
{
accessTokenFactory: () => { return token }
}
).build();
connection.start()
.then(() => {
window.console.log("signalR connection successful")
})
.catch(function (err) {
return window.console.error(err.toString());
});
Это мой APIнастройка SignalR с аутентификацией IS4
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = $"{_config["Server"]}";
options.RequireHttpsMetadata = _env.IsProduction() ? true : false;
options.ApiName = "api";
options.ApiSecret = "secret";
options.TokenRetriever = new Func<HttpRequest, string>(req =>
{
var fromHeader = TokenRetrieval.FromAuthorizationHeader();
var fromQuery = TokenRetrieval.FromQueryString();
return fromHeader(req) ?? fromQuery(req);
});
});
services.AddSignalR();
//sub claim is used from the token for individual users
services.AddSingleton<IUserIdProvider, UserProvider>();
и приложением
app.UseWebSockets();
app.UseAuthentication();
app.UseSignalR(routes =>
{
routes.MapHub<NotificationHub>("/notifyHub");
});
Клиент всегда устанавливает успешное соединение, и все живые уведомления работают, как и ожидалось.
Сейчасчтобы проверить работоспособность, я запускаю 2 клиента, 1 из Chrome и 1 из Firefox, в то время как два клиента подключены, все работает.
Как только вы попытаетесь подключить третий клиент (используя Chrome Incognito или IE Edge), соединение с сигнализатором будет успешным, но API зависнет для всех 3 клиентов.Если я обновлю один из клиентов, остальные 2 возобновят работу, если один из клиентов закроется, два других возобновят работу нормально.
В логах клиента или стороны API нет ценной информации, указывающей на это.к тому, что происходит.
Мой вопрос заключается в том, что может вызвать эту проблему и как мне ее расследовать?
Это проблема запуска нескольких клиентов с одного хоста, и происходит ли это вбудет ли блокироваться только один хост, запускающий клиентов или все хосты?
EDIT
Я перешел с локального хоста на локальный IP 192. . . * Чтобы попытаться подключиться из моего мобильного браузера, посмотрите, если это что-то изменит, произойдет то же самое, после того, как 3-й клиент подключится, API зависает. Если я не подключаюсь к хабу signalR, пропустив connection.start()
, я могу запустить столько клиентовкак я могу без поломок.
В настоящее время я размещаюсь на локальном IIS, а не на IIS express.