Исключение System.TypeInitializationException в MassTransit.dll

Я использую MassTransit вместе с пакетами RabbitMQ.Client NuGet для публикации сообщений в своей очереди RabbitMQ. Это отлично работает уже несколько месяцев. Внезапно (без изменений кода) я больше не могу создавать ServiceBus. Вот код, который я использовал в течение нескольких месяцев:

public class RabbitBus
{
    private IServiceBus bus;

    public void Start(Action<ServiceBusConfigurator> moreInitialization)
    {
        const string host = "rabbitmq://localhost/testqueue";

        bus = ServiceBusFactory.New(x =>
        {
            x.UseRabbitMq(r =>
            {
                r.ConfigureHost(new Uri("rabbitmq://localhost/testqueue"), h =>
                {
                    h.SetUsername("user");
                    h.SetPassword("password");
                });
            });
            x.ReceiveFrom(host);
            moreInitialization(x);
        });
    }

    public void Stop()
    {
        bus.Dispose();
    }

    public void Publish<T>(T message)
    {
        bus.Publish(message, x => { x.SetDeliveryMode(DeliveryMode.Persistent); });
    }
}

И тогда я бы опубликовал такое сообщение:

var bus = new RabbitBus();
bus.Start((x) => {});
bus.Publish("Test");
bus.Stop();

Как я уже сказал, этот код прекрасно работал несколько месяцев. Буквально вчера я начал получать System.TypeInitializationException при создании моей ServiceBus с помощью вызова ServiceBusFactory.New.

Произошло необработанное исключение типа «System.TypeInitializationException» в MassTransit.dll.

Дополнительная информация. Инициализатор типа MassTransit.Monitoring.ServiceBusPerformanceCounters вызвал исключение.

Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.

Вот трассировка стека:

  • at Microsoft.Win32.Win32Native.RegQueryValueEx(SafeRegistryHandle hKey, String lpValueName, Int32[] lpReserved, Int32& lpType, Byte[] lpData, Int32& lpcbData)
    • at Microsoft.Win32.RegistryKey.InternalGetValue(String name, Object defaultValue, Boolean doNotExpand, Boolean checkSecurity)
    • в Microsoft.Win32.RegistryKey.GetValue (имя строки)
    • в System.Diagnostics.PerformanceMonitor.GetData (строковый элемент)
    • в System.Diagnostics.PerformanceCounterLib.GetPerformanceData (строковый элемент)
    • в System.Diagnostics.PerformanceCounterLib.get_CategoryTable()
    • в System.Diagnostics.PerformanceCounterLib.CounterExists (категория строк, счетчик строк, логическое значение и категория существует)
    • в System.Diagnostics.PerformanceCounterLib.CounterExists (машина String, категория String, счетчик String)
    • в System.Diagnostics.PerformanceCounterCategory.CounterExists (String counterName, String categoryName, String machineName)
    • в System.Diagnostics.PerformanceCounterCategory.CounterExists(String counterName, String categoryName)
    • в MassTransit.Monitoring.ServiceBusPerformanceCounters.b__1(счетчик RuntimePerformanceCounter) в d:\BuildAgent\work\aa063b4295dfc097\src\MassTransit\Monitoring\ServiceBusPerformanceCounters.cs:строка 151
    • в System.Linq.Enumerable.WhereArrayIterator`1.MoveNext()
    • в System.Linq.Enumerable.Count[TSource](источник IEnumerable`1)
    • в MassTransit.Monitoring.ServiceBusPerformanceCounters.InitiatizeCategory() в d:\BuildAgent\work\aa063b4295dfc097\src\MassTransit\Monitoring\ServiceBusPerformanceCounters.cs:строка 150
    • в MassTransit.Monitoring.ServiceBusPerformanceCounters..ctor() в d:\BuildAgent\work\aa063b4295dfc097\src\MassTransit\Monitoring\ServiceBusPerformanceCounters.cs:строка 91
    • в MassTransit.Monitoring.ServiceBusPerformanceCounters..cctor() в d:\BuildAgent\work\aa063b4295dfc097\src\MassTransit\Monitoring\ServiceBusPerformanceCounters.cs:строка 30

Я часами копался в StackOverflow и других сайтах, но так и не продвинулся. Если у кого есть понимание, буду рад помощи. Спасибо!


person Andrew Backes    schedule 01.04.2016    source источник
comment
Вы только начинаете работать с MassTransit? Я настоятельно рекомендую начать с v3, если это так.   -  person Chris Patterson    schedule 02.04.2016


Ответы (1)


Наконец-то я нашел ответ, который решил мою проблему. Я нашел ответ в статье Как читать счетчики производительности без прав администратора. На случай, если статью когда-нибудь уберут, вот ключевые ее части:

Windows 2003, Windows XP x64 Edition и Vista требуют, чтобы пользователь входил в группу пользователей системного монитора для чтения данных счетчиков производительности. Простое добавление пользователя без прав администратора в эту группу решит эту проблему.

Однако удаленный доступ к счетчикам — это отдельная история. В Windows 2003, Windows XP x64 Edition и Vista вы по-прежнему должны быть частью группы пользователей системного монитора на удаленной машине, но есть проблема с классом PerformanceCounter, когда он пытается прочитать некоторые ключи реестра на удаленной машине, которые не пользователи с правами администратора не имеют доступа. Чтобы предоставить вашему пользователю доступ для чтения к этим ключам без необходимости быть администратором на удаленном компьютере, выполните следующие действия на удаленном компьютере:

  1. Откройте редактор реестра, перейдя в меню «Пуск» и выбрав «Выполнить…», затем введите «regedit» и нажмите кнопку «ОК».
  2. Перейдите в раздел реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurePipeServers\winreg.
  3. Щелкните правой кнопкой мыши ключ «winreg» и выберите «Разрешения». Добавьте пользователей или группы, которым вы хотите предоставить доступ для чтения.
  4. Выйдите из редактора реестра и перезапустите Windows.

Странно, что мне пришлось это сделать, тем более что я являюсь администратором на компьютере с Windows 7, но это исправление решило мои проблемы.

person Andrew Backes    schedule 01.04.2016