SignalR和WebAPI,为什么要使用这两者的组合?

时间:2016-09-27 18:53:51

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

我试图从头开始创建一个新的应用程序。我使用过SignalR和WebAPI。我相信我知道很多不同之处,但是因为它使用了websockets,所以SignalR的速度不快吗? WebAPI对我来说是有意义的外部框架能够重用。 SignalR对我来说是不合理的,因为我不一定会在外部使用。我已经完成了一些研究,但我无法找到它说你不应该做的任何地方。我意识到这是基于意见的,但为什么你会使用两者的混合而不仅仅是SignalR?

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

2 个答案:

答案 0 :(得分:8)

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

E.g。服务器不知道客户端是否通过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开发人员的新库   轻松开发实时Web功能。 SignalR允许   服务器和客户端之间的双向通信。服务器可以   现在,当内容成为连接客户端时,立即将内   可用。 SignalR支持Web套接字,并且可以回退到其他网络套接字   旧版浏览器的兼容技术。 SignalR包含用于的API   连接管理(例如,连接和断开事件),   分组连接和授权。

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

答案 1 :(得分:5)

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

从浏览器,HTTP客户端,工具,语言等使用RESTfull服务(HTTP)更容易,而不是使用WebSockets。谷歌浏览器支持监控WebSockets流量,但非常差,而Microsoft Edge则不然。

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

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

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

如果您需要双向通信,您可以使用SignalR进行服务器到客户端推送通知,使用WebApi进行客户端到服务器请求,只需简化开发,扩展,调试和使用其他来源的API。但是,如果你没有使用SignalR或者流量开销对你来说很重要,你也可以使用SignalR。