none
求问SignalR 如何在其他类里面调用Hub(SignalR集线器类的方法)里面的方法 RRS feed

  • 问题

  • 本人初学。 用的是MVC5   SignalR2.0.3  framework4.5.1

    想用SignalR实现一个消息提醒系统。

    用户登录时的提醒已经实现。代码如下

     public class MessageHub : Hub
        {
            private ApplicationDbContext db = new ApplicationDbContext();
            private Hashtable hashtab = new Hashtable();
            public void MessageMail(string Id)
            {
                var result = from c in db.Inboxs
                             select new {  c.Recipient, c.IsDestroy, c.isRead };
                result = result.Where(r => r.IsDestroy == false && r.isRead == false);
                result = result.Where(r => r.Recipient.Equals(Id));
                result = result.OrderByDescending(r => r.SentTime);
                int total = result.Count();
                result.ToList().Take(10);
                Clients.Group(Id).MessageMail(total, result);
           
            }
    
            public void AddClient(string Id)
            {
                this.Groups.Add(Context.ConnectionId, Id);
            }
        }

    然后我希望别人给在线用户发邮件时刷新提醒。

    在邮件的Controller里 群发邮件成功后 代码如下

      ThinkTeam.Hubs.MessageHub hub = new Hubs.MessageHub();
                    for (int i = 0; i < array.Length; i++)
                    {
                        hub.MessageMail(array[i]);
                    } 

    然后就会报错  

    系统会在运行到

     Clients.Group(Id).MessageMail(total, result);

    时报 

    “Clients.Group(Id).MessageMail(total, result)”引发了“System.Reflection.TargetInvocationException”类型的异常
        base: {"调用的目标发生了异常。"}

    网上也没什么相关例子 都是些聊天室  没有涉及到后台调用hub类的情况  求问这种情况如何处理

    2014年5月30日 9:15

全部回复

  • 大概你不能直接创建 Hub,这样创建试试:

    Microsoft.AspNet.SignalR.IHubContext context = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<ThinkTeam.Hubs.MessageHub>();

    // ...

    context.Clients.All.MessageMail(array[i]);





    理解的越多,需要记忆的就越少

    2014年7月1日 14:11
    版主
  • 楼主:

    1)把MessageMail改成messageMail(第一个字母小写)。

    2)messageMail是一个客户端方法,告知客户端已经成功发送邮件。你应该在服务端通知客户端之前完成你想要的逻辑,例如:

    result.ToList().Take(10);
    
    //此处插入你的处理邮件逻辑
    
    Clients.Group(Id).MessageMail(total, result);

    3)客户端这样调用:

    $.xxx.client.messageMail=function(toatal,result)
    {
        //此处处理服务端的结果
    }


    ASP.NET Forum
    Other Discussion Forums
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2014年7月9日 9:30