在集线器外部触发信号器集线器方法
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
您不能直接调用特定的集线器方法或客户端。
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.
我需要为我的 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
您不能直接调用特定的集线器方法或客户端。
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.