【问题标题】:Null transport when trying to start NServiceBus instance in WCF service尝试在 WCF 服务中启动 NServiceBus 实例时出现空传输
【发布时间】:2012-12-18 10:59:07
【问题描述】:

我正在使用 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 服务中,我似乎 UnicastBus 的成员 transport 始终为空,因此第 824 行 transport.MaxThroughputPerSecond = license.MaxThroughputPerSecond; 失败。

对象引用未设置为对象的实例。在 NServiceBus.Unicast.UnicastBus.NServiceBus.IStartableBus.Start(动作 启动动作)在 c:\TeamCity\buildAgent\work\nsb.master_2\src\unicast\NServiceBus.Unicast\UnicastBus.cs:line 824 在 Access.Cloud.WebService.Modules.NServiceBusModule.CreateBus() 中 l:\Projects\aCloud\InsightIntegration\Access.Cloud.WebService\Modules\NServiceBusModule.cs:line 47 在 Access.Cloud.WebService.Modules.NServiceBusModule.b__0(IContext 上下文)在 l:\Projects\aCloud\InsightIntegration\Access.Cloud.WebService\Modules\NServiceBusModule.cs:line 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 为空。

我猜这是环境问题,但我认为传输只是来自一些在调用 MsmqTransport() 时设置的绑定。我尝试将加载模块的代码从 Ninject 网络引导程序移动到 Global.asax,但它没有任何区别。

感谢任何帮助或指导!

【问题讨论】:

  • 我想我要补充一点,它似乎与使用的构建器类型无关,并且在使用 DefaultBuilder() 时它的作用完全相同。
  • 我想知道 WAS 是否导致程序集扫描出现问题。您可以尝试将相关程序集的列表显式传递给 Configure.With() 吗?
  • @AndreasÖhlund 这个问题似乎已经消失了,因为我更新到 3.3.4 并将有问题的端点更改为 SendOnly。如果我以后有类似的问题,我会尝试显式方法。感谢您的帮助 :) 该解决方案现已在集成测试中启动并运行,并且工作起来就像一个魅力:D

标签: wcf ninject nservicebus nservicebus3


【解决方案1】:

问题在于您正在使用该方法来创建对总线的引用。您正在使用的方法应该在进程启动时调用一次,就是这样。

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

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

【讨论】:

  • 感谢 Udi 的快速响应。我怎么做似乎并不重要,它独立于它看起来的容器发生。我将代码更改为上述代码(无论如何我都保留了对它的静态引用),但它仍然发生了。最令人费解!
  • 在同一解决方案中的另一个 Web 项目中,示例工作和总线初始化正常。
  • 我还从头开始创建了一个测试 WCF 服务项目,它也可以工作。在半相关的注释中,看起来将现有内核传递给 NinjectBuilder 将创建 IBus 绑定,因此不需要在我的代码中调用 Bind(当 Ninject 解决 IBus 时确实会导致问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
相关资源
最近更新 更多