My SignalR ChatHub需要授权才能向其他用户发送消息。如果用户发送消息,但如果收件人未连接到集线器,则它将保存在数据库中。现在该部分工作正常,我可以将邮件保存到收件人收件箱。
IdentityModel:
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;
}
}
答案 0 :(得分:0)
您需要将查询消息的hub方法更改为异步操作。 这是source。
答案 1 :(得分:0)
通过使用Json序列化来解决问题。
string jsonObject = JsonConvert.SerializeObject(inbox);
不确定为什么我的测试列表不需要序列化,但是哦。它有效。