SignalR:在收到调用结果之前连接已断开

本文关键字:连接 断开 结果 调用 SignalR | 更新日期: 2023-09-27 17:55:04

在我的一个wcf服务(无状态)中,我想通过SignalR发送消息。因为服务是无状态的,而集线器在另一台机器上,所以我连接到SignalR,发送消息,然后断开连接。

proxy.Connect().Wait();
proxy.SendMessageToUsers(receiverUserNames, message).Wait();
proxy.Disconnect();

不时出现invalidoperationexception(在收到调用结果之前连接已断开)。

我从这篇文章(c# SignalR异常-连接在收到调用结果之前开始重新连接)中理解。等待不是一个好主意。但是我想我需要等待Connect和SendMessage完成,然后再断开连接。

那么,我还能做什么?

最诚挚的问候,Stefan

SignalR:在收到调用结果之前连接已断开

这个错误是有意义的,因为代码是同步的。因此,Disconnect可以在收到调用结果之前被调用。

呢……

Task.Factory.StartNew(async() => {
    await proxy.Connect();
    await proxy.SendMessageToUsers(receiverUserNames, message);
    await proxy.Disconnect();
});

这样您就可以确保在消息发送之前不会调用proxy.Disconnect()

这可能是因为您返回了一个实体框架对象。

当你这样做时,确保首先从上下文中Detatch它们,如:

public List<Models.EF.Inventarisatie.ScannerAanmelding> GetRecentSessions()
{
    using (var db = new Models.EF.Inventarisatie.inventarisatieEntities())
    {
        var result = db.ScannerAanmelding
            .Where(sa => sa.FK_Inventarisatie_ID == MvcApplication.Status.Record.PK_Inventarisatie_ID)
            .GroupBy(sa => sa.FK_Scanner_ID)
            .Select(sa => sa.OrderByDescending(x => x.Moment).FirstOrDefault())
            .ToList();
        // make sure to disconnect entities before returning the results, otherwise, it will throw a 'Connection was disconnected before invocation result was received' error.
        result.ForEach((sa) => db.Entry(sa).State = System.Data.Entity.EntityState.Detached);
        return result;
    }
}