Ошибка подключения WebSocket в ASP.NET Core SignalR с BlazorC#

Место общения программистов C#
Ответить
Anonymous
 Ошибка подключения WebSocket в ASP.NET Core SignalR с Blazor

Сообщение Anonymous »

Я реализую систему уведомлений в своем API ASP.NET Core, используя SignalR и клиент Blazor. Я настроил NotificationHub и собственный поставщик идентификаторов пользователей для управления подключениями пользователей. Однако каждый раз, когда я запускаю свое приложение, я сталкиваюсь со следующей ошибкой:

Код: Выделить всё

WebSocket connection to 'wss://localhost:63225/notificationHub?id=LDfet**&access_token=ey**' failed: 
Фрагменты кода:
NotificationHub:

Код: Выделить всё

[Authorize]
public class NotificationHub : Hub
{
public override Task OnConnectedAsync()
{
Debug.WriteLine(Context.UserIdentifier);
return base.OnConnectedAsync();
}
}
CustomUserIdProvider:

Код: Выделить всё

public class CustomUserIdProvider : IUserIdProvider
{
public string? GetUserId(HubConnectionContext connection)
{
return connection.User?.Identity?.Name;
}
}
Добавление запроса с уведомлением:

Код: Выделить всё

    public async Task AddEvolutionDemand(EvolutionDto evolutionToAddDto)
{
var EvolutionDemand = new Evolution();
try
{
EvolutionDemand = new()
{
Service_ID = evolutionToAddDto.Service_ID,
User_ID = evolutionToAddDto.User_ID,
User_Name = evolutionToAddDto.User_Name,
Doc_ID = evolutionToAddDto.Doc_ID,
Demande_Creation_Date = evolutionToAddDto.Demande_Creation_Date,
Demand_Type = evolutionToAddDto.Demand_Type,
Demand_Title = evolutionToAddDto.Demand_Title,
Demande_Comment = evolutionToAddDto.Demande_Comment,
STATUS = evolutionToAddDto.STATUS,
Demand_Assigned_ID = evolutionToAddDto.Demand_Assigned_ID,
Demand_update_date = evolutionToAddDto.Demand_update_date,
Demand_Update_Comment = evolutionToAddDto.Demand_Update_Comment,
};
await _kmDbContext.Evolution.AddAsync(EvolutionDemand);
await _kmDbContext.SaveChangesAsync();
var UserToNotify = await UserRepository.GetUser(evolutionToAddDto.Demand_Assigned_ID);
await HubConntextion.Clients.User(UserToNotify.User_Login).SendAsync("notification", $"{DateTime.Now}");
}
catch (Exception ex)
{
_logger.Error(ex, ErrorMessage, ex.Message);
}
return EvolutionDemand.Demand_ID;
}
Клиент Blazor:

Код: Выделить всё

@code {
private HubConnection? hubConnection;
public int pendingDemandCount { get; set; } = 0;
List notifications = [];
[Inject] IAccessTokenProvider AccessTokenProvider { get; set; } = default!;

protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
var authState = await AuthenticationStateTask;

if (authState.User.Identity != null && authState.User.Identity.IsAuthenticated)
{
await connectToNotificationHub();
await RefreshPendingDemands();
}
}

public async Task connectToNotificationHub()
{
try
{
if (hubConnection is not null)
return;
var notificationUrl = "notificationHub";
hubConnection = new HubConnectionBuilder()
.WithUrl($"https://localhost:63225/{notificationUrl}", options =>
{
options.AccessTokenProvider = () => GetAccessTokenAsync();
})
.Build();

hubConnection.On("notification", async (message) =>
{
notifications.Add(message);
await RefreshPendingDemands();
await InvokeAsync(StateHasChanged);
});

await hubConnection.StartAsync();
}
catch (Exception ex)
{
Console.WriteLine($"Error connecting to SignalR hub: {ex.Message}");
Console.WriteLine($"Stack trace: {ex.StackTrace}");
}
}

private async Task GetAccessTokenAsync()
{
var tokenResult = await AccessTokenProvider.RequestAccessToken();
if (tokenResult != null &&  tokenResult.TryGetToken(out AccessToken accessToken))
{
return accessToken.Value;
}
return null;
}

private async Task RefreshPendingDemands()
{
var pendingDemands = await DocumentService.GetPendingDemandsForUser();
pendingDemandCount = pendingDemands?.Count ?? 0;
}

public async ValueTask DisposeAsync()
{
if (hubConnection is not null)
{
await hubConnection.DisposeAsync();
hubConnection = null;
}
}
}
Что может быть причиной сбоя подключения WebSocket и как устранить эту проблему? Я проверил, что access_token сгенерирован правильно и что пользователь аутентифицирован. Будем очень признательны за любые рекомендации по решению этой проблемы!
Я реализовал метод OnConnectedAsync в NotificationHub, чтобы регистрировать идентификатор пользователя и проверять, правильно ли устанавливается соединение.
Я гарантировал, что что токен доступа генерируется правильно с помощью IAccessTokenProvider в моем клиенте Blazor. Я регистрирую любые проблемы с процессом получения токена.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ith-blazor
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»