我一直在使用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:
- at Microsoft.Win32.Win32Native.RegQueryValueEx(SafeRegistryHandle hKey,String lpValueName,Int32 [] lpReserved,Int32&amp; lpType,Byte [] lpData,Int32&amp; lpcbData)
- at Microsoft.Win32.RegistryKey.InternalGetValue(String name,Object defaultValue,Boolean doNotExpand,Boolean checkSecurity)
- at Microsoft.Win32.RegistryKey.GetValue(String name)
- at System.Diagnostics.PerformanceMonitor.GetData(String item)
- at System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String item)
- at System.Diagnostics.PerformanceCounterLib.get_CategoryTable()
- at System.Diagnostics.PerformanceCounterLib.CounterExists(String category,String counter,Boolean&amp; categoryExists)
- at System.Diagnostics.PerformanceCounterLib.CounterExists(String machine,String category,String counter)
- at System.Diagnostics.PerformanceCounterCategory.CounterExists(String counterName,String categoryName,String machineName)
- at System.Diagnostics.PerformanceCounterCategory.CounterExists(String counterName,String categoryName)
- 位于d:\ BuildAgent \ work \ aa063b4295dfc097 \ src \ MassTransit \ Monitoring \ ServiceBusPerformanceCounters.cs:第151行的MassTransit.Monitoring.ServiceBusPerformanceCounters.b__1(RuntimePerformanceCounter计数器)
- at System.Linq.Enumerable.WhereArrayIterator`1.MoveNext()
- at System.Linq.Enumerable.Count [TSource](IEnumerable`1 source)
- 位于d:\ BuildAgent \ work \ aa063b4295dfc097 \ src \ MassTransit \ Monitoring \ ServiceBusPerformanceCounters.cs中的MassTransit.Monitoring.ServiceBusPerformanceCounters.InitiatizeCategory():第150行
- 位于d:\ BuildAgent \ work \ aa063b4295dfc097 \ src \ MassTransit \ Monitoring \ ServiceBusPerformanceCounters.cs:第91行中的MassTransit.Monitoring.ServiceBusPerformanceCounters..ctor()
- 位于d:\ BuildAgent \ work \ aa063b4295dfc097 \ src \ MassTransit \ Monitoring \ ServiceBusPerformanceCounters.cs:第30行的MassTransit.Monitoring.ServiceBusPerformanceCounters..cctor()
我一直在StackOverflow和其他网站上挖掘数小时,但没有取得进展。如果有人有任何见解,我会很乐意帮助你。谢谢!
答案 0 :(得分:0)
我终于找到了解决问题的答案。我在文章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上,您仍然必须是远程计算机上的性能监视器用户组的一部分,但是PerformanceCounter类存在问题,它尝试读取远程计算机上的某些注册表项。管理员用户无权访问。要为您的用户提供对这些密钥的读取权限而无需成为远程计算机上的管理员,请在远程计算机上完成以下步骤:
- 打开注册表编辑器,转到“开始”菜单并选择“运行...”,然后键入“regedit”,然后单击“确定”按钮。
- 导航到HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurePipeServers \ winreg注册表项。
- 右键单击“winreg”键并选择“权限”。添加要授予读取权限的用户或组。
- 退出注册表编辑器并重新启动Windows。
醇>
我必须这样做很奇怪,特别是因为我是Windows 7计算机上的管理员,但是这个修复解决了我的问题。