API, использующий SignalR с IdentityServer4, зависает на 3+ соединениях - PullRequest
0 голосов
/ 09 сентября 2018

Мой сценарий - у меня есть 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.

...