C# 请求的性能计数器不是自定义计数器,它必须初始化为只读;在RouteTable.Routes.MapHubs()上;

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

我正在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 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:

  • 在VS:Tools->Library Package Manager->Package Manager中 控制台
  • 在命令行中,键入:

    PM>
    安装软件包Microsoft.AspNet.signal.Utils

  • 以管理员身份运行IDE,请运行:

    PM>
    信号机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);
            }
        }