使用AzureStoragePersistence的NServiceBus 5导致"无法从超时存储中获取超时"在开发机器以外的机器上

时间:2015-02-12 09:12:57

标签: nservicebus

我尝试使用Azure表存储来暂停超时数据,并且在本地开发计算机以外的环境中遇到错误。

我的本​​地计算机正在Azure上创建超时表,并且能够成功轮询超时数据。但是,如果我在另一台服务器上托管相同的软件,则无法获取超时。我收到以下错误:

    2015-02-12 09:43:50,638 [10] WARN  NServiceBus.Timeout.Hosting.Windows.TimeoutPersisterReceiver - Failed to fetch timeouts from the timeout storage
System.NullReferenceException: Object reference not set to an instance of an object.
   at NServiceBus.Timeout.Hosting.Windows.TimeoutPersisterReceiver.Poll(Object obj) in c:\BuildAgent\work\1b05a2fea6e4cd32\src\NServiceBus.Core\Timeout\Hosting\Windows\TimeoutPersisterReceiver.cs:line 88
   at System.Threading.Tasks.Task.Execute()

似乎TimeoutPersister在想要从中获取数据时为空。

我使用NServiceBus.Host托管NServiceBus。我的端点配置如下所示:

public class EndpointConfig : IConfigureThisEndpoint, AsA_Server
    {
        public void Customize(BusConfiguration configuration)
        {
            configuration.UsePersistence<AzureStoragePersistence>();
            configuration.EndpointName("MyEndpoint");
            configuration.UseTransport<RabbitMQTransport>()
                .DisableCallbackReceiver();
            configuration.DisableFeature<Sagas>();
            configuration.ScaleOut().UseSingleBrokerQueue();();
        }
    }

我的app.config包含:

<connectionStrings>
    <add name="NServiceBus/Transport" connectionString="host=myrabbitmqserver;virtualhost=myhost;username=me;password=secret" />
  </connectionStrings>
  <AzureTimeoutPersisterConfig ConnectionString="DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=myaccouuntkey;" TimeoutManagerDataTableName="TimeoutManager" TimeoutDataTableName="TimeoutData" />

有没有人知道我做错了什么,或者有人能指出我正确的方向调查问题是什么吗?

更新1 似乎NServiceBus.Azure程序集未加载到其他计算机上。因此,在使用TimeoutPersister时,未初始化azure持久性功能会导致NullReferenceException。

更新2 在一些NServiceBus调试之后,我注意到从NServiceBus.Azure.dll程序集中提取类型时抛出了异常。它无法加载引用的程序集Miscrosoft.Data.Services.Client.dll 5.6.0.0。这个程序集确实不在bin文件夹中。目前的版本是5.6.3.0。 NServiceBus.Azure NuGet包支持版本&gt; = 5.6.0.0&lt; 6.0.0.0,但不知怎的,它仍然期待版本5.6.0.0。它在我的开发机器上工作仍然感觉很奇怪?也许在我的机器上安装了一些旧版本的Microsoft.Data.Services.Client.dll作为Azure SDK的一部分,这些版本在程序集加载过程中找到。

更新3 我确实在我的系统中有一个旧的5.6.0版本可用。将Microsoft.Data.xxx软件包降级到5.6.0版现在解决了这个问题。有没有人使用5.6.3版本有相同的问题并找到了解决方案?

更新4 自2015-02-13以来,NServiceBus.Azure的新版本发布,现在它需要Microsoft.Data.Services.Client版本5.6.2.0。我仍然无法使用5.6.3版本。添加程序集绑定重定向也无济于事。

2 个答案:

答案 0 :(得分:1)

必须将绑定重定向添加到NServiceBus.Host.exe.config而不是app.config。非常烦人,因为visual studio会自动更新app.config。

来自Yves Goeleven的资料: 原因是CLR的默认加载行为处于进程级别,包括主机配置,一旦主机加载,我们主动切换到appdomain级别(使用topshelf)从那时起它使用端点的配置...

但是如果CLR需要在切换到appdomain之前解析引用,则必须将重定向放在主机级别(并且在端点级别我猜)

答案 1 :(得分:0)

它应该适用于5.6.3版本。尝试按以下方式添加assembly bindingRedirect

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
    <assemblyIdentity name="Microsoft.Data.Services.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.6.0.0" newVersion="5.6.0.0" />
</dependentAssembly>