wcf autofac集成挂在ServiceChannelFactory.ChannelCreated中

时间:2014-05-08 05:59:46

标签: wcf autofac

我们有一个MVC应用程序,通过wcf使用下游Web服务。 我们遵循注册单个ChannelFactory的proposed approach,它将创建一个通道InstancePerDependency(如果我没有记错的话)。

我们在生产中观察到以下问题:

  • 分析显示System.ServiceModel.Channels.ServiceChannelFactory花费了过多的时间.ChannelCreated(少数100毫秒,偶尔多秒)。在该方法中唯一可以占用任何重要时间的是获取锁定。
  • 性能计数器显示CLR的线性增加>锁和线程>争用率/秒随着时间的推移。

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

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

1 个答案:

答案 0 :(得分:0)

在问题中表达的怀疑证明是真的,渠道正在泄漏。 手头的应用程序有两个问题:

  1. 使用默认的perDependency实例范围注册了IService依赖关系解析,从而导致创建了大量通道。在Web应用程序中,您可能希望将perHttpRequest范围用于wcf客户端通道解析。 (虽然这不应该导致泄漏)
  2. 在Global.Application_Start中,注册了通过autofac解析的全局过滤器。该过滤器类的构造函数采用了一个函数< IDependency>作为构造函数参数,它的某些子依赖关系依赖于IService。 func仅在Web请求中进行评估,但似乎在func评估期间解析的所有依赖关系的生命周期范围是func已解析,即应用程序。 (不是100%肯定的。但是如果为IService解析请求了perHttpRequest实例范围,则根据全局过滤器中的分辨率创建应用程序生存期的一个实例,并且从不丢弃,并为每个实例创建另一个实例httpRequest,并在请求结束时妥善处理)