为消息拦截实现IDuplexSessionChannel&替换

时间:2012-03-30 20:42:22

标签: wcf caching nettcpbinding channel .net

我想拦截客户端的WCF消息。我不能使用任何MessageInspector,因为我想实现客户端WCF缓存。如果请求之前已被缓存,则响应应来自缓存,否则请求将转发到服务。

当我使用netTcpBinding和netNamedPipeBinding时,实现IRequestChannel的“简单”方式是不可能的。我需要实现IDuplexSessionChannel。现在,我正在寻找一个如何拦截和替换消息的工作示例。


但为什么这很重要?

理论上,WCF服务与可能通过网络进行的所有其他调用一样,应该具有粗粒度接口。原因很明显:WCF具有大量功能来保护连接,实现可靠的混乱,确保身份验证,启用事务(......续......)。显然,这不是免费的。

在实践中,我们遇到了来自该规则的“exeptions”。在一种服务方法中称为thousend次数的服务以及其他违反最佳做法的行为。当然,处理这种情况的最佳方法是重新设计服务。不幸的是,这很少发生(你说出原因......)。

这就是缓存发挥作用的地方。基本上,有两种方法可以做到这一点:

  1. 实施需要重写部分应用程序的解决方案。这样做的一种方法是编写代理调用程序(例如,使用泛型)。
  2. 列表项
  3. 实施“透明”解决方案,适用于所有WCF服务,无需任何修改

    由于显而易见的原因,第二种解决方案似乎更有希望同样,有两种选择:

    1. 使用WCF行为和IOperationInvoker编写服务器端缓存解决方案。这非常简单,Web可以为您提供一些好的示例。如果要缓存的服务在其方法中相当昂贵,例如解决方案是可接受的。从数据库加载大量信息,以便在缓存中查找结果比执行所有必要的计算和IO操作快得多。但是,WCF调用仍然存在,并伴随着所有开销。优点是,您只需要在服务中定义一次该行为,并且此服务的所有客户端都将从缓存中受益。
    2. 编写客户端缓存 -solution,如果响应已经在缓存中,则会阻止WCF调用。当然,这会阻止所有WCF开销,但需要在访问要缓存的服务的所有客户端中定义(端点)行为(例如,任何主数据服务或任何其他“缓慢变化的维度” - 服务)。 / LI>

      第二种解决方案要复杂得多,因为您需要一个通道工厂(和/或一个监听器)以及通道本身的实现。该频道可以是IRequestChannel或IDuplexSessionChannel。同样,您将在Web上找到第一种类型的工作解决方案,但这自然不适用于使用IDuplexSessionChannel的netTcpBining或netNamedPipeBinding。也就是说,为什么我要寻找一个说明如何做到正确的样本。

      只是给人一种好处的印象:一种解决方案,具有长期运行的服务方法,执行时间是(该服务中其他服务的大约150000次调用):

      • netTcpBinding,无缓存:65分钟
      • netNamedPipeBinding,无缓存:40分钟
      • netNamedPipeBinding,服务器端缓存:27分钟
      • netNamedPipeBinding,客户端缓存:19分钟

      没有。在那个szenario中,呼叫从150000下降到大约40000。但是,我的客户端缓存解决方案不适用于双工通道和其他特殊通信类型。因此,我正在寻找一个样本。

      任何帮助将不胜感激。

0 个答案:

没有答案