如何实现SignalR显示电子邮件通知收件人在ASP.NET MVC 4应用程序

本文关键字:ASP 收件人 NET MVC 应用程序 通知 电子邮件 何实现 实现 显示 SignalR | 更新日期: 2023-09-27 18:19:22

我需要使用SignalR向接收者显示电子邮件通知。我正在使用MVC 4开发我的应用程序。我是一个初学者,对SignalR了解不多。到目前为止,我已经按照下面的帖子,并试图准备一个样本,可以满足我的要求。

http://www.codeproject.com/Articles/732190/Real-Time-Web-Solution-for-Chat-by-MVC-SignalR-H

http://techbrij.com/realtime-post-comment-notifications-signalr-knockout

上面一个是使用knockout.js,另一个不是。我都照做了,但还是不能满足我的要求。

下面是SignalR Hub类的代码:

  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显示电子邮件通知收件人在ASP.NET MVC 4应用程序

为了仅向特定用户发送通知,您将希望使用SignalR的Group功能。这里有一些关于如何设置它的文档:link

您可能最终会在用户登录时为每个用户创建一个组或其他类似的操作。

public async Task UserOnline(string emailAddress)
{
    await Groups.Add(this.Context.ConnectionId, emailAddress);
}

那么你会想在你的signalr SendEmail hub类中使用这样的东西。

Clients.Group(emailAddress).loadUnreadPosts(unread); 
Clients.Group(emailAddress).loadPosts(ret); 

作为旁注,我建议您阅读我提供的链接中的文档。没有理由需要使用knockout来让signalR正常工作。

编辑

我已经得到了类似于上面的工作之前(虽然我已经失去了代码);但是我碰巧看到一篇文章,它可能提供了一个更优雅的解决方案。