C# · 12月 28, 2021

signalr – c#代码中的Call Hub方法

这是我的中心码: public class Pusher : Hub,IPusher { readonly IHubContext _hubContext = GlobalHost.ConnectionManager.GetHubContext<Pusher>(); public virtual Task PushToOtherInGroup(dynamic group,dynamic data) { return _hubContext.Clients.Group(group).GetData(data); } }

我想在另一个项目中使用以下代码调用此方法:

var pusher = new Pusher.Pusher(); pusher.PushToOtherInGroup(“Test”,new {exchangeTypeId,price});

我想调用PushToOtherInGroup,当调用方法我没有得到任何错误,但是推动器不起作用.

这是我的Ui代码:

$(function() { hub = $.connection.pusher; $.connection.hub.start() .done(function() { hub.server.subscribe(‘newPrice’); console.log(‘Now connected,connection ID=’ + $.connection.hub.id); }) .fail(function() { console.log(‘Could not Connect!’); });}); (function() { hub.client.GetData = function (data) { debugger; }; });

我的问题是什么?

解决方法 你不能像这样直接实例化和调用一个hub类.通过SignalR运行时,在Hub类周围提供了很多管道,您可以通过将其用作像这样的“普通的类”来绕过.

从外部与SignalR集线器交互的唯一方法是实际获取代表从SignalR运行时的集线器的IHubContext的实例.您只能在同一个过程中执行此操作,因此只要您的其他“项目”正在运行,并使用SignalR代码即可.

如果您的另一个项目将在另一个进程中运行,那么您想要做的就是暴露出一种“伴侣”API,它是另一个SignalR集线器或一个常规的旧Web服务(使用ASP.NET Web API),您可以可以从这个其他应用程序调用来触发你想要的行为.无论您选择哪种技术,您都可能希望确保这一点,以便只有经过身份验证的应用程序可以调用它.

一旦您决定要采取哪种方式,您将通过Pusher hub发送消息的所有操作将是:

// Get the context for the Pusher hubIHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<Pusher>();// Notify clients in the grouphubContext.Clients.Group(group).GetData(data);