在集线器外部触发信号器集线器方法

Triggering signalr hub methods, outside of the hub

我需要为我的 asp.net 核心 2.2 站点实施一些推送通知。 我找到了 signalr,并开始研究它。我已经尝试实现一个小玩具示例,现在我有一个集线器 class,看起来是这样的:

越简单越好。我现在有一个控制器,我需要从中触发客户端计算机上的推送通知。这可能是由于控制器被击中而触发的(在我的真实项目中,我需要在用户在线时以及在我的网站上发布新文章时发送推送通知)。 所以这是我的控制器:

public class msgController : Controller
{
public IActionResult Index()
{
return Content("serving content");
}
}

但我现在需要以某种方式触发集线器的 sendMessage 功能。如果我只是将集线器放在控制器中,我就可以调用它,如下所示:

public class msgController : Controller
{
private IHubContext<NotificationHub> _hub;
public msgController(IHubContext<NotificationHub> hub)
{
_hub = hub;
}
public IActionResult Index()
{
_hub.Clients.All.SendAsync("ReceiveMessage", "bruger", "besked");
return Content("serving content");
}
}

但我想使用我的实际 Hub class,以及我能找到的 none 文档,这样做。我该怎么做?

我看到一些地方给出了 answers that does'nt really make a lot of sense to me, like just accessing the contexthub, through a GlobalHost, that is'nt available to me. Other places claim that this j

那么我如何 call/trigger 我的集线器,并向客户端发送消息? 此外,我的站点版本(其中仅在控制器中编写了集线器)现在可以使用,并且调用了 sendmesage() 函数。但我真的看不到客户端发送的消息。我在哪里可以找到它?

您只需要使用您的集线器方法声明一个接口,例如:

public interface ISignalRHub
{
    /// <summary>
    /// Broadcasts the chart data.
    /// </summary>
    /// <param name="chartData">The chart data.</param>
    Task BroadcastChartData(List<ChartModel> chartData);

    /// <summary>
    /// Broadcasts the message.
    /// </summary>
    /// <param name="message">The message.</param>
    Task BroadcastMessage(string message);

    /// <summary>
    /// Broadcasts the message.
    /// </summary>
    /// <param name="message">The chat message.</param>
    Task BroadcastMessage(ChatMessage message);
}

并在集线器中定义它:

public class SignalRHub : Hub<ISignalRHub>

然后将其注入控制器后:

public msgController(IHubContext<SignalRHub, ISignalRHub> hub)
{
  _hub = hub;
}

因此,如果您想向客户端发送消息,只需在中心创建一个方法并在您的界面中声明它。因为使用 IHubContext 您不能直接调用特定的集线器方法或客户端。

Microsoft documentation中所述:

When client methods are called from outside of the Hub class, there's no caller associated with the invocation. Therefore, there's no access to the ConnectionId, Caller, and Others properties.