SignalR hub 客户端对象被释放

SignalR hub Clients object disposed

我有以下带有内存中连接管理的 SignalR Hub。

[Authorize]
public class ChatHub : Hub
{
    private static readonly ConnectionMapping<string> _connections =
        new ConnectionMapping<string>();

    private readonly IMessageRepository _messagesRepository;

    public ChatHub(IMessageRepository messageRepository)
    {
        _messagesRepository = messagesRepository;
    }

    public override async Task OnConnectedAsync()
    {
        var name = Context.User.Identity.Name;
        _connections.Add(name, Context.ConnectionId);

        //await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
        await base.OnConnectedAsync();
    }

    public override async Task OnDisconnectedAsync(Exception exception)
    {
        var name = Context.User.Identity.Name;
        _connections.Remove(name, Context.ConnectionId);

        //await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
        await base.OnDisconnectedAsync(exception);
    }

    public async void SendMessage(ChatMessage chatMessage)
    {
        var name = Context.User.Identity.Name;

        var chatHistoryMessage = await _messagesRepository.SaveMessageAsync(chatMessage);

        var availableConnections = _connections.GetConnections(name);

        if (availableConnections.Any())
        {
            foreach (var connectionId in availableConnections)
            {
                Clients.Client(connectionId).SendAsync("ReceiveMessage", chatHistoryMessage);
            }
        }
        else
        {
        }
    }
}

然而,当执行下面一行代码时

Clients.Client(connectionId).SendAsync("ReceiveMessage", 1);

Clients 上引发对象处置错误。

当我添加存储库行时开始出现此问题:

var chatHistoryMessage = await _messagesRepository.SaveMessageAsync(chatMessage);

SaveMessageAsync 方法:

public async Task<ChatHistory> SaveMessageAsync (ChatMessage chatMessage)
        {
            using (var conn = new SqlConnection(ConnProvider.ConnectionString))
            {
                await conn.OpenAsync();
                return (await conn.QueryAsync<ChatHistory>("[mob].[spSaveChatMessage]",
                    new
                    {
                       ..
                    },
                    commandType: CommandType.StoredProcedure)).FirstOrDefault();
            }
        }

为什么我的 Clients 对象会被处置?如果我等待调试器,这个问题永远不会发生。

看起来 SendMessage 方法应该是 async Task 而不是 async void

问题可能是由 SignalR 框架运行 async voids 的方式引起的。

请参阅 this article 了解详细信息。

Async methods returning void don’t provide an easy way to notify the calling code that they’ve completed.