尝试在WCF服务中启动NServiceBus实例时为空传输

时间:2012-12-18 10:59:08

标签: wcf ninject nservicebus nservicebus3

我正在使用NServiceBus 3.3.3。我正在使用Ninject作为我的容器,我通过绑定到以下方法来初始化模块中的总线:

Bind<IBus>().ToMethod(context =>
{
    return CreateBus();
}).InSingletonScope();



private IBus CreateBus()
{
    var bus = NServiceBus.Configure.With()
    .NinjectBuilder(this.Kernel)
    .DefineEndpointName("MyEndpointName")
    .MsmqTransport()
    .IsTransactional(true)
    .PurgeOnStartup(false)
    .DisableRavenInstall()
.DisableTimeoutManager()
    .InMemorySubscriptionStorage()
    .XmlSerializer()
    .UnicastBus()
    .ImpersonateSender(false)
    .CreateBus();

    return bus.Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
}

相同的代码在不同的(MVC4)项目中工作正常,但在我的WCF WAS服务中,似乎transport的{​​{1}}成员始终为null,因此第824行UnicastBus下降结束了。

  

对象引用未设置为对象的实例。在NServiceBus.Unicast.UnicastBus.NServiceBus.IStartableBus.Start(Action   startupAction)   C:\ TeamCity的\ buildAgent \工作\ nsb.master_2 \ SRC \单播\ NServiceBus.Unicast \ UnicastBus.cs:线   824在   Access.Cloud.WebService.Modules.NServiceBusModule.CreateBus()in   L:\项目\ aCloud \ InsightIntegration \ Access.Cloud.WebService \模块\ NServiceBusModule.cs:行   47点   Access.Cloud.WebService.Modules.NServiceBusModule.b__0(IContext   上下文)   L:\项目\ aCloud \ InsightIntegration \ Access.Cloud.WebService \模块\ NServiceBusModule.cs:行   25在Ninject.Activation.Provider'1.Create(IContext context)中   c:\ Projects \ Ninject \ ninject \ src \ Ninject \ Activation \ Provider.cs:第38行   在Ninject.Activation.Context.Resolve()中   c:\ Projects \ Ninject \ ninject \ src \ Ninject \ Activation \ Context.cs:第157行   在System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
  在System.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable`1   来源)   System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext()

我也在调试器中检查了它,确定transport.MaxThroughputPerSecond = license.MaxThroughputPerSecond;为空。

我猜它是环境的东西,但我认为传输只是来自调用transport时设置的一些绑定。我尝试将从Ninject Web引导程序加载模块的代码移动到Global.asax,但它没有什么区别。

感谢任何帮助或指导!

1 个答案:

答案 0 :(得分:3)

问题是您正在使用该方法创建对总线的引用。您正在使用的方法应该在流程启动时调用一次即可。

修复方法是将总线变量存储在该类的字段中,然后在容器注册中使用该字段,如下所示:

Bind<IBus>().ToMethod(context =>
{
    return bus;
}).InSingletonScope();
相关问题