【问题标题】:ASP.NET API Controllers vs. SignalR Hub MethodsASP.NET API 控制器与 SignalR Hub 方法
【发布时间】:2020-11-30 13:38:58
【问题描述】:

我正在开发一个原型,它使用 SignalR 将消息从服​​务器广播到客户端。我还从客户端与服务器进行通信。这可以通过 2 种方式实现:通过控制器或通过 SignalR Hub 中的方法调用。

现在我的问题是:
为什么要选择 SignalR 集线器方法或 ASP.NET API 控制器作为客户端命令调用的端点? (所以不适用于事件/广播消息)
并跟进:是否建议使用一种或两种?

我了解到不建议从 API 控制器调用 Hub 方法,因为它们是供客户端调用的,而不是供服务器调用的。

API 控制器和 SignalR Hub 都使用 HTTP。

我用过:

  • ASP.NET Core SignalR 1.1.0
  • .NET Core 最新版本

以下链接可获取 SignalR 信息:
https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-5.0

【问题讨论】:

    标签: asp.net-core .net-core signalr


    【解决方案1】:

    SignalR 使用 HTTP 与集线器建立连接(协商和握手),然后在连接建立后,它使用以下协议之一:websocketsserver sent eventslong pollingforever frame。你可以阅读更多关于它的信息here

    您想在需要流式传输数据时使用 SignalR 将数据流式传输到客户端。最简单的例子是刷新某物的状态。想象一下,如果文档已经加载,您需要询问服务器。您将调用端点 n# 次,直到获得所需的答案。使用集线器,服务器将通过 SignalR 调用客户端,表明加载已完成。如您所见,您将节省资源并大大减少向服务器发出的请求量。

    那你用什么?拥抱还是控制?这真的取决于您要执行的具体操作,而不是广播数据的一般情况。

    【讨论】:

    • 我更喜欢拥抱。但是对于原型,我想将 API 控制器用于所有 GET/POST/PUT/DELETE 操作,并且每当所有客户端都需要了解更改(已发布新记录,更新您的数据)时,它将使用 Hub 进行广播.
    • 但是可以在控制器中使用集线器吗?我已经看到了它的示例,但这几乎表明不需要集线器,因为在控制器内部使用了确切的功能 (IHubContext.Clients.All.SendAsync()),就像在集线器中一样。如果您只广播事件,则似乎不需要集线器具有自己的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2018-11-22
    相关资源
    最近更新 更多