SignalR - 如何从不同程序集中的类调用客户端方法?

时间:2012-07-12 06:52:31

标签: signalr

那里的任何人都可以帮助我理解

如何使用SignalR从服务器方法调用客户端方法服务器类驻留在不同程序集中的CustomEvent处理程序中。

我尝试了3种不同的方法来调用该方法:

我将我的中心命名为[HubName(“notificationhub”)]

方法1

Clients.addMessage(message);

这给出了“无法对空引用执行运行时绑定”

方法2

IHubContext context1 = GlobalHost.ConnectionManager.GetHubContext("notificationhub");
context1.Clients.addMessage('hello');

客户保持沉默。

方法3

var hubConnection = new HubConnection("http://localhost:21120/");
var notification= hubConnection.CreateProxy("notificationhub");
hubConnection.Start().Wait();
notification.Invoke("Send", "Hello").Wait();

此方法给出错误:{“远程服务器返回错误:(500)内部服务器错误。”}令我惊讶的是,我可以使用第3种方法从控制台应用程序调用此方法。

实现此问题的最佳解决方案是什么?我无法调用客户端方法的原因是什么?任何人都可以帮我这个吗?

此致 文斯

1 个答案:

答案 0 :(得分:0)

以下是我如何做,有点黑客,但它的工作原理。它仅在从控制器调用集线器时起作用,否则它不起作用。使用UpdateHubFromController方法。

public class UpdateFeedActivity : Hub
{
    readonly IHubContext _hubContext ;

    public UpdateFeedActivity()
    {
        _hubContext = _hubContext ?? GlobalHost.ConnectionManager.GetHubContext<UpdateFeedActivity>();
    }

    public void UpdateFeed(string groupname, string itemId, Enums.FeedActivityTypes activityType,
                                                                               string userId="",
                                                                               string actionResult1="", 
                                                                               string actionResult2="", 
                                                                               string actionResult3="")
    {
       Clients.Group(groupname).updateMessages(new FeedHubResponse
                                              {
                                                  ItemId = itemId,
                                                  ActivityType = activityType.ToString(),
                                                  UserId = userId,
                                                  ActionResult1 = actionResult1,
                                                  ActionResult2 = actionResult2,
                                                  ActionResult3 = actionResult3
                                              });
    }

    public void UpdateFeedFromController(string groupname, string itemId, Enums.FeedActivityTypes activityType,
                                                                               string userId = "",
                                                                               string actionResult1 = "",
                                                                               string actionResult2 = "",
                                                                               string actionResult3 = "")
    {
        _hubContext.Clients.Group(groupname).updateMessages(new FeedHubResponse
        {
            ItemId = itemId,
            ActivityType = activityType.ToString(),
            UserId = userId,
            ActionResult1 = actionResult1,
            ActionResult2 = actionResult2,
            ActionResult3 = actionResult3
        });
    }



    public void Join(string groupname)
    {
        Groups.Add(Context.ConnectionId, groupname);  
    }
}

public class FeedHubResponse
{
    public string ItemId { get; set; }
    public string UserId { get; set; }
    public string ActionResult1 { get; set; }
    public string ActionResult2 { get; set; }
    public string ActionResult3 { get; set; }
    public string ActivityType { get; set; }
    public string Text { get; set; }
}