Веб-узел Blazor сигнализирует об отправке конкретному пользователю проблемы с контекстом

#c# #asp.net-core #signalr #blazor #blazor-webassembly

Вопрос:

Я пытаюсь отправить сообщение конкретному клиенту в своем проекте веб-сборки Blazor.

Startup.cs

 services.AddSignalR();
....

app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
                endpoints.MapControllers();
                endpoints.MapHub<OrderHub>("/orderhub");
                endpoints.MapFallbackToFile("index.html");
            });
 

Код клиента

 protected override async Task OnInitializedAsync()
 {
    hubConnection = new HubConnectionBuilder()
           .WithUrl(NavigationManager.ToAbsoluteUri("/orderhub"))
           .Build();
            await hubConnection.StartAsync();
            await hubConnection.SendAsync("SendItemsCountMessage", orderpositions.Sum(x => x.amount));
 }
 

Хаб.cs

 public class OrderHub : Hub
{
    public async Task SendItemsCountMessage(int ItemsCount)
    {
        await Clients.All.SendAsync("ReceiveItemMessage", ItemsCount);
    }
}
 

Теперь я хочу изменить его, чтобы иметь возможность отправлять конкретному пользователю:

 public async Task SendItemsCountMessage(int ItemsCount)
{
            string conID = Context.ConnectionId;
            await Clients.User(conID).SendAsync("ReceiveItemMessage", ItemsCount);
}
 

Но контекст равен нулю, с пользователем или без, с зарегистрированным пользователем или неавторизованным, все это, похоже, не имеет значения. Есть идеи , как получить правильный Context.ConnectionId , лучший без входа в систему пользователя?

Может быть, мне нужно что-то подобное?

Возможно ли, что я должен использовать аутентификацию токена на предъявителя в своем приложении, а затем отправить сгенерированный токен туда Hub.cs , где var context = HttpContext.Request.Query[Token] я могу его получить Context ?

Комментарии:

1. Вы не включили в свой вопрос код, в котором вы объявляете и инициализируете Context .

2. Ну, все примеры, которые я видел в Интернете, связаны с внедрением зависимостей, и это скрывает вовлеченные объекты. Возможно, вы захотите создать небольшой чат-клиент с SignalR, уберите его на некоторое время из домена Blazor, пока не поймете, как это работает.

3. Это должно быть примером в документации Microsoft о том, как легко реализовать прямой обмен сообщениями. Я имею в виду, что их пример-это чертов чат, который рассылается всем, они должны распространить его на тот, который рассылается конкретному пользователю

4. Вы, ребята, не думали перенести это в чат? Сохраняет раздел комментариев в чистоте. Во всех ASP.NET Технологии (для текущих версий dotnet) Context будут созданы и внедрены контейнером CDI.

5. @ConnorLow: Система «перейти в чат» на Stack Exchange не работает, и работает уже некоторое время. Даже сейчас, когда я пишу этот комментарий, мне не дали возможности «перенести этот разговор в чат».