将 REST 与 SignalR 混合而不是仅使用 SignalR 的目的是啥? [复制]

Posted

技术标签:

【中文标题】将 REST 与 SignalR 混合而不是仅使用 SignalR 的目的是啥? [复制]【英文标题】:What is the purpose of mixing REST with SignalR instead of using SignalR only? [duplicate]将 REST 与 SignalR 混合而不是仅使用 SignalR 的目的是什么? [复制] 【发布时间】:2021-11-29 09:17:42 【问题描述】:

在阅读本文之前:这不是关于“SignalR 是否比 REST 更好?”的问题


想象一下使用 .Net 5 或 6 创建一个新的 API 项目,我看到许多项目都提供了一个 REST API 来

通过GET查询数据 通过POST写入数据

和 SignalR 集线器实时通知客户有关更改。

基于 SignalR 的文档示例

https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-6.0&tabs=visual-studio#create-a-signalr-hub

public class ChatHub : Hub

    public async Task SendMessage(string user, string message)
    
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    

客户端可以在服务器上调用可能将数据写入数据库的操作。所以我可以用集线器操作替换 REST POST 端点。

基于文档示例进行交流

https://docs.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-6.0#send-messages-to-clients

我也可以要求提供数据,例如

public Task CallerRequestedAllMessages()

    Message[] allMessages = database.ReadAllMessages(); // pseudo code

    return Clients.Caller.SendAsync("ReceiveMessages", allMessages);

并替换 REST GET 请求。

保留 REST API 是否有任何技术原因?当然不能像这样直接消费API

curl -X GET --header 'Accept: application/json' 'https://my-api.com/messages'

但是在创建连接到集线器的“真实”客户端时这并不重要,而且似乎人们正在为自动生成的 SignalR API 文档开发包。

.Net 6 REST API 项目是否提供或解决了 SignalR 项目无法提供或解决的问题?

【问题讨论】:

嗯,它们的目的不一样,不是吗?在 HTTP REST 调用中,客户端应该从头到尾都在那里,如果客户端想要他们可以取消请求。使用 SignalR,您承认客户端可能在那里并且他们可能接收来自服务器的响应,但是当没有收到消息时预计不会发生任何不好的事情。这是否对您的用例有影响,我们不能说。不过,它很可能确实如此。 所以不确定客户端是否收到消息? Discord 等服务是否创建了自己的解决方案来解决此类问题? 也许也值得在softwareengineering 上问这个问题。 【参考方案1】:

这真的取决于。Rest 介于 clientserver 之间。SiglaR 介于 client服务器 PLUS(可选)也适用于其他客户端。

Signalr 中的另一件事是能够将数据“推送”到客户端。Rest 无法做到这一点。

另一个考虑因素是电池。保持插座打开需要更多电池。 另一个考虑因素是服务器在并发连接限制方面的强度。

我确实看到了根据场景同时使用它们的好处。

在接收信号较低的环境中,我会使用 Rest。不是 SignalR。 在低电量模式下,我会使用 Rest.not SignalR 在一对一的唯一通信(仅限客户端到服务器)中,我会使用 Rest ,而不是 signalR。

【讨论】:

以上是关于将 REST 与 SignalR 混合而不是仅使用 SignalR 的目的是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何仅使用 Sails.js 的 REST API 作为混合 HTML5 应用程序的后端

REST api 版本控制(仅版本表示,而不是资源本身)

koa和sqlite3节点REST端点仅返回数据库对象而不是数据

将 Swagger 与 Django Rest Framework 一起使用,我可以在不同字段而不是一个正文中看到 POST 参数吗

史上最全面的SignalR系列教程-目录汇总

如何将 spring-data-rest 与 spring websocket 混合到一个实现中