ASP.NET SignalR - 无法将存储在数据库中的消息列表发送给用户

Posted

技术标签:

【中文标题】ASP.NET SignalR - 无法将存储在数据库中的消息列表发送给用户【英文标题】:ASP.NET SignalR - Cannot send list of messages stored in database to user 【发布时间】:2018-03-25 11:59:12 【问题描述】:

我的 SignalR ChatHub 需要授权才能向其他用户发送消息。如果一个用户发送了一条消息,但如果接收方没有连接到 Hub,那么它将被保存在数据库中。现在该部分工作正常,我可以将邮件保存到收件人收件箱。

身份模型:

public class ApplicationUser : IdentityUser
 
    public virtual ICollection<MyMessage> Inbox  get; set; 
    //......

这是在未连接到 Hub 时保存消息的方式:

var recipient = UserManager.FindById(id);
if (recipient != null)

    if (recipient.Message_Inbox == null)
    
        recipient.Message_Inbox = new List<MyMessage>();
    
    recipient.Inbox.Add(new MyMessage()  Id = Guid.NewGuid().ToString(), SentBy = userId, Message = message);
    UserManager.Update(recipient); 

然后 OnConnected,查询数据库并向用户发送消息列表。但这不起作用。如果我创建一个示例消息列表并发送它,我的客户端会收到它,但如果我从服务器发送它则不会。

List<MyMessage> inbox = user.Inbox.ToList();
Clients.Client(Context.ConnectionId).sendInbox(inbox); //doesn't work

//but if I do this
List<MyMessage> list = new List<MyMessage>()
                
                    new MyMessage()  SentBy = "asdsadd", Message = "First", Id = "sds" ,
                    new MyMessage()  SentBy = "asdsadd1", Message = "Second", Id = "sds2" ,
                ;
 Clients.Client(Context.ConnectionId).sendInbox(list); // IT WORKS

这就是我获取 UserManager 的方式:

private ApplicationUserManager _userManager;//updated
public ApplicationUserManager UserManager
    
        get
        
            return _userManager ?? Context.Request.GetHttpContext().GetOwinContext().GetUserManager<ApplicationUserManager>();
        
        private set
        
            _userManager = value;
        
    

【问题讨论】:

_userManager 什么时候设置?列表是空的还是它不起作用?消息是否正确存储在某个地方?只是没有检索到? 更新了关于用户管理器的代码。该列表不为空。我在检索收件箱时设置了一个断点,我可以看到存储在列表中的所有值。消息保存有效,只是无法检索并将它们发送给客户端。 @SamiKuhmonen 【参考方案1】:

您需要将查询消息的中心方法更改为异步操作。 这是source。

【讨论】:

【参考方案2】:

使用Json序列化解决问题。

 string jsonObject = JsonConvert.SerializeObject(inbox);

不知道为什么我的测试列表不需要序列化,但是哦。它有效。

【讨论】:

以上是关于ASP.NET SignalR - 无法将存储在数据库中的消息列表发送给用户的主要内容,如果未能解决你的问题,请参考以下文章

SignalR 授权无法在带有 Identity Server 的 asp.net core angular SPA 中开箱即用

《ASP.NET SignalR系列》第一课 认识SignalR

如何从我的 ASP.NET Core 5 Web 应用程序中的 SignalR 操作中解决错误“无法访问已释放的上下文实例”?

SignalR、ASP.NET 5 和 CORS

[Asp.net 开发系列之SignalR篇]专题二:使用SignalR实现酷炫端对端聊天功能

《ASP.NET SignalR系列》第二课 SignalR的使用说明