2009-02-25 5 views
14

Situation: Klassische ASP-Anwendung, die einen benutzerdefinierten Anwendungspool verwendet. Standardeinstellungen.IIS7 - dient nur jeweils eine Seite gleichzeitig. Es macht mich verrückt!

Auf einige IIS7-Computer, IIS beschließt, nur eine Seite zu einer Zeit zu dienen. Wenn also mehrere Seiten von einer Site geladen werden, muss jede Seite nacheinander geladen werden.

z.B. Wenn ich http://foo.com/default.asp von einem Browser lade, und von einem anderen Rechner, den ich http://foo.com/differenturl.asp lade, muss der erste fertig sein, bevor der andere lädt. Es ist fast so, als wäre der w3p-Prozess single-threaded.

Hinweis: In den erweiterten Einstellungen für IIS gibt es eine Einstellung mit dem Namen MaxProcesses, die lautet "Legen Sie diese auf größer als 1 fest, um einen Webgarten zu erstellen" (was auch immer das ist). Dies löst das Problem NICHT, da dies mehrere Prozesse mit ihrem eigenen Sitzungsstatus usw. hervorbringt, und wenn Sie http://foo.com/default.asp laden, gibt es keine Möglichkeit zu garantieren, dass Sie demselben Prozess zugewiesen werden.

Das Problem offenbarte sich, weil wir eine Diagnoseseite haben, die in ASP geschrieben wird, und ActiveX-Steuerelement erstellt, das eine URL auf der Website lädt und die Ergebnisse zurückgibt.

Also, diagnostics.asp lädt und im Code auf der Serverseite erstellt es ein kleines Web-Steuerelement, das auf dem gleichen Server lädt (denke XMLHTTP-Steuerelement) default.asp.

Diese Seite wird NIEMALS fertig geladen, da der Server darauf wartet, dass die Seite diagnostics.ASP beendet wird, bevor sie die Seite default.asp bedient. Sackgasse!

Dies funktioniert gut auf jedem IIS6-Computer da draußen, und ich glaube, es gibt einige IIS7-Server, wo es auch funktioniert.

Ich habe festgestellt, es ist auch kein Ergebnis unserer skurrilen Diagnose. Das Laden mehrerer Registerkarten von einem Computer oder sogar von separaten Computern zeigt an, dass der Webprozess sie einzeln verarbeitet.


Richtige Antwort von AnthonyWJones: Server-Side-Debugging wurde in IIS7 eingeschaltet. Dies versetzt IIS in den Single-Thread-Modus.

+0

crosspostete hier http://forums.iis.net/p/1155632/1894991.aspx#1894991 –

+0

Könnten Sie schreiben, welcher Teil der ausgewählten Antwort geholfen? Was war der Grund für das Problem? –

+0

werde ich wenn ich es herausfinden. Ich weiß es noch nicht, da ich meine Maschine, nur einen Kunden (und er ist im Urlaub) nicht reprosieren kann. –

Antwort

28

Klicken Sie im IIS-Manager auf die Anwendung in der Struktur.

Doppelklicken Sie auf ASP im Abschnitt IIS.

erweitern "Debugging-Eigenschaften"

Stellen Sie sicher, beide "Client-Seite Debugging Enable" und werden auf false "Server-Side-Debugging aktivieren".

Wenn das Debugging aktiviert ist, ist ASP auf die Verarbeitung einer einzelnen Anfrage auf einmal beschränkt.

+0

Klingt plausibel. – splattne

+0

Ich habe die Abstimmung festgelegt. Ich kann die angenommene Antwort nicht beheben, weil ich nicht überprüfen konnte, wann das Kopfgeld abgelaufen ist :( –

+0

@Michael: Danke für die Anerkennung der Stimmen sind in Ordnung. Ich erkenne, dass Menschen wie du ein Leben haben und daher bessere Dinge zu tun haben Behalte den Überblick, was auf SO die ganze Zeit passiert, wie einige von uns AnthonyWJones

0

IIS7 ist höchstwahrscheinlich multi-threaded, also würde ich vermuten, dass es ein Problem mit Ihrer App gibt.

Sie erwähnten ActiveX, um eine Seite von demselben Server zu laden - vielleicht ist dieses ActiveX nicht frei threaded und dies führt dazu, dass jede Seite, die es verwendet, einzelne Instanzen ausführt?

BTW: Web Garten - derselbe Server mehr Prozesse useing - das asp.net ist so konfiguriert, verwendet mehr als 1 Worker-Thread mehr Web-Server

+1

Problem ist immer noch da, wenn Sie zwei Asp-Seiten mit Schleifen in ihnen machen (so dass sie für eine Weile ausgeführt werden). IIS7 wird die zweite Seite erst anzeigen, wenn die erste Seite fertig ist. Es ist also kein Problem mit der App. –

+0

Das beseitigt nicht, dass es ein Problem mit der App ist, es ist eher ein Problem mit der App. Haben Sie versucht, zwei URLs gleichzeitig zu treffen? – cjk

0

Stellen Sie sicher - inprocess Sitzung Web Farm nicht verwenden kann. This msdn article erläutert, wie diese Konfigurationsoption festgelegt wird.

+0

Gilt nicht für ASP. –

4

Zuerst: Stellen Sie sicher, dass Sie dies mit mehreren Clients testen. Ein einzelner Computer führt nur zwei HTTP-Anfragen gleichzeitig auf demselben Server aus (IP-Adresse). (Dies ist eine RFC-Spezifikation.)

Wenn das Ihr Problem nicht löst, werfen Sie einen Blick in IIS7 -> ASP -> Dienste -> COM Plus Eigenschaften -> Ausführen in MTA. Versuchen Sie, diese Einstellung auf "True" zu setzen.

Hoffe, das hilft.

+1

Ein einzelner Client, kein einzelner Computer. Auch einige Kunden ignorieren dies völlig. – FlySwat

+1

Die Eigenschaft asp/comPlus/executeInMTA in IIS7 ist dieselbe wie AspExecuteInMTA in IIS6. Es ist standardmäßig 0. Wenn es in IIS6 nicht auf 1 gesetzt wurde, wird es wahrscheinlich in 7 nicht helfen. Wie auch immer, sollte man mit dieser Einstellung vorsichtig sein, wie einige COM-Objekte in Multi-Threaded-Umgebung fehlverhalten können. –

+0

Es stimmt, dass einige COM + -Komponenten Fehlverhalten aufweisen können, wenn sie nicht für eine Multithread-Umgebung entwickelt wurden. Trotzdem kann es sein, dass Ihre ASP-Seiten einfach auf dieses Problem "hängen", so dass es nicht schaden könnte, es zu versuchen. –

2

Sind Sie sicher, dass Sie keine Abhängigkeit in Ihrem Code haben, die den Deadlock verursacht. Ich habe das schon mal gesehen, wo Logging, SQL-Verbindungen usw. eine Abhängigkeit erzeugen. Verwenden Sie perfmon und überprüfen Sie die Lese-/Schreibwarteschlange der Festplatte, die Lese-/Schreibwarteschlange des Speichers, um festzustellen, ob die Daten gesichert werden.

Ich würde sehr empfehlen Tess Ferrandez's (ASP.NET Escalation Engineer - Microsoft) Blog für viele Einblicke und Wege, um herauszufinden, was passiert. Tess hat mehr über dieses Zeug vergessen als die meisten Leute jemals wissen werden.

Ich denke, Ihr Problem ist nicht IIS, sondern etwas in Ihrer App, wahrscheinlich in Ihrer ActiveX-Komponente. Stellen Sie sicher, dass Sie nach Ihrer ActiveX-Komponente bereinigen. Hier ist ein Stück Code, den ich benutze, um nach der Verwendung von Excel (Another Com-Komponente) zu bereinigen. Remember Com wird nicht verwaltet.

Private Sub ShutDownExcel() 
    If objExcel IsNot Nothing Then 
     objExcel.DisplayAlerts = True 
     objExcel.Quit() 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel) 
     objExcel = Nothing 
    End If 

    ' Clean up memory so Excel can shut down. 
    GC.Collect() 
    GC.WaitForPendingFinalizers() 

    ' The GC needs to be called twice in order to get the 
    ' Finalizers called - the first time in, it simply makes 
    ' a list of what is to be finalized, the second time in, 
    ' it actually the finalizing. Only then will the 
    ' object do its automatic ReleaseComObject. 
    GC.Collect() 
    GC.WaitForPendingFinalizers() 
End Sub 

Hoffe, das hilft.

0

Haben Sie "Verwalteter Pipelinemodus" im Anwendungspool auf "Klassisch" geändert (Standard ist "Integriert")? Wenn nicht, versuche es mit classic.

Ich weiß nicht, ob es in irgendeiner Weise helfen würde. Ich habe schon lange aufgehört zu kämpfen, um klassische ASP-Apps für die Arbeit mit IIS7 zu bekommen. (Nicht, dass ich sagen kann, die Apps sind wirklich nett und korrekt, aber sie funktionierten in früheren Versionen.)

Und versuchen Sie, Pufferung für Testseiten auszuschalten und sie in jeder Iteration etwas auszuspucken. Pufferung (und Zwischenspeicherung) möglicherweise in IIS7 geändert. Vielleicht werden sie schließlich gleichzeitig verarbeitet und die Puffer sind einfach zu groß, um den Unterschied zu erkennen.

Das ist alles, was mir gerade in den Sinn kommt.


Ich nehme an, Sie testen mit sehr einfachen Fall. Ihre App verwendet keine merkwürdigen Objekte, die beiden Anforderungen gemeinsam sind (weder Testseiten noch global.asa) und muss daher gesperrt werden.

+0

Ich habe versucht, die integrierte/klassische Einstellung. Kein Würfel auf diesem. –

0

Nur ein Gedanke, aber wenn Sie auf die Website in IIS gehen, klicken Sie auf die Grenzen ... Link auf der linken Seite, wo sind die Verbindungslimits festgelegt? Dort gibt es sowohl eine maximale Bandbreite als auch maximale gleichzeitige Verbindungsoptionen.

Ich würde auch in den App Pool gehen und Erweiterte Einstellungen ... klicken und überprüfen Sie die CPU und Speicher Grenzen. Möglicherweise sogar erstellen einen neuen App-Pool von Grund auf mit No Managed Code ausgewählt, um es zu beseitigen.

0

Wenn es kein Problem mit den Debug-Einstellungen ist, habe ich festgestellt, dass Sie ähnliche Verhalten bei der Verwendung von Sitzungsvariablen in ASP in IIS 8 auftreten können.

Ich weiß nicht, dass dies IIS 8 spezifisch ist, aber "ASP garantiert, dass nur eine Anfrage von einer Sitzung jederzeit ausgeführt wird." http://msdn.microsoft.com/en-us/library/ms972335.aspx

Verwandte Themen