Question

J'ai des services Web ASP.NET qui partagent tous une classe d'assistance commune dont ils n'ont besoin que pour instancier une instance de par serveur . Il est utilisé pour la traduction simple des données, mais passe du temps au démarrage à charger des éléments à partir du fichier web.config, etc. La classe d'assistance est 100% thread-safe. Pensez-y comme une simple bibliothèque d'appels utilitaires. Je partagerais toutes les méthodes de la classe, mais je voudrais charger la configuration initiale à partir de web.config. Nous avons déployé les services Web sur IIS 6.0 et en utilisant un pool d'applications, avec un jardin Web de 15 ouvriers.

J'ai déclaré la classe d'assistance en tant que variable partagée privée dans Global.asax et ajouté une propriété Shared ReadOnly de chargement différé, comme suit:

Private Shared _helper As MyHelperClass

Public Shared ReadOnly Property Helper() As MyHelperClass
    Get
        If _helper Is Nothing Then
            _helper = New MyHelperClass()
        End If
        Return _helper
    End Get
End Property

J'ai le code de journalisation dans le constructeur pour MyHelperClass () , et le constructeur en cours d'exécution pour chaque demande, même sur le même thread. Je suis sûr que certains détails clés d’ASP.NET sont manquants, mais MSDN n’a pas été très utile.

J'ai essayé de faire la même chose en utilisant Application ("Helper") et Cache ("Helper") et j'ai toujours vu le constructeur fonctionner avec chaque demande.

Était-ce utile?

La solution

Il n'est pas sage d'utiliser l'état de l'application à moins que vous n'en ayez absolument besoin, les choses sont beaucoup plus simples si vous vous en tenez à utiliser des objets à la demande. Tout ajout d'état aux classes auxiliaires pourrait provoquer toutes sortes d'erreurs subtiles. Utilisez la collection d'éléments HttpContext.Current et intégrez-la par requête. Un module VB ferait ce que vous voulez, mais vous devez être sûr de ne pas le rendre dynamique.

Autres conseils

Vous pouvez placer votre assistant dans l'état de l'application. Faites ceci dans global.asax:

  void Application_Start(object sender, EventArgs e)
  {
    Application.Add("MyHelper", new MyHelperClass());
  }

Vous pouvez utiliser Helper de cette façon:

  MyHelperClass helper = (MyHelperClass)HttpContext.Current.Application["MyHelper"];
  helper.Foo();

Il en résulte une seule instance de la classe MyHelperClass créée au démarrage de l'application et conservant son état. Etant donné que l’instance est créée dans Application_Start, cela ne se produit qu’une fois pour chaque instance HttpApplication et non par demande.

J’ai déjà fait quelque chose comme ça dans ma propre application et cela a causé toutes sortes d’erreurs étranges. Chaque utilisateur aura accès aux données de tous les autres utilisateurs. De plus, vous pourriez vous retrouver avec un utilisateur en train de l’utiliser et d’être coupé parce qu’il est demandé par un autre utilisateur.

Non, pas isolé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top