C# 请求的性能计数器不是自定义计数器,它必须初始化为只读;在RouteTable.Routes.MapHubs()上;
我正在AspNet MVC 4应用程序中使用SignalR 1.1.2版本和Windsor Castle。 我的问题是,自从我移动到较新的SignalR版本后,出现了此错误消息C# 请求的性能计数器不是自定义计数器,它必须初始化为只读;在RouteTable.Routes.MapHubs()上;,c#,asp.net,signalr,signalr-hub,C#,Asp.net,Signalr,Signalr Hub,我正在AspNet MVC 4应用程序中使用SignalR 1.1.2版本和Windsor Castle。 我的问题是,自从我移动到较新的SignalR版本后,出现了此错误消息 "The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnly." 排队 RouteTable.Routes.MapHubs(); 这是RegisterHubs类 public s
"The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnly."
排队
RouteTable.Routes.MapHubs();
这是RegisterHubs类
public static class RegisterHubs
{
public static void Start()
{
var signalrDependencyContainer = new WindsorContainer().Install(new HubsInstaller());
var signalrDependency = new SignalrDependencyResolver(signalrDependencyContainer.Kernel);
GlobalHost.DependencyResolver = signalrDependency;
RouteTable.Routes.MapHubs();
}
}
我已经尝试了我在互联网上发现的一些东西,比如:
lodctr /R
cd C:\Windows\Inf\.NETFramework
lodctr corperfmonsymbols.ini
但我还是收到了同样的错误信息。有什么想法吗
我使用的是dotnetframework4.5
这是stacktrace
at System.Diagnostics.PerformanceCounter.InitializeImpl()
谢谢
更新
我正在添加Drew要求的屏幕截图。
因此,根据您提供的信息,很明显,当Signal试图创建性能计数器,但无权使用进程运行时的标识创建性能计数器时,这些是第一次抛出异常。您可以安全地忽略这些异常,但显然无法获得性能计数器数据 如果要创建性能计数器,则需要确保应用程序在运行时的标识属于性能计数器用户组。或者您需要使用中提供的实用程序应用程序来创建带外计数器。只需安装软件包并运行以下命令:
signalr ipc
,也为我解决了这个问题。以下是有关如何运行signal
命令的其他详细信息:
使用软件包管理器安装SignalR Utils:
安装软件包Microsoft.AspNet.signal.Utils
信号机ipc
signal ipc
)-如果不这样做,则运行会导致此错误:
错误:System.Security.SecurityException:请求的注册表访问权限
这是不允许的。
位于Microsoft.Win32.RegistryKey.OpenSubKey(字符串名称,布尔可写)
在System.Diagnostics.PerformanceCounterLib.CreateRegistryEntry(字符串
类别名称,性能计数器类别类型类别类型,反创建数据集合
(创建数据、布尔值和已注册)
在System.Diagnostics.PerformanceCounterLib.RegisterCategory(字符串
类别
名称、性能计数器类别类型、字符串类别帮助、计数器
creationData集合creationData)
在System.Diagnostics.PerformanceCounterCategory.Create(String categoryName,
字符串类别帮助,PerformanceCounterCategoryType类别类型,
计数器创建数据收集计数器数据)
在Microsoft.AspNet.signal.Utils.PerformanceCounterInstaller.InstallCounters()上
请注意,如果您遵循上述(正确)建议并调用“signalr ipc”来安装signalr的自定义计数器,则在使用调试器运行时,您的应用程序可能会莫名其妙地完全停止工作。 问题在于CLR在初始化时如何处理CultureInfo。该问题至少存在于信号器2.2.0中。
这里讨论了完整的解释和一些解决方法:解决了问题。在我的测试或生产服务器中,我没有安装像VisualStudio这样的IDE。所以我也犯了同样的错误。最后,我简单地执行了以下步骤: 请在安装了VS的服务器中执行以下步骤
- 在VS:Tools->NuGet Package Manager->Package Manager控制台中 在命令行中,键入:
- PM>
安装软件包Microsoft.AspNet.signal.Utils
- 转到Packages->Microsoft.AspNet.signal.Utils.2.2.3->Tools
- 复制signalr.exe
- 将signalr.exe粘贴到bin->debug文件夹下并复制路径
- 在管理员模式下打开命令提示符,并将目录更改为复制的路径
- 键入并运行命令
signalr.exe ipc
成功运行上述命令后,我启动了应用程序,它工作正常。如果其他人在测试环境中需要的话,我刚刚发布了这篇文章。这里有一个解决方案,适用于无法使用管理员权限运行的开发人员。在下面创建类并将其添加到DependencyResolver,如下所示:
//尝试访问性能计数器时停止引发异常
var dummyPerformanceCounterManager=新的dummyPerformanceCounterManager();
GlobalHost.DependencyResolver.Register(
类型(IPerformanceCounterManager),
()=>dummyPerformanceCounterManager);
下面是替换PerformanceCounterManager的类
如果您不想完全使用性能计数器,那么当要求解析程序提供
IPerformanceCounterManager
时,如果解析程序返回“null”,则完全可以
看中
private static void InitializePerformanceCounters(此IDependencyResolver解析器解析程序、字符串instanceName、CancellationToken主机关机令牌)
{
var counters=resolver.Resolve();
如果(计数器!=null)
{
初始化(instanceName、hostShutdownToken);
}
}
我只是遇到了这个问题,因为ninject在请求未配置的依赖项时会抛出它。您能提供整个堆栈跟踪,而不仅仅是最底层的条目吗?这将有助于识别信号器中的哪里出了问题。这就是它所拥有的一切,没有其他东西。这是不可能的。你能把你看到的东西截图吗?根据到目前为止您告诉我们的,我认为您看到了第一次机会异常,而信号机正在尝试c
at Microsoft.AspNet.SignalR.Utils.InstallPerformanceCountersCommand.Execute(
String[] args)
at Microsoft.AspNet.SignalR.Utils.Program.Main(String[] args)
The Zone of the assembly that failed was:
MyComputer
public class DummyPerformanceCounterManager : IPerformanceCounterManager
{
private readonly static PropertyInfo[] _counterProperties = GetCounterPropertyInfo();
private readonly static IPerformanceCounter _noOpCounter = new NoOpPerformanceCounter();
public DummyPerformanceCounterManager()
{
foreach (var property in _counterProperties)
{
property.SetValue(this, new NoOpPerformanceCounter(), null);
}
}
public void Initialize(string instanceName, CancellationToken hostShutdownToken)
{
}
public IPerformanceCounter LoadCounter(string categoryName, string counterName, string instanceName, bool isReadOnly)
{
return _noOpCounter;
}
internal static PropertyInfo[] GetCounterPropertyInfo()
{
return typeof(DummyPerformanceCounterManager)
.GetProperties()
.Where(p => p.PropertyType == typeof(IPerformanceCounter))
.ToArray();
}
public IPerformanceCounter ConnectionsConnected { get; set; }
public IPerformanceCounter ConnectionsReconnected { get; set; }
public IPerformanceCounter ConnectionsDisconnected { get; set; }
public IPerformanceCounter ConnectionsCurrentForeverFrame { get; private set; }
public IPerformanceCounter ConnectionsCurrentLongPolling { get; private set; }
public IPerformanceCounter ConnectionsCurrentServerSentEvents { get; private set; }
public IPerformanceCounter ConnectionsCurrentWebSockets { get; private set; }
public IPerformanceCounter ConnectionsCurrent { get; private set; }
public IPerformanceCounter ConnectionMessagesReceivedTotal { get; private set; }
public IPerformanceCounter ConnectionMessagesSentTotal { get; private set; }
public IPerformanceCounter ConnectionMessagesReceivedPerSec { get; private set; }
public IPerformanceCounter ConnectionMessagesSentPerSec { get; private set; }
public IPerformanceCounter MessageBusMessagesReceivedTotal { get; private set; }
public IPerformanceCounter MessageBusMessagesReceivedPerSec { get; private set; }
public IPerformanceCounter ScaleoutMessageBusMessagesReceivedPerSec { get; private set; }
public IPerformanceCounter MessageBusMessagesPublishedTotal { get; private set; }
public IPerformanceCounter MessageBusMessagesPublishedPerSec { get; private set; }
public IPerformanceCounter MessageBusSubscribersCurrent { get; private set; }
public IPerformanceCounter MessageBusSubscribersTotal { get; private set; }
public IPerformanceCounter MessageBusSubscribersPerSec { get; private set; }
public IPerformanceCounter MessageBusAllocatedWorkers { get; private set; }
public IPerformanceCounter MessageBusBusyWorkers { get; private set; }
public IPerformanceCounter MessageBusTopicsCurrent { get; private set; }
public IPerformanceCounter ErrorsAllTotal { get; private set; }
public IPerformanceCounter ErrorsAllPerSec { get; private set; }
public IPerformanceCounter ErrorsHubResolutionTotal { get; private set; }
public IPerformanceCounter ErrorsHubResolutionPerSec { get; private set; }
public IPerformanceCounter ErrorsHubInvocationTotal { get; private set; }
public IPerformanceCounter ErrorsHubInvocationPerSec { get; private set; }
public IPerformanceCounter ErrorsTransportTotal { get; private set; }
public IPerformanceCounter ErrorsTransportPerSec { get; private set; }
public IPerformanceCounter ScaleoutStreamCountTotal { get; private set; }
public IPerformanceCounter ScaleoutStreamCountOpen { get; private set; }
public IPerformanceCounter ScaleoutStreamCountBuffering { get; private set; }
public IPerformanceCounter ScaleoutErrorsTotal { get; private set; }
public IPerformanceCounter ScaleoutErrorsPerSec { get; private set; }
public IPerformanceCounter ScaleoutSendQueueLength { get; private set; }
}
internal class NoOpPerformanceCounter : IPerformanceCounter
{
public string CounterName => GetType().Name;
public long Decrement() => 0;
public long Increment() => 0;
public long IncrementBy(long value) => 0;
public long RawValue { get; set; } = 0;
public void Close() { }
public void RemoveInstance() { }
CounterSample IPerformanceCounter.NextSample() => CounterSample.Empty;
}
private static void InitializePerformanceCounters(this IDependencyResolver resolver, string instanceName, CancellationToken hostShutdownToken)
{
var counters = resolver.Resolve<IPerformanceCounterManager>();
if (counters != null)
{
counters.Initialize(instanceName, hostShutdownToken);
}
}