我需要为我的 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() 函数。但我真的看不到客户端发送的消息。我在哪里可以找到它?
答案 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
您不能直接调用特定的中心方法或客户端。
从 Hub 类外部调用客户端方法时,没有与调用关联的调用者。因此,无法访问 ConnectionId、Caller 和 Others 属性。