围绕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),该客户端被发送数据请求。

围绕SignalR的数据包装

来自官方OData规范(简介):

开放数据协议(OData)允许创建基于rest的数据服务,它允许资源,使用统一资源定位符 (url)识别并定义在数据模型中,由Web客户端使用简单的HTTP消息发布和编辑。此规范定义了协议的核心语义和行为方面。

这些特征都没有映射到SignalR上,SignalR是一种实时的、非基于资源的技术,它基于各种HTTP/HTML技术/hack,以便推送信息。当然,您可以使用SignalR来实现您所描述的内容,但只要它不会实现REST和纯粹基于http的请求/响应方法(使用SignalR就不会),那么根据定义,它就不是OData。看一下规格,你很快就会发现这在SignalR上没有映射。

即使经过你的编辑,我也看不懂。这就像你希望发生一些奇迹,使你能够通过邮局使用对讲机,仅仅因为你可以查询他们的目录。

也许你应该把你的客户区分为消费者生产者,为消费者提供OData端点,为其他人提供枢纽,并自己执行必要的"魔法"。

另外,我不认为SignalR有任何IQueryable支持需要开箱即用的OData管道