WCF 服务中的 NinjectServiceHost 不调用 Dispose()

Posted

技术标签:

【中文标题】WCF 服务中的 NinjectServiceHost 不调用 Dispose()【英文标题】:NinjectServiceHost in WCF service does not call Dispose() 【发布时间】:2013-07-20 17:22:04 【问题描述】:

我一直在尝试在使用 Ninject 的 NinjectServiceHost 时调用 IDisposable WCF 服务上的 Dispose 方法,但没有任何运气。然后我下载了 Ninject.extensions.WCF 示例代码并尝试调用 IDisposable TimeService 的 Dispose() 方法,但它也没有被调用。

服务已正确实例化,只是没有调用 Dispose()。

这是一个错误还是我自己和示例代码丢失的东西?

我创建了一个精简的服务和测试主机来重现该问题。代码如下。

我正在使用 Ninject 3.0.1.10、Ninject.extensions.WCF 3.0.0.5、.net 4.5

ServiceModule.cs 代码(用于设置绑定)

using Ninject.Modules;

namespace TestNinjectWcf

   public class ServiceModule : NinjectModule
   
      public override void Load()
      
         Bind<Service1>().ToSelf(); 
         // I've also tried Bind<IService1>().To<Service1>()
         // and also tried various scopes such as InParent() and InRequestScope()
      
   

控制台测试程序启动服务。

using System;
using Ninject.Extensions.Wcf;
using Ninject;
using TestNinjectWcf;

namespace TestConsole

   class Program
   
      static void Main(string[] args)
      
         var kernel = new StandardKernel(new ServiceModule());
         var service = kernel.Get<NinjectServiceHost<Service1>>();
         service.Open();
         Console.WriteLine("Service Started");
         Console.ReadKey();
         service.Close();
      
   

服务实现

using System;
using System.Diagnostics;
using System.ServiceModel;

namespace TestNinjectWcf

   [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
   public class Service1 : IService1, IDisposable
   
      public Service1()
      
         Debug.WriteLine("Constructor");
      

      public string GetData(int value)
      
         return string.Format("You entered: 0", value);
      

      public void Dispose()
      
         Debug.WriteLine("Dispose");  // This line never gets called!
      
   

【问题讨论】:

【参考方案1】:

也许是您创建了单例服务? (InstanceContextMode.Single) 只有一个 InstanceContext 对象用于所有传入调用,并且不会在调用后回收。如果服务对象不存在,则创建一个

【讨论】:

以上是关于WCF 服务中的 NinjectServiceHost 不调用 Dispose()的主要内容,如果未能解决你的问题,请参考以下文章

WCF学习之旅—WCF4.0中的简化配置功能(十五)

将 WCF 服务中的数据公开为 oData

如何通过wcf服务更新宿主项目中的winform控件?

Windows 窗体中的 WCF 数据服务托管

ASP.NET 中的 WCF 模拟异常

如何通过wcf服务更新宿主项目中的winform控件?