【问题标题】:Triggering signalr hub methods, outside of the hub在集线器之外触发信号器集线器方法
【发布时间】:2021-06-21 23:23:07
【问题描述】:

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

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

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() 函数。但我真的看不到客户端发送的消息。我在哪里可以找到它?

【问题讨论】:

  • GlobalHost 在 .net 核心中不可用,这是一个 .net 完整的 signalR 版本。 IHubContext 注入有什么问题?这正是做你想做的事的方式。
  • 嗯,这是因为我希望我的集线器包含与集线器相关的所有其他方法。诸如 onconnected 之类的东西
  • 另外我想在我的 hub 类中定义自己的函数
  • 好吧,没有 HubContext 就无法获得 Hub。选择@Kiril1512 的答案,或者将您的集线器包装在另一个类中(使用 HubContext 注入)。将您需要的方法添加到包装器中,而不是在任何地方使用包装器。

标签: c# asp.net signalr


【解决方案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 属性。

【讨论】:

  • 你可以看到这个信号器示例项目,很快我会添加一个推送通知示例:github.com/Kiril1512/SignalRDemo
  • 非常酷的项目!不过有一件事。我似乎无法弄清楚消息的发送实际发生在哪里?我可以找到集线器类,但找不到似乎发送消息的任何地方
  • 在工作示例中,它发生在 await this.hub.Clients.All.BroadcastChartData(DataManager.GetData()); 上,因此在客户端有一个 signalR 侦听器正在侦听如下方法:private addMessageListener = () =&gt; { this.hubConnection.on('BroadcastMessage', (message: Message) =&gt; { this.message = message; this.messages.push(this.message); console.log(message); }); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多