У меня есть связь 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);
Есть проблемы?