SignalR 与 Blazor,无法从另一个页面刷新组件

问题描述 投票:0回答:1

我被这个问题困扰了好几天,并且一直在阅读 https://learn.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-8.0 上的实现,当然它无法帮助我。

我的问题是在使用 Clients.Caller 或 Clients.Client 时无法从下面的代码更新组件。我能够使用 Clients.All 更新组件,但它为我的访问者更新了所有连接的客户端,这是我不想要的。

我只想更新同一访客/用户的状态,但这对我不起作用。

如果有人知道如何解决这个问题,请告诉我。谢谢你。


using DocZ.Data;
using DocZ.Helpers;
using DocZ.Models.Security;
using DocZ.Services.Data;
using Microsoft.AspNetCore.SignalR;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;

namespace BlazorWebAssemblySignalRApp.Server.Hubs
{
    public class BannerMyUsageHub : Hub
    {
        private readonly ILogger<BannerMyUsageHub> _logger;
        private readonly IDatabaseService _databaseService;
        public BannerMyUsageHub(IDbContextFactory<ApplicationDbContext> dbContextFactory, IDatabaseService databaseService, ILogger<BannerMyUsageHub> logger)
        {
            _logger = logger;
            _databaseService = databaseService;
        }
        /// <summary>
        /// Location to receive SignalR request from client app or within the backend
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        public async Task MyUsageMessageTouserName(string userName)
        {
            if (String.IsNullOrEmpty(userName) == false)
            {
                //Get total record from database
                int totalMyUsage = await _databaseService.BannerMyUsageCountPending(userName);
                string messageToViewer = "";
                if (totalMyUsage > 0)
                {
                    messageToViewer = $"You have {totalMyUsage} open chart{UtilityMethods.Pluralization(totalMyUsage)}.";
                }

                //Blazor didn't refresh the header.
                await Clients.Caller.SendAsync("ReceiveMessage", messageToViewer);
                //Blazor couldn't load other browser tab from the say user.
                //await Clients.Client(Context.ConnectionId).SendAsync("ReceiveMessage", messageToViewer);

                //Can't use this becuase it would update all visitors.
                //await Clients.All.SendAsync("ReceiveMessage", messageToViewer);
                //Didn't work at all... await Clients.User(userName).SendAsync("ReceiveMessage", messageToViewer);

            }
        }
    }
}



blazor signalr asp.net-core-signalr
1个回答
0
投票

尝试使用

JsonConvert.SerializeObject
来转换数据。

await Clients.Caller.SendAsync("ReceiveMessage", JsonConvert.SerializeObject(messageToViewer));
//await Clients.Client(Context.ConnectionId).SendAsync("ReceiveMessage", JsonConvert.SerializeObject(messageToViewer));

然后您就可以收到如下数据。

var data = JsonConvert.DeserializeObject(receive_messageToViewer);
© www.soinside.com 2019 - 2024. All rights reserved.