【问题标题】:System.TypeInitializationException occurred in MassTransit.dllMassTransit.dll 中发生 System.TypeInitializationException
【发布时间】:2016-07-21 09:58:24
【问题描述】:

我一直在使用 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();

就像我说的,这段代码已经好几个月了。就在昨天,我在通过 ServiceBusFactory.New 调用创建 ServiceBus 时开始收到 System.TypeInitializationException

MassTransit.dll 中出现“System.TypeInitializationException”类型的未处理异常

附加信息:“MassTransit.Monitoring.ServiceBusPerformanceCounters”的类型初始化程序引发了异常。

试图读取或写入受保护的内存。这通常表明其他内存已损坏。

这里是 StackTrace:

  • 在 Microsoft.Win32.Win32Native.RegQueryValueEx(SafeRegistryHandle hKey, String lpValueName, Int32[] lpReserved, Int32& lpType, Byte[] lpData, Int32& lpcbData)
    • 在 Microsoft.Win32.RegistryKey.InternalGetValue(String name, Object defaultValue, Boolean doNotExpand, Boolean checkSecurity)
    • 在 Microsoft.Win32.RegistryKey.GetValue(String name)
    • 在 System.Diagnostics.PerformanceMonitor.GetData(String item)
    • 在 System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String item)
    • 在 System.Diagnostics.PerformanceCounterLib.get_CategoryTable()
    • 在 System.Diagnostics.PerformanceCounterLib.CounterExists(String category, String counter, Boolean& categoryExists)
    • 在 System.Diagnostics.PerformanceCounterLib.CounterExists(String machine, String category, String counter)
    • 在 System.Diagnostics.PerformanceCounterCategory.CounterExists(String counterName, String categoryName, String machineName)
    • 在 System.Diagnostics.PerformanceCounterCategory.CounterExists(String counterName, String categoryName)
    • 位于 d:\BuildAgent\work\aa063b4295dfc097\src\MassTransit\Monitoring\ServiceBusPerformanceCounters.cs:151 行中的 MassTransit.Monitoring.ServiceBusPerformanceCounters.b__1(RuntimePerformanceCounter 计数器)
    • 在 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 和其他网站上挖掘了几个小时,但没有取得任何进展。如果有人有任何见解,我很乐意提供帮助。谢谢!

【问题讨论】:

  • 您是刚开始使用 MassTransit 吗?如果是这种情况,我强烈建议从 v3 开始。

标签: c# exception rabbitmq masstransit


【解决方案1】:

我终于找到了解决我问题的答案。我在How to Read Performance Counters Without Administrator Privileges的文章中找到了答案。如果文章被删除,以下是关键部分:

Windows 2003、Windows XP x64 Edition 和 Vista 要求用户必须是 Performance Monitor Users 组的成员才能读取性能计数器数据。只需将您的非管理员用户添加到此组即可解决此问题。

不过,远程访问计数器是另一回事。在 Windows 2003、Windows XP x64 Edition 和 Vista 上,您仍然必须是远程计算机上 Performance Monitor Users 组的一部分,但是 PerformanceCounter 类存在问题,它尝试读取远程计算机上的某些注册表项admin 用户无权访问。要让您的用户无需成为远程计算机上的管理员即可读取这些密钥,请在远程计算机上完成以下步骤:

  1. 通过转到“开始”菜单并选择“运行...”打开注册表编辑器,然后键入“regedit”,然后单击“确定”按钮。
  2. 导航到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurePipeServers\winreg 注册表项。
  3. 右键单击“winreg”键并选择权限。添加您要授予读取权限的用户或组。
  4. 退出注册表编辑器并重新启动 Windows。

我不得不这样做很奇怪,特别是因为我是 Windows 7 机器上的管理员,但这个修复解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2021-11-18
    • 1970-01-01
    • 2019-10-07
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多