为什么在内部项目中使用ASP.Net Web Api而不是SignalR?

16

我知道,ASP.NET Web API是为创建RESTful API而设计的,而SignalR则用于实时通信。因此,它们不是竞争性技术。

想象一下:您正在创建一个客户端/服务器应用程序,您正在编写一个桌面客户端,该客户端将连接到服务器以运行某些操作。这些操作由客户端启动,而不是由服务器启动,因此两者都可以正常工作。

如果这是一个内部应用程序,并且您不公开API,则为什么要使用Asp.Net Web Api而不是SignalR?

在两种情况下,您都有在服务器上运行的方法,当客户端调用它们时,这些方法将运行。在Web Api中作为控制器中的操作,在SignalR中则是作为hubs中的方法。两者都允许您向方法发送参数,并在客户端中获得结果。

考虑到SignalR中的流量比Web Api略低(因为在websocket中,HTTP连接是永久建立的,而不是为每个请求创建的),我会选择SignalR。我错过了什么吗?


关于SignalR的低流量问题,只是指出默认情况下SignalR每10秒钟会通过连接发送保持活动消息,因此我不确定这是否是选择SignalR的好标准。 - Wasp
1
在所有回答中,我认为你选择了最不有用的答案作为被接受的答案。 - reach4thelasers
6个回答

12

为什么不两者兼备呢?

你可以使用 WebAPI 提供大量数据,同时作为可选项提供 SignalR 来提供数据更新。这样,你就提供了两种功能:首先使用 REST 允许第三方消费者,还可以提供推送技术如 SignalR 或直接使用 WebSockets,以允许调用者订阅特定数据集的更改。

请记住,SignalR 不仅仅是 WebSockets,事实上,你需要 Windows 8 或 Windows 2012 作为服务器才能使用它们。否则,它会回退到另一种可能不像你想象中那样好用的传输方式。此外,正如 Daniel 指出的那样,SignalR 的可扩展性有点有限,甚至他们自己的文档也指出,你不应该将其用于实时场景或非常分段的数据。SignalR 只适用于普遍广播,如果你在 Windows 8/2012 或第三方组件中,请优先考虑使用本机 Windows API 直接使用 WebSockets。

如果客户端始终是行动发起者,并且请求频率不规律或不高,则可能 REST 请求/响应方法简化了很多事情。如果反之,客户端经常请求和/或以恒定速率请求,则选择 WebSocket,但需要再做一些工作。


6

3
在利弊分析中,您应该添加每种解决方案的限制和可扩展性。我不记得数字,但SigalR需要大量资源来维护连接,特别是对于旧浏览器(5000个客户端是IIS上的默认限制)。而使用WebApi,您关注的是将有多少请求,而不是连接了多少客户端(即使他们什么也没做)。
WebApi也更容易扩展。使用SignalR,您将不得不设置一个可能成为瓶颈的后台平台。
在SignalR中,如果映射用户和连接,则最好选择适合未来要求的解决方案,如果计划添加更多服务器。

2
SignalR官方页面

ASP.NET SignalR是为ASP.NET开发人员设计的库,简化了将实时Web功能添加到应用程序的过程。实时Web功能是指服务器代码可以在其变得可用时即时向连接的客户端推送内容,而不必等待服务器等待客户端请求新数据。

根据您所描述的问题,您并不需要这些功能。考虑到SignalR为提供此类功能而使您失去了一些有用的HTTP特性(缓存、内容协商等),因此建议使用WebAPI。


1
使用SignalR,您可以从服务器向客户端/客户端推送。这类似于WCF双工,但更简单的实现方式是SignalR而不是WCF双工。WebAPI没有WCF双工或信号推送响应来自服务器端。这是同时使用WebAPI和SignalR的第一个原因。
第二个原因与SignalR之间三种不同类型的连接隧道相关。SignalR首先尝试套接字,然后是第一协议失败尝试第二个,如果第二个失败尝试服务器和客户端之间的第三种类型的协议通信。
第三个原因是,使用WebAPI需要调用数据才能接收。使用SignalR,您向服务器发送请求,服务器可能在数据可用时进行响应。无需每次都发送请求以进行检查。
WebAPI和SignalR-将其用于特定的与您想要实现的内容相关的案例。您需要了解SignalR比WebAPI具有更复杂的周期工作流程。

0

选择像Web API这样的框架最具有吸引力的原因是方便。其中一个优点是基于请求头的内容协商。如果您要求JSON,它将自动返回JSON。与XML或其他标准格式相同。它还具有出色的格式化程序系统,使您能够支持自定义需求。它也很轻量级且易于设置。

您完全可以创建自己的框架,甚至使用MVC、WebForms或任何其他方式来公开Web端点,但通常会在响应中硬编码格式(JSON、XML、HTML等)

无论如何,最终您只需要一些能够以HTTP - 请求 -> 响应的术语进行交流的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接