Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET MVC 4应用程序中实现向收件人显示电子邮件通知的信号器_C#_Asp.net Mvc_Asp.net Mvc 4_Signalr - Fatal编程技术网

C# 如何在ASP.NET MVC 4应用程序中实现向收件人显示电子邮件通知的信号器

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

我有一个要求,显示电子邮件通知收件人使用信号。我正在使用MVC4开发我的应用程序。我是一个初学者,对信号员没有太多的知识。到目前为止,我已经按照下面的帖子,并试图准备一个样本,可以满足我的要求

上面一个是使用knockout.js,另一个不是。我两个都遵守了,不能满足我的要求

以下是信号器集线器类的代码:

  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);
}
然后,您可能希望在signer
sendmail
hub类中使用类似的内容

Clients.Group(emailAddress).loadUnreadPosts(unread); 
Clients.Group(emailAddress).loadPosts(ret); 
作为补充说明,我建议在我提供的链接中浏览文档。并没有理由需要使用击倒来让信号器正常工作

编辑


我已经得到了类似于上述工作之前(虽然我已经失去了代码);但我刚刚发现了这一点,它实际上可能提供了一个更优雅的解决方案。

谢谢您的回复,您能在这里分享一下Context.ConnectionId的工作原理吗。事实上,我试着使用这个,但在页面重新加载或刷新时不一样。我应该如何使用它?有关上下文属性的信息。我还将代码更新为您可能访问@drneel上下文的方式-有什么建议吗