C# 如何在ASP.NET MVC 4应用程序中实现向收件人显示电子邮件通知的信号器
我有一个要求,显示电子邮件通知收件人使用信号。我正在使用MVC4开发我的应用程序。我是一个初学者,对信号员没有太多的知识。到目前为止,我已经按照下面的帖子,并试图准备一个样本,可以满足我的要求 上面一个是使用knockout.js,另一个不是。我两个都遵守了,不能满足我的要求 以下是信号器集线器类的代码:C# 如何在ASP.NET MVC 4应用程序中实现向收件人显示电子邮件通知的信号器,c#,asp.net-mvc,asp.net-mvc-4,signalr,C#,Asp.net Mvc,Asp.net Mvc 4,Signalr,我有一个要求,显示电子邮件通知收件人使用信号。我正在使用MVC4开发我的应用程序。我是一个初学者,对信号员没有太多的知识。到目前为止,我已经按照下面的帖子,并试图准备一个样本,可以满足我的要求 上面一个是使用knockout.js,另一个不是。我两个都遵守了,不能满足我的要求 以下是信号器集线器类的代码: public void SendEmail(Email email) { email.SentBy = WebSecurity.CurrentU
public void SendEmail(Email email)
{
email.SentBy = WebSecurity.CurrentUserId;
using (NotifyEntities db = new NotifyEntities())
{
UsersContext uc = new UsersContext();
db.Emails.Add(email);
db.SaveChanges();
var ret = new
{
Message = post.Message,
SentBy = post.SentBy,
};
Clients.Caller.sendEmail(ret);
#region add to table which contain user id and email_post_id (I am sending the email to 2 users/receivers)
UsersMessage msgRel = new UsersMessage();
msgRel.EID = email.Id;
msgRel.UID = 2; //user 1
db.UsersMessages.Add(msgRel);
db.SaveChanges();
msgRel = new UsersMessage();
msgRel.EID = email.Id;
msgRel.UID = 5;//user 2
db.UsersMessages.Add(msgRel);
db.SaveChanges();
#endregion
var unread = (from ure in db.Emails.ToList()
join um in db.UsersMessages on ure.Id equals um.EID
where um.UID == WebSecurity.CurrentUserId && um.IsReaded == false
orderby ure.Id descending
select new
{
Message = pst.Message,
SentBy = pst.SentBy,
}).ToArray();
Clients.All.loadUnreadPosts(unread); //this returns unread emails of currently logged in user
Clients.All.loadPosts(ret); // this returns all emails of currently logged in user
}
}
当我不使用knockout.js时,我就不能显示即时通知,它只会出现在页面刷新上,并显示给所有用户,而不是接收者
当我使用knockout.js时,通知会立即显示出来,但存在与向所有用户显示消息/通知相同的问题
请帮我做这个。我不知道如何为特定电子邮件的收件人创建组。为了只向特定用户发送通知,您需要使用SignalR的组功能。以下是一些有关如何设置的文档: 您可能会在用户登录或类似操作时为每个用户创建一个组
public async Task UserOnline(string emailAddress)
{
await Groups.Add(this.Context.ConnectionId, emailAddress);
}
然后,您可能希望在signersendmail
hub类中使用类似的内容
Clients.Group(emailAddress).loadUnreadPosts(unread);
Clients.Group(emailAddress).loadPosts(ret);
作为补充说明,我建议在我提供的链接中浏览文档。并没有理由需要使用击倒来让信号器正常工作
编辑
我已经得到了类似于上述工作之前(虽然我已经失去了代码);但我刚刚发现了这一点,它实际上可能提供了一个更优雅的解决方案。谢谢您的回复,您能在这里分享一下Context.ConnectionId的工作原理吗。事实上,我试着使用这个,但在页面重新加载或刷新时不一样。我应该如何使用它?有关上下文属性的信息。我还将代码更新为您可能访问@drneel上下文的方式-有什么建议吗