ASP-Vortragsreihe (9) Festlegen des Objektumfangs
Autor:Eve Cole
Aktualisierungszeit:2009-05-30 19:59:07
Der Umfang eines Objekts bestimmt, welche Skripte das Objekt verwenden können. Wenn Sie eine Objektinstanz erstellen, hat das Objekt standardmäßig einen Seitenbereich. Jeder Skriptbefehl innerhalb derselben ASP-Seite kann das seitenbezogene Objekt verwenden; das Objekt wird freigegeben, wenn die ASP-Seite an den Client zurückgesendet wird. Für die meisten Objekte ist der Seitenbereich der empfohlene Bereich. Sie können den Umfang eines Objekts ändern, sodass es von Skripten auf anderen Seiten verwendet werden kann. In diesem Thema wird erläutert, wie seitenbezogene Objekte verwendet und der Umfang eines Objekts geändert wird.
Verwenden von Seitenbereichsobjekten Mit Server.CreateObject auf einer ASP-Seite erstellte Objekte bleiben für die gesamte Lebensdauer der Seite bestehen. Auf das Objekt können alle Skriptbefehle für die Seite zugreifen und es wird freigegeben, wenn ASP die Verarbeitung der Seite abgeschlossen hat. Daher hat das Objekt den Umfang oder die Lebensdauer der Seite.
Achten Sie beim Programmieren mit Visual Basic oder VBScript darauf, das Objekt erst dann freizugeben, wenn ASP die Verarbeitung der Seite abgeschlossen hat. Beispielsweise wird die folgende Anweisung häufig verwendet, um ein Objekt freizugeben, indem der Objektvariablen der Wert Nothing zugewiesen wird:
Setze myObj = Nichts
Wenn Sie diese Anweisung in eine ASP-Seite einfügen, wird jeder Versuch, myObj zu verwenden, einen erwarteten Fehlercode zurückgeben. Aber intern behält ASP auch nach der Freigabe noch einen Verweis auf das Objekt bei. Wenn Sie ein Objekt nicht in einem Skript verwenden können, werden die Ressourcen des Objekts erst freigegeben, wenn ASP die Verarbeitung der Seite abgeschlossen hat. Wenn Sie das Objekt freigeben, indem Sie eine weitere Objektinstanz erstellen und diese einer bereits verwendeten Objektvariablen zuweisen, behält ASP ebenfalls einen Verweis auf die ursprüngliche Objektinstanz bei. Bei den meisten Skripten verursacht das Erstellen mehrerer Objekte möglicherweise keine Probleme. Wenn die Objekte jedoch gemeinsam genutzte Ressourcen wie Datenbankverbindungen verwenden, können Probleme auftreten.
Da Objekte einen Seitenbereich haben, sollten Sie sich nicht darauf verlassen, Objekte manuell freizugeben. Die folgende Schleife erstellt beispielsweise 1001 Verbindungsobjekte, die die meisten Verbindungen sogar zu einem großen SQL-Server öffnen können:
<%
Für I = 0 bis 1000
Setze Conn = Server.CreateObject("ADODB.Connection")
Conn.Open „Verbindungszeichenfolge“
Nächste
%>
Im Allgemeinen sollten Sie versuchen, das Erstellen von Objekten innerhalb einer Schleife zu vermeiden. Wenn dies unvermeidbar ist, sollten Sie die vom Objekt verwendeten Ressourcen manuell freigeben. Wenn das Connection-Objekt nur einmal erstellt wird und die physische Verbindung zur Datenressource in jeder Schleife geöffnet und geschlossen wird, funktioniert das obige Beispiel normal:
<%
Setze Conn = Server.CreateObject("ADODB.Connection")
Für I = 0 bis 1000
Conn.Open „Verbindungszeichenfolge“
Verbind.Schließen
Nächste
%>
Objekten Sitzungsbereich zuweisen In einer Anwendung wird für jede neue Sitzung ein Objekt mit Sitzungsbereich erstellt und nach Ende der Sitzung freigegeben. Daher gibt es für jede aktive Sitzung ein Objekt. Der Sitzungsbereich wird für Objekte verwendet, die von mehreren Skripts aufgerufen werden, sich aber nur auf eine Benutzersitzung auswirken. Sie können einem Objekt nur bei Bedarf einen Sitzungsbereich zuweisen. Wenn Sie den Sitzungsbereich verwenden müssen, müssen Sie das Threading-Modell der Komponente verstehen, die das Objekt bereitstellt, da es sich auf die Leistung und Sicherheitsumgebung des Objekts auswirkt. Weitere Informationen finden Sie unter „Erweiterte Informationen: Leistungsprobleme“ in diesem Thema.
Um einem Objekt einen Sitzungsbereich zuzuweisen, speichern Sie das Objekt im integrierten ASP-Sitzungsobjekt. Sie können entweder das Tag <OBJECT> in der Datei Global.asa verwenden oder die Methode Server.CreateObject auf der ASP-Seite verwenden, um eine Sitzung zu erstellen. Domänenobjektinstanz.
In der Datei Global.asa können Sie das Tag ;OBJECT> verwenden, das das RUNAT-Attribut (muss auf Sever gesetzt sein) und das SCOPE-Attribut (muss auf Session gesetzt sein) erweitert. Das folgende Beispiel erstellt eine sitzungsbezogene Instanz des Ad Rotator-Objekts:
<OBJECT RUNAT=Server SCOPE=Session ID=MyAd PROGID="MSWC.Adrotator">
</OBJECT>
Sobald Sie ein Objekt im Sitzungsobjekt gespeichert haben, können Sie von jeder Seite der Anwendung aus auf das Objekt zugreifen. Die folgende Anweisung verwendet die Objektinstanz, die durch das Tag <OBJECT> im vorherigen Beispiel erstellt wurde:
<%= MyAd.GetAdvertisement("addata.txt") %>
Auf einer ASP-Seite können Sie auch die Server.CreateObject-Methode verwenden, um Objekte im integrierten Session-Objekt zu speichern. Im folgenden Beispiel wird eine Instanz des Ad Rotator-Objekts im Session-Objekt gespeichert.
<% Set Session("MyAd") = Server.CreateObject("MSWC.Adrotator") %>
Um eine Anzeige anzuzeigen, sollten Sie zunächst eine Instanz des im Session-Objekt gespeicherten Ad Rotator-Objekts abrufen und dann eine Methode aufrufen, um das Objekt anzuzeigen:
<% Set MyAd = Session("MyAd") %>
<%= MyAd.GetAdvertisement("addata.txt") %>
ASP erstellt keine Instanz eines mit dem <OBJECT>-Tag deklarierten Objekts, bis es durch einen Skriptbefehl in einer ASP-Datei referenziert wird. Die Methode Server.CreateObject erstellt sofort eine Instanz des Objekts. Daher ist es für sitzungsbezogene Objekte besser, das Tag <OBJECT> als die Eigenschaft Server.CreateObject zu verwenden.
Geben Sie einem Objekt einen Anwendungsbereich
Ein Objekt im Anwendungsbereich ist eine einzelne Instanz eines Objekts, das beim Start der Anwendung erstellt wird. Dieses Objekt wird von allen Clientanfragen gemeinsam genutzt. Nur in seltenen Fällen müssen Sie einem Objekt einen Anwendungsbereich zuweisen. Einige Dienstobjekte, wie z. B. Zähler usw., erfordern möglicherweise einen Anwendungsbereich. Im Allgemeinen können Sie jedoch die im nächsten Abschnitt vorgeschlagenen Alternativen verwenden. Darüber hinaus wirkt sich das Threading-Modell auf die Leistung und die Objektsicherheitsumgebung aus (siehe „Erweiterte Informationen: Leistungsprobleme“ in diesem Thema).
Um einem Objekt einen Anwendungsbereich zuzuweisen und es im integrierten ASP-Anwendungsobjekt zu speichern, können Sie entweder das Tag <OBJECT> in der Datei Global.asa verwenden oder den Anwendungsbereich mithilfe der Server.CreateObject-Methode in der ASP-Seitenobjektinstanz erstellen .
In der Datei Global.asa können Sie das Tag ;OBJECT> verwenden, das das RUNAT-Attribut (muss auf Sever gesetzt sein) und das SCOPE-Attribut (muss auf Session gesetzt sein) erweitert. Auf ASP-Seiten können Sie Server.CreateObject verwenden, um Objektinstanzen im integrierten Anwendungsobjekt zu speichern. Ein Beispiel für die Verwendung des <OBJECT>-Tags und Server.CreateObject finden Sie im vorherigen Abschnitt „Einem Objekt Sitzungsbereich zuweisen“.
Alternativen zum Sitzungs- und Anwendungsbereich Geben Sie eine Objektsitzung oder einen Anwendungsbereich nur bei Bedarf an. Denn diese Objekte bleiben bis zum Ende der Sitzung oder Anwendung bestehen. Sie verbrauchen Ressourcen wie Speicher oder Datenbankverbindungen, die auf andere Weise nützlicher sein könnten. Darüber hinaus wirkt sich das Threading-Modell einer Komponente auf die Leistung der daraus erstellten Objekte aus, insbesondere derjenigen mit Sitzungs- oder Anwendungsbereich.
In vielen Fällen besteht ein besserer Ansatz als das Erstellen von anwendungs- oder sitzungsbezogenen Objekten darin, sitzungs- oder anwendungsbezogene Variablen zu verwenden, um Informationen an Objekte zu übergeben, die auf Seitenebene erstellt wurden. Weisen Sie dem ADO-Verbindungsobjekt beispielsweise keinen Sitzungs- oder Anwendungsbereich zu, da die von ihm erstellte Verbindung über einen längeren Zeitraum geöffnet bleibt, während das Skript keine ODBC-Verbindungsfreigabe mehr verwendet. Sie können die ODBC-Verbindungszeichenfolge jedoch im integrierten Sitzungs- oder Anwendungsobjekt speichern und die Zeichenfolge von der erstellten Verbindungsobjektinstanz auf der Webseite abrufen. Auf diese Weise können Sie häufig verwendete Informationen in einem Sitzungs- oder Anwendungs-Namespace speichern, aber nur bei Bedarf Objekte mit diesen Informationen erstellen.
Benutzerdefinierte JScript-Objekte Sie können Ihre eigenen JScript-Objekte erstellen, indem Sie einen Konstruktor definieren, der die Eigenschaften und Methoden des neuen Objekts erstellt und initialisiert. Wenn ein Skript den Konstruktor mit dem neuen Operator aufruft, wird eine Instanz des Objekts erstellt. Das ASP-Skript unterstützt benutzerdefinierte Objekte, die ordnungsgemäß funktionieren, wenn sie über einen Seitenbereich verfügen. Wenn einem benutzerdefinierten JScript-Objekt jedoch ein Anwendungs- oder Sitzungsbereich zugewiesen wird, kann dies Auswirkungen auf die Funktionalität des Objekts haben. Insbesondere wenn ein Objekt einen Sitzungs- oder Anwendungsbereich hat, können Skripts von anderen Seiten die Eigenschaften des Objekts abrufen, aber nicht seine Methoden aufrufen.
Erweiterte Informationen: Leistungsprobleme Das Threading-Modell der Komponente kann sich auf die Leistung der Website auswirken. Im Allgemeinen werden mit „Beide“ gekennzeichnete Objekte für die Verwendung in allen ASP-Skripten empfohlen, insbesondere in den Sitzungs- und Anwendungsobjekten. Single-Threaded-Objekte sind veraltet.
Da Sie möglicherweise nicht immer die Kontrolle über das Threading-Modell der von Ihnen verwendeten Objekte haben, können Ihnen die folgenden Richtlinien dabei helfen, eine optimale Leistung zu erzielen:
Seitenbereichsobjekt. Die beste Leistung erzielen Sie mit Objekten, die mit „Beide“ oder „Apartment“ gekennzeichnet sind.
Anwendungsbereichsobjekt. Im Allgemeinen sollten Sie es vermeiden, Objekte im Anwendungsobjekt zu platzieren. Wenn Sie Objekte im Anwendungsbereich verwenden müssen, erzielen Sie die beste Leistung mit einem mit beiden Tags versehenen Objekt in Kombination mit FreeThreadedMarshaler. Sie können entweder das Tag <OBJECT> oder die Methode Server.CreateObject verwenden, um Objekte mit den Tags Single, Free oder Both im Anwendungsobjekt zu speichern. Sie müssen das <OBJECT>-Tag mit Apartment-Thread-Objekten verwenden.
Sitzungsbereichsobjekt. Die beste Leistung erzielen Sie mit Objekten, die mit „Beide“ markiert sind. Die Verwendung von Single-Threaded- oder Apartment-Threaded-Objekten führt dazu, dass der Webserver die Sitzung auf einem Thread sperrt. Free-Thread-Objekte sperren die Sitzung nicht, werden aber nicht so schnell ausgeführt. Im Session-Objekt können Sie das Tag <OBJECT> oder die Methode Server.CreateObject zum Speichern von Objekten verwenden.
Wenn Sie die SDK-Dokumentation installiert haben, erhalten Sie detaillierte Informationen zum Threading-Modell und der damit verbundenen Komponentenleistung. (SDK-Dokumentation ist unter Windows 95 und höher nicht verfügbar.)