Dispatcher/Proxy(客户端)扩展,以提高WCF服务的吞吐量



需要一些专家对此案例研究的意见。

问题陈述/场景:我的WCF客户端/代理不断需要来自相关WCF服务的一些锁定数据。更确切地说,我有一个WCF服务,它从数据库中提供位置数据(城市/国家等)(尽管数据缓存在service上)。我希望避免Serialization/DeSerialization(对象包含许多关联的属性以及内部对象)成本和服务操作执行,以获得更好的吞吐量。

几天前,我研究了WCF行为/WCF扩展方法。我在MSDN上发现了一篇有趣的文章(http://msdn.microsoft.com/en-us/magazine/cc163302.aspx)。看完这篇文章后,我认为这可以帮助我提高服务性能。因此,在实现这一点之前,我想确认,无论是我朝着正确的方向思考,还是任何其他解决方案都可以解决我的问题。

我正在考虑实现Dispatcher扩展来解决这个问题,而不是代理(客户端)扩展。我有以下疑问?

I) 我需要在哪里(代理/服务级别)实现扩展?II) 当实现Dispatcher Extensions时,我的调用将不会发送到实际服务,并且我将节省序列化/去序列化的成本。对/错?III) 在我的案例中实现Dispatcher Extensions也更好,因为既然缓存逻辑在服务端,为什么不必担心发生了哪个代理接口方法调用呢。对/错?

请给我一个更好的解决方案,因为我想节省序列化/去序列化的成本,也想实现数据缓存。

提前感谢/Rizwan

我过去有两种方法结合WCF缓存:

  1. 使用Castle DynamicProxy为我的ServiceContract接口生成代理。这些动态代理使用拦截器来执行缓存。如果数据不在缓存中,则拦截器将创建一个真正的WCF客户端(ChannelFactory<TInterface>)并调用WCF操作,然后缓存结果。我喜欢这种方法,因为缓存实现并不是真正特定于WCF的。

  2. 为WCF实现一个IRealProxy,它封装实际的远程操作并根据需要执行缓存/检索。原则上,这与方法1类似,但实现是特定于WCF的(带有.NET Remoting的残余)。在迁移到#1之前,我使用了这种方法。我迁移到方法1,因为方法1使我能够以与实现无关的方式在客户端和服务器上实现缓存。当时,我推出了自己的RealProxy,但看起来其他人也这么做了,并发布了代码:http://blog.ngommans.ca/index.php?/archives/31-自定义代理生成-使用-RealProxy.html

最新更新