2

有谁能帮我理解

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

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

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

方法1

Clients.addMessage(message);

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

方法二

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)内部服务器错误。”}令我惊讶的是,我能够使用第三种方法从控制台应用程序调用此方法。

实现这一点的最佳解决方案是什么,我无法调用客户端方法的原因是什么?谁能帮我这个?

问候文斯

4

1 回答 1

0

这就是我的做法,有点hack,但它有效。它仅在从控制器调用集线器时有效,否则将不起作用。使用 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; }
}
于 2013-03-15T16:10:34.967 回答