【问题标题】:SignalR and WebAPI, why use a combination of the two?SignalR 和 WebAPI,为什么要结合使用两者?
【发布时间】:2017-02-05 12:52:08
【问题描述】:

我正在尝试从头开始创建一个新应用程序。我使用过 SignalR 和 WebAPI。我相信我知道很多差异,但是 SignalR 不是因为它使用 websockets 而更快吗? WebAPI 对我来说很有意义,因为外部框架能够重用。对于我不一定要在外部使用的任何东西,SignalR 对我来说都是有意义的。我已经做了一些研究,但我找不到任何地方说你不应该这样做。我意识到这在某种程度上是基于意见的,但是为什么要混合使用两者而不是 SignalR?

我想我主要要问的是使用 SignalR 发送回调用者是否是错误的,除非我会发送给该频道上的其他客户端?对我来说,当您只是将 SignalR 发送回客户端时,它可以像 WebAPI 一样使用。这样做有错吗?客户端调用的代码更少(2 行 vs 6 行或更多,取决于我正在做什么)。我的想法是我现在可能正在尝试操作数据并将其发送给调用者,但也许我想稍后将其发送给所有客户端或向所有客户端发送通知。我不喜欢在我的 webApi 控制器中使用 signalR 调用。感觉 signalR 调用应该在集线器中。感谢您的帮助。

【问题讨论】:

    标签: c# asp.net asp.net-web-api signalr


    【解决方案1】:

    没有理由不将它们一起使用,因为它们针对的是两个不同的问题。 Web-API 是一种使 Web 服务易于被许多不同类型的应用程序/设备定位的方法,而 SignalR 提供双向通信,服务器可以在客户端调用一段代码,而无需客户端继续轮询服务器以获取结果。

    例如与其让客户端通过 SignalR 不断向服务器询问任何新消息(如 facebook 通知),服务器知道有针对特定客户端的新通知,并且它可以直接发送它们而无需客户端请求它们。

    http://www.asp.net/web-api

    ASP.NET Web API 是一个可以轻松构建 HTTP 的框架 覆盖广泛客户的服务,包括浏览器和 移动设备。 ASP.NET Web API 是构建的理想平台 .NET Framework 上的 RESTful 应用程序。

    http://www.asp.net/signalr

    ASP.NET SignalR 是一个面向 ASP.NET 开发人员的新库,它使 轻松开发实时网络功能。 SignalR 允许 服务器和客户端之间的双向通信。服务器可以 现在立即将内容推送到连接的客户端 可用的。 SignalR 支持 Web 套接字,并回退到其他 旧浏览器的兼容技术。 SignalR 包括用于 连接管理(例如,连接和断开事件), 分组连接和授权。

    一个潜在的问题是,虽然SignalR 非常擅长在客户端上定位JavaScript 代码,但Web-Api 可以连接各种平台和设备。因此,通过SignalR 用于针对 Web 浏览器的相同技术不一定适用于原生 Android 应用。

    【讨论】:

    • 这是有道理的。我的强迫症只想使用一种技术,因为代码看起来更干净。当你第一次学习 SignalR 时,大多数教程都希望你连接到集线器,然后调用集线器方法,这真的让你问,等等……这不就是 WebAPI 在这里做的吗?这几乎基本相同,您调用服务器并取回数据,但是对于更像是 post 方法的东西,您可能希望让其他客户端知道已创建模型。无论如何,两者都使用是有意义的,我只是想要干净和正确的代码。
    • @TaylorMitchell - 正如我在回答中所写,SignalR 是双向的。这意味着 Server 可以在 上调用 JavaScript 函数客户端 除了正常的客户端-服务器 通信。你不能单独在Web-API 这样做
    • 我是这样理解的。
    【解决方案2】:

    您可以根据您的应用需求将它们一起使用。我建议您查看difference between HTTP and WebSockets protocols。 WebApi 使用 HTTP(S),SignalR 主要使用 WebSockets,在某些情况下使用其他传输。它们都有优点和缺点。使用 SignalR 的主要好处是如上所述的双工双向通信和低流量开销。浏览器通常会在每个请求的 HTTP 标头和 cookie 中发送几 KB 数据。

    从浏览器、HTTP 客户端、工具、语言等使用 RESTfull 服务 (HTTP) 比使用 WebSocket 更容易。 Google Chrome 支持监控 WebSockets 流量,但效果很差,而 Microsoft Edge 则不支持。

    Google Analytics 和 Microsoft Azure Application Insights 等许多工具可以监控 HTTP 请求中的错误,但不能对 WebSockets 执行此操作。您需要手动实施监控。实际上 WebSockets 流量是从客户端到服务器的简单消息,反之亦然,没有额外的信息。 SignalR 对此有一些包装器 - 某种错误消息格式。

    由于保持开放的 TCP 连接,WebSockets 还使用更多的服务器资源,并且更难扩展使用 WebSockets 的 Web 应用程序。例如,如果您有 10 万在线用户,则意味着您必须能够保持 10 万个 TCP 连接。对于 HTTP——没有必要。对于一些非常简单的场景,您可以将 SignalR 替换为某种客户端轮询,但要注意这种方法可能会带来很多问题。

    因此,如果您不需要双向通信并且流量开销(通常每个请求几 KB)不是什么大问题,那么请仅使用 WebApi。

    如果您需要双向通信,您可以将 SignalR 用于服务器到客户端的推送通知,将 WebApi 用于客户端到服务器的请求,以简化开发、扩展、调试和使用其他来源的 API。但您也可以使用 SignalR,前提是您可以接受 SignalR 的缺点或流量开销很大。

    【讨论】:

      猜你喜欢
      • 2017-05-12
      • 2023-04-05
      • 2010-11-17
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 2018-01-05
      相关资源
      最近更新 更多