gpt4 book ai didi

c# - 从回调调用时,ASP.NET Core SignalR 客户端对象处理异常

转载 作者:行者123 更新时间:2023-12-02 01:20:36 26 4
gpt4 key购买 nike

我在一个新的、干净的 ASP.NET Core 2.1 Web 应用程序中实现了以下集线器。我刚刚更新到最新版本的 ASP.NET Core 2.1 和最新版本的 Visual Studio 2017。

该类有效,当从调试器启动时,一个客户端会连接。我可以使用调试器看到这一点,并且,我可以在客户端中看到这一点,因为我记录了连接后发送的“用户对象”。客户端保持连接。

在第二步中,我将 IPbxConnection 注入(inject)到集线器中,它也能正常工作(我可以使用调试器看到一个有效的对象)。 IPbxConnection 实现将在 5 秒后调用 OnUserUpdated 处理程序(我现在只是在 IPbxConnection 实现中使用计时器回调来进行测试)。这总是会导致在 Clients 对象上抛出对象已处置异常。如何在此回调中向所有客户端发送通知?看来 Clients 对象并不保留其状态,并且仅在消息处理程序期间有效...但是,我想始终将信息推送到客户端。

public class PresenceHub : Hub
{
//Members
private IPbxConnection _connection;

/// <summary>
/// Constructor, pbx connection must be provided by dependency injection
/// </summary>
public PresenceHub(IPbxConnection connection)
{
_connection = connection;
_connection.OnUserUpdated((e) =>
{
Clients.All.SendAsync("UpdateUser", "updateuserobject");
});
_connection.Connect();
}

/// <summary>
/// Called whenever a user is connected to the hub. We will send him all the user information
/// </summary>
public override async Task OnConnectedAsync()
{
await base.OnConnectedAsync();
await Clients.Caller.SendAsync("AddUser", "userobject");
}
}

最佳答案

如 Github 上本期所述 https://github.com/aspnet/SignalR/issues/2424集线器的设计生命周期很短,并且在每次调用后都会被丢弃。

我发现访问 Hub 上当前请求范围之外的客户端的唯一方法是将 HubContext 注入(inject)到一个单独的类中。

在您的情况下,向所有客户端的广播将如下所示

public class HubEventEmitter
{
private IHubContext<PresenceHub> _hubContext;

public HubEventEmitter(IPbxConnection connection, IHubContext<PresenceHub> hubContext)
{
_hubContext = hubContext;
_connection.OnUserUpdated((e) =>
{
_hubContext.Clients.All.SendAsync("UpdateUser", "updateuserobject");
});
}
}

如果您只想通知特定的客户端,您必须从上下文中收集connectionId并像这样使用它

_hubContext.Clients.Client(connectionId).SendAsync("UpdateUser", "updateuserobject");

关于c# - 从回调调用时,ASP.NET Core SignalR 客户端对象处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50707223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com