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

NServiceBus 5使用AzureStoragePersistence会导致;无法从超时存储中获取超时;在开发机器以外的机器上,nservicebus,Nservicebus,我尝试使用Azure表存储来持久化超时数据,但在本地开发机器以外的环境中遇到了一个错误 我的本地计算机正在Azure上创建超时表,并且能够成功轮询超时数据。但是,如果我在另一台服务器上托管相同的软件,它就无法获取超时。我收到以下错误: 2015-02-12 09:43:50,638 [10] WARN NServiceBus.Timeout.Hosting.Windows.TimeoutPersisterReceiver - Failed to fetch timeouts from

我尝试使用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似乎在它想要从中获取数据的点处为null

我使用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();();
        }
    }
public class EndpointConfig:IConfigureThisEndpoint,AsA_服务器
{
公共void自定义(总线配置)
{
configuration.UsePersistence();
configuration.EndpointName(“MyEndpoint”);
configuration.UseTransport()
.DisableCallbackReceiver();
configuration.DisableFeature();
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程序集。因此,azure持久性功能未初始化,导致在使用TimeoutPersister时出现NullReferenceException

更新2在一些NServiceBus调试之后,我注意到从NServiceBus.Azure.dll程序集中提取类型时引发了异常。无法加载引用的程序集Miscrosoft.Data.Services.Client.dll 5.6.0.0。此程序集确实不在bin文件夹中。目前的版本是5.6.3.0。Azure NuGet包支持版本>=5.6.0.0<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年2月13日起,NServiceBus.Azure的新版本发布,现在需要Microsoft.Data.Services.Client版本5.6.2.0。我仍然无法使用5.6.3版本。添加程序集绑定重定向也不会有帮助。

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

<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>


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

来自Yves Goeleven的信息: 原因是CLR的默认加载行为是在进程级别,其中包括主机配置,一旦加载主机,我们将主动切换到appdomain级别(使用topshelf),然后使用端点的配置


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

谢谢您的帮助Sean。添加绑定重定向是我尝试的第一件事,但没有任何运气。自上次更新NServiceBus.Azure(2015-02-13)以来,它现在正在抱怨Microsoft.Data.Services.Client版本5.6.2.0。你有没有其他办法解决这个问题?这个绑定重定向不会在5.6.3版本生效,因为指定的范围只会上升到5.6。。。将oldVersion=“0.0.0-5.6.0.0”更改为oldVersion=“0.0.0-6.0.0”,将newVersion=“5.6.0.0”更改为newVersion=“5.6.3.0”