2010-04-11 15 views

Antwort

4

Es ist nicht kristallklar ich so weit von der MSDN-Dokumentation, aber ich fand ein forum post from someone who claims to know the answer. Es klingt wie Sie sollten Bad stuff mit Ihrer Implementierung nicht passieren, aber Sie sollten wissen, dass foo 's Status nicht unbedingt für alle Ergebnisse geteilt werden, da Ihre HttpModule einmal pro HttpApplication, dass IIS zu halten erstellt wird in seinem Pool.

+0

Ja, es verwendet die Instanz unter vielen verschiedenen Anforderungen erneut. Aber die Frage ist, ob die Instanz zwischen verschiedenen Threads wiederverwendet wird. –

+1

Von dem, was ich sagen kann: Ja, aber nicht gleichzeitig. Eine HttpApplication scheint einer bestimmten Anforderung für die Dauer dieser Anforderung zugewiesen zu sein. – sblom

+0

Ok, danke. Ich werde warten, bis jemand weiß, wie genau das bestätigt, da ich diesen Code in der Produktionsumgebung verwenden werde, und ich werde schwer zu debuggen sein. –

1

Vor kurzem fand ich einen Artikel, der etwas über diese Frage berührt: http://www.dominicpettifer.co.uk/Blog/41/ihttpmodule-gotchas---the-init---method-can-get-called-multiple-times

Es spielt keine Fäden erwähnen, aber sagt nur, dass der Arbeitsprozess wird

instantiate so viele Objekte wie Httpapplication es denkt, dass es braucht, dann wird es Pool für Leistung Gründe, wiederverwende Instanzen als neue Anfragen kommen vor dem Senden sie zurück in den Pool.

den Code in dem folgenden Link können Sie sicher sein, dass Ihr init-Code einmal in einer Thread-sichere Art und Weise ausgeführt wird:

private static bool HasAppStarted = false; 
private readonly static object _syncObject = new object(); 

public void Init(HttpApplication context) 
{ 
    if (!HasAppStarted) 
    { 
     lock (_syncObject) 
     { 
      if (!HasAppStarted) 
      { 
       // Run application StartUp code here 

       HasAppStarted = true; 
      } 
     } 
    } 
} 

einen Test-App einzurichten Ich habe Sinn um das zu tun und es zu testen, nur um zu sehen, ob es wahr ist, aber ich hatte keine Zeit.

+0

Vielen Dank für Ihre Antwort. Dies überprüft, ob es jetzt geteilt wird. Ich muss es genau wissen, da ich, wie oben erwähnt, das in der Produktionsumgebung verwenden werde und es sehr schmerzhaft sein wird, wenn es geändert wird, zum Beispiel während einer Aktualisierung von .NET Framework oder IIS. –

1

Der Artikel von Jim ist interessant, aber wie Jim sagt, es nichts über Thread-Sicherheit erwähnt.

Ich denke, Sie würden nur den Sperrmechanismus benötigen, wenn Sie statische Member initialisieren oder "nur einmal" Initialisierungen durchführen, d. H. Eine statische Ressource initialisieren.

Ich konnte weder aus MSDN noch aus dem von Jim erwähnten Artikel schließen, dass wir den Sperrmechanismus benötigen, wenn wir nicht statische Klassenvariablen initialisieren.

1

Ich wollte hier meine Erkenntnisse zu dieser Frage mit Bezug zu bieten, wie ich in IIS6 beobachtet haben:

Ich habe mit dieser Frage ausführlich in IIS6 tun und haben einige interessante Ergebnisse unter Verwendung von log4net und Reflexion erfassen Ausführungshistorie gefunden . Was ich gefunden habe ist, dass hinter den Kulissen ein umfangreiches "Thread Management" stattfindet. Es scheint, dass es eine "primäre" Reihe von Threads gibt, die 1: 1 bis HttpApplication entspricht. Diese Threads behandeln jedoch nicht ausschließlich die Pipeline für Ihre Anfrage. Verschiedene verschiedene Sub-Threads können aufgerufen werden, wenn auf diese Instanzen zugegriffen wird. Nachfolgende neue Anforderungen und Ressourcenanforderungen, die von Ihrer Anwendung verwendet werden, scheinen einige persistente Informationen bezüglich Ihrer ursprünglichen Anforderung zu teilen, werden jedoch niemals vollständig vom anfänglichen Thread behandelt, der eine Art von Beziehung angibt. Ich konnte kein konkretes Muster (außer dem, was ich zuvor beschrieben habe) erkennen, welche Elemente an andere Threads verteilt wurden, da sie scheinbar zufällig waren. Meine Schlussfolgerung zu diesem Beweis ist, dass es ein Konzept für hierarchisches Pooling gibt? Wenn eine unbekannte Teilmenge von Referenzelementen in den untergeordneten Threads über die übergeordnete Referenz geerbt wird.

Also als Antwort würde ich sagen, dass HttpModules zwischen Threads geteilt sind. In Bezug auf das Sperren von Instanzwerten wäre dies anwendbar, wenn die Werte für alle Anforderungen gelten, die das Modul verwenden und einen bestimmten Zustand beibehalten müssen. Ich könnte sehen, dass dies nützlich ist, wenn versucht wird, statusbehaftete Instanzwerte beizubehalten, die teuer zu ermitteln sind, so dass sie in nachfolgenden Anforderungen wiederverwendet werden können.

Dieses Problem beunruhigte mich seit einiger Zeit hoffentlich hilft diese Info jemandem.

Verwandte Themen