围绕SignalR的数据包装
本文关键字:数据包 包装 数据 SignalR 围绕 | 更新日期: 2023-09-27 18:16:57
这可能看起来有点疯狂,但是在阅读有关OData的文章时,我看到一些文章声称普通的WCF Web服务可以公开为OData端点(通过一些黑魔法或其他)。
问题是,对我来说,使用OData端点公开SignalR web服务可能是实用的。目前可用的框架是否可以做到这一点?SignalR服务用于从一个被称为"提供者"的连接客户端提取数据,多个消费客户端可以从该"提供者"请求数据。
编辑-
我为每种类型的实体(或资源就OData而言)都有一组现有的SignalR集线器,并且这些Hubs
中的每一个都以与Repository
类似的方式暴露方法。
public class CustomersHub : Hub
{
public IEnumerable<CustomerData> GetCustomers( )
public IEnumerable<CustomerData> GetCustomers(IEnumerable<int> ids);
// with odata this method may not be necessary.
public IEnumerable<CustomerData> FindCustomersByName(IEnumerable<string> names);
/// ...
}
希望这显示出与ODataController
派生类惊人的相似之处。在这种情况下,Hubs
是资源。
与我所要求的非常相似的东西在WCF数据服务工具包中为WCF数据服务实现了AFAIK不再活跃的WCF数据服务,加上我正在尝试用SignalR做这件事。
如果你问我为什么在这种类型的服务中使用SignalR,这是因为数据并不驻留在Web服务托管的服务器上,某些连接到Web服务的客户端拥有该数据。方法内部是对另一个客户端的调用(除了Caller
),该客户端被发送数据请求。
来自官方OData规范(简介):
开放数据协议(OData)允许创建基于rest的数据服务,它允许资源,使用统一资源定位符 (url)识别并定义在数据模型中,由Web客户端使用简单的HTTP消息发布和编辑。此规范定义了协议的核心语义和行为方面。
这些特征都没有映射到SignalR上,SignalR是一种实时的、非基于资源的技术,它基于各种HTTP/HTML技术/hack,以便推送信息。当然,您可以使用SignalR来实现您所描述的内容,但只要它不会实现REST和纯粹基于http的请求/响应方法(使用SignalR就不会),那么根据定义,它就不是OData。看一下规格,你很快就会发现这在SignalR上没有映射。
即使经过你的编辑,我也看不懂。这就像你希望发生一些奇迹,使你能够通过邮局使用对讲机,仅仅因为你可以查询他们的目录。
也许你应该把你的客户区分为消费者和生产者,为消费者提供OData端点,为其他人提供枢纽,并自己执行必要的"魔法"。
另外,我不认为SignalR有任何IQueryable支持需要开箱即用的OData管道