2010-12-07 132 views
11

我目前正在研究将通过WCF和WCF数据服务通过互联网与数据库进行通信的C#.NET桌面应用程序。应用程序中会有许多点需要在一段时间内刷新。最简单的解决方案是将这些区域放在计时器上并重新查询数据库。但是,有数千个客户端连接到服务层和数据库,这些操作对于服务器来说是非常昂贵的。良好的C#.NET解决方案来管理频繁的数据库轮询

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

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

所以我的问题是有什么解决方案有人成功实施解决这个问题?有人完成RSS?微软同步服务?客户端和服务器之间通过WCF通过一些保存端口进行双向通信?

任何想法,不胜感激。

回答

8

我想你可能想要结合使用两种方法。首先,您可以使用从客户端到服务器的long polling,以便服务器在客户端感兴趣的更改发生后立即通知客户端。

一种新技术,可以在ASP中很好地处理上述建议。 NET是SignalR。这处理了很多长轮询的细节(或者在可能的时候使用WebSockets),所以你不必担心它。

其次,基于这个问题中的标签,它看起来像你正在使用SQL Server。您可以在您感兴趣的表上使用数据库通知,让DB在发生更改时通知您的服务。这可能会触发该服务通过长轮询连接向客户端通知有关更改。您可以使用SqlDependency类来完成此操作。

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

+0

+1,但我担心使用长轮询的数千客户端。一些环境优化对于开放连接可能是必需的。我从来没有这样做过WCF,所以我不能评论困难/积极因素。 – marr75 2010-12-07 16:23:42

+0

+1你知道C#中使用WCF的任何长轮询实现吗?我已经使用了它,并没有拿出任何好的例子。 – BernicusMaximus 2010-12-07 19:56:37

0

如果昂贵的操作是共享数据库的服务器,则应该实施某种缓存。它可以像ASP.NET缓存一样基本,也可以像使用memcached一样高级。

但是,如果昂贵的操作是客户端池服务器,则可以使用带有PubSubHubbub的Atom或RSS源来最小化对服务器的请求数。它会变得更便宜,因为有一些免费的PubSubHubbub发布者可以处理负载。

0

你可以看着Service Broker,这样你就不必轮询更新

5

可以在WCF连接这样定义一个回调接口:

[ServiceContract(CallbackContract = typeof(IFooClient))] 

由于客户端启动应该通过防火墙工作的连接。该服务器可以方法注册更改的,你可以用

IFooClient client = OperationContext.Current.GetCallbackChannel<IFooClient>(); 

得到回调接口和回调的所有已注册的数据更改的客户端。

0

我不知道为什么RSS比使Web服务缓存来自数据库的信息更简单。

要比较2个选项,假设您需要知道谁最后在报表中编辑了对象(或上次更新等)。使用RSS提要时,您必须提出Feed的请求,获取它,解析它,并根据相关值采取措施。通过一个Web服务调用来缓存和缓存数据库调用,您只需调用服务并对结果采取行动。我唯一能看到RSS更好的是,1)你支持多个客户,或者你不控制或者不是.Net客户,2)你基于大量的被调查值同时采取行动。

相关问题