2014-05-08 54 views
0

我们有一个MVC应用程序使用下游Web服务通过wcf。 我们遵循proposed approach注册一个单例ChannelFactory,它将创建一个通道InstancePerDependency(如果我没有弄错)。wcf autofac集成挂在ServiceChannelFactory.ChannelCreated

我们在生产中注意以下问题:

  • 剖析表明,过多的时间量System.ServiceModel.Channels.ServiceChannelFactory .ChannelCreated花费(100毫秒很少,偶见多秒)。唯一可以在该方法中花费大量时间的是获取锁定。
  • 性能计数器显示随着时间的推移CLR> Lock和Thread> Contention Rate/sec线性增加。

我怀疑某些渠道没有妥善处置。 ChannelFactory保存所有通道的列表(OnCreated在获取锁后将新通道添加到列表中)。当频道关闭或中止时,获取锁定后将从列表中删除。如果列表变得很大,删除可能需要很长时间,并且OnCreated必须等待锁定。

我们将autofac解析成IService注入Controller方法,并且在某些情况下也使用DependecyResolver.Current.GetService。我的理解是,autofac WCF集成将负责处理。那不是吗?什么是确保渠道处置的正确方法?

回答

0

这个问题中的怀疑结果是真的,渠道泄漏。 有两个问题手头的应用程序:

  1. 的IService依赖解析与默认perDependency实例范围登记,导致吨渠道的创建。在Web应用程序中,您可能想要使用perHttpRequest作用域来进行wcf客户端通道解析。 (尽管这不应该导致泄漏)
  2. 在Global.Application_Start中,通过autofac解析的全局过滤器被注册。该过滤器类的构造函数使用func <IDependency>作为构造函数参数,并且它的某个子依赖项对IService具有依赖性。 func只是在web请求中进行评估,但似乎在func评估过程中解决的所有依赖关系的生命周期范围是该func已被解析,即应用程序。 (对此不是100%确定的,但如果为IService解析请求perHttpRequest实例作用域,则应用程序生命周期中的一个实例根据全局筛选器中的分辨率创建,并且从不处置,并且为每个实例创建另一个实例httpRequest,并在请求结束时妥善处置)