2015-02-12 1 views
1

Я пытаюсь использовать хранилище таблиц Azure для сохранения данных таймаута, и я испытываю ошибку в средах, отличных от моей локальной разработки машина.NServiceBus 5 с использованием AzureStoragePersistence приводит к «Не удалось получить тайм-ауты из хранилища тайм-аута» на компьютерах, кроме машины разработки

Моя локальная машина создает таблицы тайм-аутов на 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, используя NServiceBus.Host. Моя конечная конфигурация выглядит следующим образом:

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 не загружена на другие машины. Таким образом, свойства azure persistence не инициализируются, что приводит к исключению NullReferenceException при использовании TimeoutPersister.

Обновление 2 После некоторой отладки NServiceBus я заметил, что при извлечении типов из сборки NServiceBus.Azure.dll было выбрано исключение. Он не может загрузить ссылочную сборку Miscrosoft.Data.Services.Client.dll 5.6.0.0. Эта сборка действительно не находится в папке bin. Настоящая версия - 5.6.3.0. Пакет NServiceBus.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, и нашел решение для этого?

Update 4 Поскольку 2015-02-13 новая версия NServiceBus.Azure выпущена и теперь он требует Microsoft.Data.Services.Client версии 5.6.2.0. Я все еще не могу использовать версию 5.6.3. Добавление перенаправления привязки сборки также не поможет.

ответ

1

Связывание перенаправлением должны быть добавлены к NServiceBus.Host.exe.config вместо app.config. Довольно раздражает, потому что визуальная студия автоматически обновляет app.config.

Информация от Yves Goeleven: Причина в том, что поведение загрузки по умолчанию для CLR находится на уровне процесса, который включает в себя конфигурацию хоста, после загрузки хоста мы активно переключаемся на уровень appdomain (используя верхнюю панель) из то на нем используется конфигурация конечной точки ...

Но если CLR необходимо разрешить ссылку до перехода к appdomain, вам придется переадресовать на уровне хоста (и на уровне конечной точки я предполагаю)

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> 

+0

Спасибо за помощь Шон. Добавление переадресации привязки было первым, что я пробовал без всякой удачи. Начиная с последнего обновления NServiceBus.Azure (2015-02-13), он теперь жалуется на версию Microsoft.Data.Services.Client версии 5.6.2.0. Есть ли у вас какие-либо другие идеи, как это решить? –

+0

Этот переадресация привязки не будет использоваться для версии 5.6.3, поскольку указанный диапазон только доходит до 5.6 ... изменить oldVersion = "0.0.0.0-5.6.0.0" на oldVersion = "0.0.0.0-6.0.0.0" и newVersion = "5.6.0.0" на newVersion = "5.6.3.0" –