Frage

Ich habe einige ASP.NET Web-Services haben, die alle eine gemeinsame Hilfsklasse die sie benötigen nur eine Instanz von pro Server instanziiert . Es wird verwendet für die einfache Übersetzung von Daten, aber einige Zeit bei der Inbetriebnahme Laden Dingen aus der web.config-Datei usw. verbringt Die Hilfsklasse ist 100% Thread-sicher. Betrachten Sie es als eine einfache Bibliothek von Utility-Anrufe. Ich würde alle Methoden auf der Klasse geteilt machen, aber ich mag die anfängliche Konfiguration von web.config laden. Wir haben den Web-Service IIS bereitgestellt 6.0 und unter Verwendung eines Anwendungspools, mit einem Web-Garten 15 Arbeiter.

Ich erklärte die Hilfsklasse als Privat Geteilt Variable in Global.asax, und hat dieses Bild einen faulen Last Gemeinschafts-Readonly-Eigenschaft wie:

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

Ich habe Logging-Code im Konstruktor für MyHelperClass(), und es zeigt den Konstruktor für jede Anforderung ausgeführt wird, sogar auf dem gleichen Thread. Ich bin sicher, ich bin nur einiges wichtiges Detail von ASP.NET fehle aber MSDN ist nicht sehr hilfreich gewesen.

Ich habe ähnliche Dinge versuchte dabei sowohl Application("Helper") und Cache("Helper") mit und ich sah immer noch den Konstruktor läuft mit jeder Anforderung.

War es hilfreich?

Lösung

Es ist nicht ratsam, Anwendungszustand zu verwenden, wenn Sie unbedingt benötigen, sind die Dinge viel einfacher, wenn Sie pro Anforderung Objekte stehen zu verwenden. Jede Zugabe von Staat zu den Hilfsklassen könnte alle Arten von subtilen Fehlern führt. Verwenden Sie die HttpContext.Current Artikel Sammlung und intialise es pro Anfrage. Ein VB-Modul würde tun, was Sie wollen, aber Sie müssen nicht sicher sein, es Stateful zu machen.

Andere Tipps

Sie können Ihre Helfer im Application State platzieren. Tun Sie dies in global.asax:

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

Sie können die Helfer auf diese Weise verwenden:

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

Dies führt zu einer einzigen Instanz der MyHelperClass Klasse, die beim Start der Anwendung erstellt wird, und lebt in Anwendungszustand. Da die Instanz in Application_Start erstellt wird, dies nur einmal für jede Instanz Httpapplication geschieht und nicht pro Anfrage.

ich in meiner eigenen App in der Vergangenheit so etwas wie dies v getan und es verursachte alle Arten von seltsamen Fehlern. Jeder Benutzer wird in der Eigenschaft haben Zugriff auf Daten des alle anderen. Und Sie konnten mit einem Benutzer zu sein in der Mitte des Verwendens es am Ende und als immer abgeschnitten, weil sie von einem anderen Benutzer angefordert wird.

Nein, es nicht isoliert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top