那里的任何人都可以帮助我理解
如何使用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种方法从控制台应用程序调用此方法。
实现此问题的最佳解决方案是什么?我无法调用客户端方法的原因是什么?任何人都可以帮我这个吗?
此致 文斯
答案 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; }
}