我被这个问题困扰了好几天,并且一直在阅读 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);
}
}
}
}
尝试使用
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);