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

时间:2021-06-21 08:26:34

标签: c# asp.net signalr

我需要为我的 asp.net core 2.2 站点实现一些推送通知。 我找到了signalr,并开始查看它。我尝试实现一个小玩具示例,现在我有一个看起来像这样的集线器类:

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

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 类,而且,我能找到的文档都没有这样做。我怎么能这样做?

我看到有些地方提供 answers that 对我来说并没有多大意义,例如仅通过 GlobalHost 访问 contexthub,这对我来说是不可用的。其他地方声称这 just is'nt possible

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

1 个答案:

答案 0 :(得分:1)

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

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所述:

<块引用>

从 Hub 类外部调用客户端方法时,没有与调用关联的调用者。因此,无法访问 ConnectionId、Caller 和 Others 属性。