良好的C#.NET解决方案来管理频繁的数据库轮询

Ber*_*mus 11 c# sql-server rss wcf polling

我目前正在研究ac#.NET桌面应用程序,它将通过WCF和WCF数据服务通过Internet与数据库进行通信.应用程序中有许多位置可能需要在某个时间间隔内刷新.最简单的解决方案是将这些区域放在计时器上并重新查询数据库.但是,由于成千上万的客户端连接到服务层并因此连接到数据库,因此这些操作对服务器来说非常昂贵.

我考虑的是创建一个由客户端轮询的RSS提要,并让客户知道何时需要更新这些特定区域.RSS源将由一个服务进行管理,该服务轮询数据库以进行更改,或者遍历由客户端发出的WCF请求排队的项列表.

我还考虑过从客户端到服务器创建一些直接和连续的连接,但我不确定从客户端打开哪些出站防火墙端口.我可能只能依靠端口80/443.

所以我的问题是人们成功解决这个问题的解决方案是什么?有人做过RSS吗?Microsoft Sync Services?客户端和服务器之间通过WCF通过某个保存端口进行双向通信?

任何想法都非常感谢.

Jer*_*ebe 8

我想你可能想要采用两种方法的组合.首先,您可以使用从客户端到服务器的长轮询,以便服务器可以在客户端感兴趣的更改发生时立即通知客户端.

在ASP.NET中很好地处理上述建议的新技术是SignalR.这可以处理长轮询的大部分细节(或者尽可能使用WebSockets),因此您不必担心它.

其次,基于此问题中的标记,您似乎正在使用SQL Server.您可以在感兴趣的表上使用数据库通知,以便在发生更改时让DB通知您的服务.然后,这可以触发服务通过长轮询连接通知客户端有关更改的信息.您可以使用SqlDependency类执行此操作.

我确信还有其他方法,但这可能会很好地扩展,因为您只有一个服务获取通知,然后将它们分发给所有客户端.


Kol*_*lja 5

你可以在WCF连接中定义一个回调接口,如下所示:

[ServiceContract(CallbackContract = typeof(IFooClient))]
Run Code Online (Sandbox Code Playgroud)

当客户端启动连接时,应该通过防火墙工作.该服务器可以方法注册更改的,你可以得到回调接口

IFooClient client = OperationContext.Current.GetCallbackChannel<IFooClient>();
Run Code Online (Sandbox Code Playgroud)

并回调所有在数据更改时注册的客户端.