web-dev-qa-db-fra.com

Le compteur de performance demandé n'est pas un compteur personnalisé, il doit être initialisé avec ReadOnly. "On RouteTable.Routes.MapHubs ();

Je travaille avec la version 1.1.2 de SignalR et Windsor Castle dans une application AspNet MVC 4. Mon problème est que ce message d'erreur s'affiche depuis que je suis passé à la nouvelle version de SignalR.

"The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnly."

dans la ligne 

    RouteTable.Routes.MapHubs();

Ceci est la classe 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();
    }
}

J'ai déjà essayé quelques choses que j'ai trouvées sur internet comme: 

lodctr /R
cd C:\Windows\Inf\.NETFramework
lodctr corperfmonsymbols.ini

Mais je reçois toujours le même message d'erreur. Des idées? 

J'utilise dotnet framework 4.5.

C'est le stacktrace

at System.Diagnostics.PerformanceCounter.InitializeImpl()

Merci!

UPDATE J'ajoute les captures d'écran demandées par Drew. enter image description here

enter image description here

enter image description here

17
polonskyg

Donc, selon les informations que vous avez fournies, il est clair que ce sont des exceptions de la première chance qui sont levées lorsque SignalR tente de créer les compteurs de performance mais ne dispose pas des droits pour le faire avec l'identité sous laquelle le processus est exécuté. Vous pouvez ignorer ces exceptions en toute sécurité, mais vous n'obtiendrez évidemment pas de données de compteur de performance.

Si vous souhaitez créer les compteurs de performance, vous devez vous assurer que l'identité de votre application appartient au groupe Utilisateurs du compteur de performances lors de son exécution. Vous devez utiliser l’utilitaire fourni dans le package package NuGet Microsoft ASP.NET SignalR Utilities qui vous permet de créer les compteurs hors bande. Installez simplement le paquet et lancez la commande:

signalr ipc
24
Drew Marsh

La réponse de Drew Marsh , a résolu le problème pour moi aussi. Voici d'autres détails décrivant la marche à suivre pour exécuter la commande signalr:


Utilisez le gestionnaire de paquets pour installer SignalR Utils:

  1. Dans VS: Outils -> Gestionnaire de packages de bibliothèque -> Console du gestionnaire de packages
  2. A partir de la ligne de commande, tapez:

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

  3. En exécutant le IDE en tant qu'administrateur, exécutez: 

    PM> signalr ipc

Des autorisations d'administrateur sont nécessaires pour exécuter la commande d'installation des compteurs de performance (signalr ipc). Si vous ne le faites pas, le résultat de l'erreur est le suivant: 

Erreur: System.Security.SecurityException: L'accès au registre demandé N'est pas autorisé. Sous Microsoft.Win32.RegistryKey.OpenSubKey (Nom de chaîne, Boolean accessible en écriture) Sous System.Diagnostics. PerformanceCounterLib.CreateRegistryEntry (String CategoryName, PerformanceCounterCategoryType categoryType, CounterCreationDataCollec Création creation, Boolean & iniRegistered) À System.Diagnostics.PerformanceCounterLib. ____.] Nom, PerformanceCounterCategoryType categoryType, Catégorie de chaîneHelp, Compteur CreationDataCollection creationData) À System.Diagnostics.PerformanceCounterCategory.Create (String categoryName, String, Aide, PerformanceCounterCategoryype description. ____.] CounterCreationDataCollection counterData) À l'adresse Microsoft.AspNet.SignalR.Utils.PerformanceCounterInstaller.InstallCounters ()

   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

Veuillez noter que si vous suivez les conseils (corrects) mentionnés ci-dessus et appelez 'signalr ipc' pour installer les compteurs personnalisés de SignalR, votre application risque de cesser de fonctionner de façon inexplicable lors de l'exécution avec le débogueur. le CLR traite de CultureInfo lors de l'initialisation. Le problème existe au moins dans SignalR 2.2.0. L’explication complète, ainsi que deux solutions de contournement, sont décrites ici: https://github.com/SignalR/SignalR/issues/3414

3
Steve Faiwiszewski

Voici une solution pour les développeurs qui ne peuvent pas fonctionner avec des droits d'administrateur. Créez la classe ci-dessous et ajoutez-la à DependencyResolver comme ceci:

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

Voici la classe qui remplace 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

Résolu le problème. Dans mon serveur de test ou de production, je n'ai pas le IDE comme Visual Studio qui y est installé. Alors que je suis resté avec la même erreur. Enfin, j'ai simplement fait les étapes suivantes:

Veuillez suivre les étapes ci-dessous sur le serveur sur lequel VS est installé.

  • Dans VS: Outils -> Gestionnaire de packages NuGet -> Console du gestionnaire de packages À partir de la ligne de commande, tapez:

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

  • Allez dans Packages -> Microsoft.AspNet.SignalR.Utils.2.2.3 -> Outils 

  • Copier signalr.exe

Veuillez suivre les étapes ci-dessous dans le serveur de test ou de production

  • Collez signalr.exe sous bin -> dossier de débogage et copiez le chemin
  • Ouvrez l'invite de commande en mode Administrateur et changez le répertoire sur le chemin copié.
  • Tapez et exécutez la commande signalr.exe ipc

Après avoir exécuté la commande ci-dessus avec succès, j'ai lancé l'application, cela a bien fonctionné. Je viens de poster ceci pour les autres s'ils en ont besoin dans l'environnement de test.

0
Vignesh Raagav