将 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
介于 client 和 server 之间。SiglaR
介于 client 和服务器 PLUS(可选)也适用于其他客户端。
Signalr 中的另一件事是能够将数据“推送”到客户端。Rest 无法做到这一点。
另一个考虑因素是电池。保持插座打开需要更多电池。 另一个考虑因素是服务器在并发连接限制方面的强度。
我确实看到了根据场景同时使用它们的好处。
在接收信号较低的环境中,我会使用 Rest。不是 SignalR。 在低电量模式下,我会使用 Rest.not SignalR 在一对一的唯一通信(仅限客户端到服务器)中,我会使用 Rest ,而不是 signalR。
【讨论】:
以上是关于将 REST 与 SignalR 混合而不是仅使用 SignalR 的目的是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何仅使用 Sails.js 的 REST API 作为混合 HTML5 应用程序的后端
koa和sqlite3节点REST端点仅返回数据库对象而不是数据
将 Swagger 与 Django Rest Framework 一起使用,我可以在不同字段而不是一个正文中看到 POST 参数吗