Angular подключиться к ASP. NET API SignalR Hub возвращает 404 Not Found (Identity Server 3) - PullRequest
0 голосов
/ 08 мая 2020

У меня есть связь SignalR между Angular 8 и ASP. NET Веб-API, NET Framework 4.7.2, который работал правильно. Однако я не тестировал это в течение нескольких месяцев, и теперь, когда я попытался, я получил такой результат в консоли браузера:

http://localhost: 55454 / signalr /gotiate ? .... net :: ERR_ABORTED 404 (Not Found)

Единственное существенное изменение за эти несколько месяцев состоит в том, что теперь мой API использует Identity Server 3, но я не думаю, что это проблема.

Однако вот мой код в StartUp перед реализацией Identity Server:

            app.Map("/signalr", map =>
        {
            map.UseCors(CorsOptions.AllowAll);
            var hubConfiguration = new HubConfiguration
            {
                EnableJSONP = true,
                EnableDetailedErrors = true,

            };

            map.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
            {
                Provider = new QueryStringOAuthBearerProvider(),
                AccessTokenProvider = new AuthenticationTokenProvider()
                {
                    OnCreate = new Action<AuthenticationTokenCreateContext>(c =>
                    {
                        c.SetToken(c.SerializeTicket());
                    }),
                    OnReceive = new Action<AuthenticationTokenReceiveContext>(c =>
                    {
                        c.DeserializeTicket(c.Token);
                        c.OwinContext.Environment["Properties"] = c.Ticket.Properties;
                    })
                },
            });

            map.RunSignalR(hubConfiguration);
        });

И QueryStringOAuthBearerProvider (поскольку я отправил токен в строке запроса):

        private class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider
    {
        public override Task RequestToken(OAuthRequestTokenContext context)
        {
            if (context != null)
            {
                var value = context.Request.Query.Get("token");

                if (!string.IsNullOrEmpty(value))
                {
                    context.Token = value;
                }
            }

            return Task.FromResult<object>(null);
        }
    }

Я пробовал использовать новый фрагмент кода, но результат все тот же:

            app.UseIdentityServerBearerTokenAuthentication(new 
              IdentityServerBearerTokenAuthenticationOptions
              {
                Authority = identityAuthority,
              });


       app.Map("/signalr", map =>
        {
            map.UseCors(CorsOptions.AllowAll);
            var hubConfiguration = new HubConfiguration
            {
                EnableJSONP = true,
                EnableDetailedErrors = true,

            };

            map.UseIdentityServerBearerTokenAuthentication(new IdentityServer3.AccessTokenValidation.IdentityServerBearerTokenAuthenticationOptions
            {
                Authority = identityAuthority,
                TokenProvider = new QueryStringOAuthBearerProvider(),
            });
            map.RunSignalR(hubConfiguration);
        });
    }

Я думаю, что это не главная проблема, поскольку в Debug он никогда не достигает точки останова в классе QueryStringOAuthBearerProvider. И это должно быть.

Моя версия SignalR в API - 2.4.1, поэтому она находится в Angular ("signalr": "^ 2.4.1",) Я также использую "ng2- signalr ":" ^ 8.0.2 "nuget для сохранения кода JS, написанного вручную.

Вот пример из Typescript (который раньше работал):

    startConnection(hubConnection: SignalR): Promise<ISignalRConnection> {
    console.log('Connecting...');

    if (this.authService && this.authService.token) {
        return hubConnection.connect({ jsonp: true, hubName: 'ChatHub', url: this.config.API_BASE_URL, qs: { token: this.authService.token } });
    }
}

Возможно - это конфигурация StartUp, но, возможно, не потому, что похоже, что он вообще не находит такой адрес (localhost / signalr ...) Политика CORS для этого angular проекта установлена, все другие обычные вызовы API работают без проблем.

Я не могу понять, почему я получил эту ошибку 404 из-за некоторых функций, которые не так долго работали как чудо go.

EDIT:

В в базе данных я сохраняю адрес localhost приложения Angular и дал ему полный доступ CORS, но достаточно ли этого для SignalR? Да, запрос поступает с того же локального хоста, но не вызывает http://localhost: 55454 / api , а http://localhost: 55454 / signalr , так что нужно ли делать что-то дополнительное с CORS? Думаю, может и должно, иначе зачем была добавлена ​​эта строка СТАРОГО Кода:

       app.Map("/signalr", map =>
    {
        map.UseCors(CorsOptions.AllowAll);

Есть проблемы?

1 Ответ

0 голосов
/ 15 мая 2020

Я решил это. Первоначальный ответ был НЕ очень подробным. 404 и все. Но когда я углубился, я обнаружил, что подробный ответ:

Ошибка HTTP 404.15 - не найдено Модуль фильтрации запросов настроен на отклонение запроса, в котором строка запроса слишком длинная.

И это действительно так. Итак, теперь мне нужно решить, безопасно ли увеличивать длину URL и строки запроса, а если нет ... как решить эту проблему.

...