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

标签 c# asp.net-core signalr asp.net-core-signalr

我在一个新的、干净的 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/

相关文章:

visual-studio-2015 - 如何从.NET Core中的appsettings.json配置嵌套对象?

c# - 在 Asp.net Core 的 startup.cs 中获取用户名

signalr - SignalR超时属性

c# - SignalR 2 StartAsync 永远不会返回

c# - SignalR 1.0rc2 版本中未找到 Signalr IConnectionIdGenerator

c# - 如何设计一个日历控件

c# - 使用 Unity/ReSharper 隐式不起作用

c# - tfs如何查看本地文件是否为最新版本?

c# - 安装在 Visual Studio 中创建的 Windows 服务

c# - 如何从 .Net Core 2.1 中的静态函数访问我的配置?