web-dev-qa-db-ja.com

要求されたパフォーマンスカウンターはカスタムカウンターではありません。RouteTable.Routes.MapHubs();でReadOnlyとして初期化する必要があります。

AspNet MVC4アプリケーションでSignalR1.1.2バージョンとWindsorCastleを使用しています。私の問題は、新しい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

しかし、それでも同じエラーメッセージが表示されます。何か案は?

Dotnet Framework4.5を使用しています。

これはスタックトレースです

at System.Diagnostics.PerformanceCounter.InitializeImpl()

ありがとう!

[〜#〜] update [〜#〜] Drewからリクエストされたスクリーンショットを追加します。 enter image description here

enter image description here

enter image description here

18
polonskyg

したがって、提供した情報に基づいて、SignalRがパフォーマンスカウンターを作成しようとしたときにスローされる最初のチャンスの例外であるが、プロセスが実行されているIDで作成する権限がないことは明らかです。これらの例外は無視しても問題ありませんが、パフォーマンスカウンターデータは明らかに取得されません。

パフォーマンスカウンターを作成する場合は、アプリケーションの実行時に、アプリケーションのIDがパフォーマンスカウンターユーザーグループに属していることを確認する必要があります。それか、 Microsoft ASP.NET SignalR Utilities NuGetパッケージ で提供されているユーティリティアプリケーションを使用する必要があります。これにより、帯域外のカウンターを作成できます。パッケージをインストールして、次のコマンドを実行するだけです。

signalr ipc
24
Drew Marsh

Drew Marshの応答 、私も問題を解決しました。 signalrコマンドの実行方法を説明する追加の詳細は次のとおりです。


パッケージマネージャーを使用して、SignalRUtilsをインストールします。

  1. VSの場合:[ツール]-> [ライブラリパッケージマネージャー]-> [パッケージマネージャーコンソール]
  2. コマンドラインから、次のように入力します。

    PM> Install-Package Microsoft.AspNet.SignalR.Utils

  3. IDEを管理者として実行するには、次を実行します。

    PM> signalr ipc

パフォーマンスカウンターのインストールコマンドを実行するには、管理者権限が必要です(signalr ipc)-そうせずに実行すると、次のエラーが発生します。

エラー:System.Security.SecurityException:要求されたレジストリアクセスは許可されていません。 Microsoft.Win32.RegistryKey.OpenSubKey(String name、Boolean writable)at System.Diagnostics.PerformanceCounterLib.CreateRegistryEntry(String categoryName、PerformanceCounterCategoryType categoryType、CounterCreationDataCollection createData、Boolean&iniRegistered)at System.Diagnostics.PerformanceCounterLib.RegisterCategory(String category Name、 System.Diagnostics.PerformanceCounterCategory.Create(String categoryName、String categoryHelp、PerformanceCounterCategoryType categoryType、CounterCreationDataCollection counterData)at Microsoft.AspNet.SignalR.Utils.PerformanceCounterInstaller.InstallCounters()のPerformanceCounterCategoryType categoryType、String categoryHelp、Counter CreationDataCollection CreationData)

   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
14
CJBS

上記の(正しい)アドバイスに従い、「signalr ipc」を呼び出してSignalRのカスタムカウンターをインストールすると、デバッガーで実行しているときにアプリケーションが不可解に動作を停止する可能性があることに注意してください。この問題は、CLRが初期化時にCultureInfoを処理する方法のバグです。この問題は、少なくともSignalR2.2.0に存在します。完全な説明といくつかの回避策については、ここで説明します: https://github.com/SignalR/SignalR/issues/3414

3

これは、管理者権限で実行できない開発者向けのソリューションです。以下のクラスを作成し、次のようにDependencyResolverに追加します。

// Stop exception being thrown when trying to access performance counters
var dummyPerformanceCounterManager = new DummyPerformanceCounterManager();
GlobalHost.DependencyResolver.Register(
    typeof(IPerformanceCounterManager), 
    () =>dummyPerformanceCounterManager);

PerformanceCounterManagerを置き換えるクラスは次のとおりです

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;
}
0
John Stewien

問題を解決しました。私のテストサーバーまたは本番サーバーには、インストールされているVisualStudioのようなIDEがないため、同じエラーが発生しました。最後に、次の手順を実行しました。

VSがインストールされているサーバーで以下の手順に従ってください

  • VSの場合:[ツール]-> [NuGetパッケージマネージャー]-> [パッケージマネージャーコンソール]コマンドラインから、次のように入力します。

  • PM> Install-Package Microsoft.AspNet.SignalR.Utils

  • [パッケージ]-> [Microsoft.AspNet.SignalR.Utils.2.2.3-]-> [ツール]に移動します

  • Signalr.exeをコピーします

テストサーバーまたは本番サーバーで以下の手順に従ってください

  • Signr.exeをbin-> debugフォルダーに貼り付け、パスをコピーします
  • 管理者モードでコマンドプロンプトを開き、ディレクトリをコピーしたパスに変更します
  • コマンドを入力して実行しますsignalr.exe ipc

上記のコマンドを正常に実行した後、アプリケーションを起動しました。正常に動作しました。他の人がテスト環境で必要な場合は、これを投稿しました。

0
Vignesh Raagav