我尝试使用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版本。添加程序集绑定重定向也无济于事。
答案 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>