Привет, ребята. У меня возникли некоторые проблемы с SignalR на NET Core 2.2 и Angular, когда angular пытается установить соединение, проходящее через токен, выдает эту ошибку:
Сам код очень прост, я никогда не работал с SignalR, поэтому это мой первый раз. Я много искал на inte rnet, форумах и т. Д. c, но на самом деле ничего не помогло мне это исправить.
public class WebSocketsMiddleware
{
private readonly RequestDelegate _next;
public WebSocketsMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
var request = httpContext.Request;
// web sockets cannot pass headers so we must take the access token from query param and
// add it to the header before authentication middleware runs
if (request.Path.StartsWithSegments("/hub/signalr/test/notification", StringComparison.OrdinalIgnoreCase) &&
request.Query.TryGetValue("access_token", out var accessToken))
{
request.Headers.Add("Authorization", $"Bearer {accessToken}");
}
await _next(httpContext);
}
}
Я создал промежуточное ПО для получения токена строка запроса от сигнализатора, но она отправляет мне ноль, токен даже не появляется нигде. Я выполняю некоторые шаги, которые прочитал, и добавил фильтр авторизации для класса, потому что для методов внутри класса-концентратора мне нужны утверждения и информация о пользователе электронной почты и кода.
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class NotificationHub : Hub
{
[HubMethodName("MessageToAll")]
public async Task SendMessageToAll(string mensagem)
{
try
{
string connectionid = Context.ConnectionId;
string name = Context.User.Identity.Name;
var IdUser = Extentions.Extentions.GetClaimValue(Context.User.Claims, "CodUser");
var EmailUser = Extentions.Extentions.GetClaimValue(Context.User.Claims, "Email");
await Clients.All.SendAsync("SendToAll", mensagem);
}
catch (Exception ex)
{
throw ex;
}
}
}
и это мой класс запуска
Кроме того, я создал простое приложение angular только для тестирования уведомления в SignalR с токеном. Большинство форумов и исследований, которые я видел, говорят о websocket и токене, которые должны передаваться строкой запроса, а не методом http, потому что браузеры не поддерживают его. Тем не менее, я получаю проблемы и получаю токен серверную часть с Netcore.
import { Component, OnInit } from '@angular/core';
import { HubConnectionBuilder } from '@microsoft/signalr';
import { HubConnection } from '@aspnet/signalr';
import * as signalR from '@aspnet/signalr';
import { Message } from 'primeng/api';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
title = 'client';
private _messagingHubConnection: HubConnection | undefined;
private _hubConnection: HubConnection;
msgs: Message[] = [];
constructor()
{
this.buildconnection();
}
ngOnInit(): void {
this._messagingHubConnection
.start()
.then(() =>
{
this._messagingHubConnection.send("MessageToAll","teste rafael");
console.log("mensagem enviada");
}).catch(err => console.log(err));
this._messagingHubConnection.on("SendToAll",(mensagem: string) => {
console.log('Mensagem recebida: ' + mensagem);
});
}
public buildconnection = () =>
{
this._messagingHubConnection = new signalR.HubConnectionBuilder()
.configureLogging(signalR.LogLevel.Information)
.withUrl("http://localhost:63541/hub/signalr/test/notification",
{
transport: signalR.HttpTransportType.WebSockets,
accessTokenFactory: () => "jwt_token"
}).build();
}
public startconnection = () =>
{
this._messagingHubConnection
.start()
.then(() =>
{
console.log('Connection started! State: ' + this._messagingHubConnection.state);
this._messagingHubConnection.send("MensagemCustomizada", 1123, "teste rafael");
}).catch(err => console.log("Error while establishing connection :( " + err));
}
}