ASP 301 Redirect Beispiel (VBScript)

<%@ Language=VBScript %>
< %
Response.Status=“301 Moved Permanently“
Response.AddHeader „Location“, „http://www.neuedomain.com/neuerordner/neueseite.asp“
Response.end
%>

ASP .NET 301 Redirect Beispiel (C#)

<script runat=“server“>
private void Page_Load(object sender, System.EventArgs e)
{
Response.Status = „301 Moved Permanently“;
Response.AddHeader(„Location“,“http://www.neue-url.com/“);
}
< /script>

Plesk: Wichtige Befehle für das Commandline Tool %plesk_bin%

Rekonfigurieren einer Domain

Standardpfad zur Pleskinstallation

%plesk_bin%

C:\Program Files (x86)\Parallels\Plesk\admin\bin

 

CMD:

%plesk_bin%“\websrvmng.exe –remove-vhost –vhost-name=testdomain.com

%plesk_bin%“\websrvmng.exe –reconfigure-vhost –vhost-name=testdomain.com

%plesk_bin%“\websrvmng.exe –reconfigure-all

Zum Reconfigurien der FTP Zugänge

%plesk_bin%“\ftpmng.exe –remove-vhost –vhost-name=yourdomain.com
%plesk_bin%“\ftpmng.exe –reconfigure-vhost –vhost-name=yourdomain.com

Für alle Domains

„%plesk_bin%“\ftpmng.exe –remove-all
„%plesk_bin%“\ftpmng.exe –reconfigure-all

Komplette Reference

–help

–features

–status
–start
–stop
–restart

–install
–uninstall

–reconfigure-all
–remove-all

–add-ip-address –ip-address=<ip_address>
–remove-ip-address –ip-address=<ip_address>
–change-ip-address  –old-ip-address=<ip_address> –new-ip-address=<ip_address>

–set-certificate –ip-address=<ip>

–add-domain –domain-name=<domain>
–remove-domain  –domain-name=<domain>

–set-default-domain –ip-address=<ip> –vhost-name=<domain>
–reset-default-domain –ip-address=<ip>

–add-alias  –domain-name=<domain> –alias-name=<alias> [–web] [–mail]
–remove-alias  –domain-name=<domain> –alias-name=<alias> [–web] [–mail]
–rename-alias  –domain-name=<domain> –old-alias-name=<alias> –new-alias-name [–web] [–mail]
–change-alias-type –domain-name=<domain> –alias-name=<alias>
[–old-web] [–old-mail]
[–new-web] [–new-mail]

–install-vhost –vhost-name=<domain>
–reconfigure-vhost –vhost-name=<domain> [–config=<xml>]
–reconfigure-vhosts –vhost-names=<dom1[;dom2;…]>
–remove-vhost –vhost-name=<domain>
–rename-vhost –old-name=<old_domain> –new-name=<new_domain>
–start-vhost –vhost-name=<domain>
–stop-vhost  –vhost-name=<domain>
–set-vhost-mime-types –vhost-name=<domain> –mime-types=<ext=type;…>
–get-vhost-mime-types –vhost-name=<domain>
–get-vhost-log-dir –vhost-name=<domain>
–get-vhost-default-doc –vhost-name=<domain>
–get-vhost-performance –vhost-name=<domain>
–set-vhost-performance –vhost-name=<domain> –bandwidth=<bandwidth> –max-connections=<max_connections>

–add-subdomain –vhost-name=<domain> –subdomain=<subdomain>
–update-subdomain –vhost-name=<domain> –subdomain=<subdomain> [–config=<xml>]
–remove-subdomains –vhost-name=<domain> [–subdomains=<sub1[;sub2;…]>]
–rename-subdomain –vhost-name=<domain> –old-name=<old_sub> –new-name=<new_sub>
–start-subdomain –vhost-name=<domain> –subdomain=<subdomain>
–stop-subdomain –vhost-name=<domain> –subdomain=<subdomain>
–get-subdomain-performance –vhost-name=<domain> –subdomain=<subdomain>
–set-subdomain-performance –vhost-name=<domain> –subdomain=<subdomain>
–bandwidth=<bandwidth> –max-connections=<max_connections>

–add-web-user  –vhost-name=<domain> –web-user=<user> [–no-default-pages]
–update-web-user –vhost-name=<domain> –web-user=<user>
–update-web-users –vhost-name=<domain>
–remove-web-users  –vhost-name=<domain> [–web-users=<user1[;user2;…]>]

–add-fp-user –vhost-name=<domain> –fp-user=<user>
–rename-fp-user  –vhost-name=<domain> –old-user=<user> –new-user=<user>
–remove-fp-user –vhost-name=<domain> –fp-user=<user>]
–update-fp-mail-settings  –domain-name=<domain>
–update-fp-settings –domain-name=<domain> [–subdomain=<sub>]

–list-wellknown-content-types
–get-mime-types –vhost-name=<vhost> [–vdir-name=<vdir>]
–set-mime-types –vhost-name=<vhost> –mime-types=<ext=type;…> [–vdir-name=<vdir>]
–set-global-mime-type –extension=<ext> –type=<type>

–get-error-docs –vhost-name=<vhost> [–vdir-name=<vdir>]
–set-error-docs –vhost-name=<vhost> –error-docs=<xml> [–vdir-name=<vdir>]

–exists-vdir –vhost-name=<vhost> [–vdir-name=<vdir>]
–get-vdir –vhost-name=<vhost> [–vdir-name=<vdir>]
–add-vdir –vhost-name=<vhost> –vdir-config=<xml> [–parent-vdir=<vdir>]
–update-vdir –vhost-name=<vhost> –vdir-config=<xml> [–parent-vdir=<vdir>]
–remove-vdir –vhost-name=<vhost> –vdir-name=<vdir>
–rename-vdir –vhost-name=<vhost> –old-name=<old_vdir> –new-name=<new_vdir>
–get-vdir-subtree –vhost-name=<vhost> [–vdir-name=<vdir>]

–list-wdirs  –vhost-name=<vhost> [–wdir-name=<wdir>]
–remove-wdir –vhost-name=<vhost> –wdir-name=<wdir>
–rename-wdir –vhost-name=<vhost> –old-name=<old_wdir> –new-name=<new_wdir>

–add-extension  –file=<file> –description=<description> [–group=<group>]
–remove-extension  –file=<file>
–allow-extension –file=<file>
–prohibit-extension –file=<file>

–add-protection –vhost-name=<domain> –directory=<dir> [–subdomain=sub]
–update-protection –vhost-name=<domain> –directory=<dir> [–subdomain=sub]
–remove-protections  –vhost-name=<domain> [–directories=<dir1[;dir2;…]>] [–subdomain=sub]

–change-admin-email –email=<admin_email>

–reconfigure-webmail [–webmail=<type>]
–update-webmail-link –domain-name=<domain>

–reconfigure-sqladmin
–update-sqladmin-link –domain-name=<domain>

–reconfigure-sitebuilder
–update-sitebuilder-link –domain-name=<domain>

–update-anon-password –domain-name=<domain>
–update-anon-passwords-all

–get-scripts –vhost-name=<vhost> –app-name=<vdir>
–set-scripts –vhost-name=<vhost> –app-name=<vdir> –scripts=<xml>

–remove-sites-cache

–update-www-prefix –domain-name=<domain> [–subdomain=<sub>]

–set-aspmaxbody –vhost-name=<vhost> –vdir-name=<vdir> [–value=<value of AspMaxRequestEntityAllowed IIS property>]
–set-aspmaxbuffer  –vhost-name=<vhost> –vdir-name=<vdir> [–value=<value of AspBufferingLimit IIS property>]
–get-aspmaxbody –vhost-name=<vhost> –vdir-name=<vdir>
–get-aspmaxbuffer –vhost-name=<vhost> –vdir-name=<vdir>

–set-aspenableserverdebug –vhost-name=<vhost> –vdir-name=<vdir> [–value=<true|false>]
–set-aspenableclientdebug  –vhost-name=<vhost> –vdir-name=<vdir> [–value=<true|false>]
–get-aspenableserverdebug –vhost-name=<vhost> –vdir-name=<vdir>
–get-aspenableclientdebug –vhost-name=<vhost> –vdir-name=<vdir>

debug = false

Warum sollte man bei ASP.net Applikationen debug = false setzen.

Neben Leistungseinbußen gibt es auch andere Probleme bei Produktivservern.

Generell sollte gelten: Wenn eine Website / Applikation produktiv ist, sollte immer der Debug Schalter auf false gesetzt sein.

Den Debug Schalter kann man entweder in der web.config oder direkt als Page Direktive setzen.

web.config-Datei der Anwendung

<compilation debug=“false“ strict=“false“ explicit=“true“ targetFramework=“4.5.1″>

Page Direktive

<%@ Page Debug=“false“ Language=“VB“ AutoEventWireup=“false“ CodeFile=“default.aspx.vb“ MasterPageFile=“~/spaghetticms.master“ Inherits=“_Default“ %>

1) Wenn man debug = true verwendet, werden viel mehr Dateien im temporären ASP.NET Dateiordner erzeugt.

2) Wenn man debug = true verwendet, werden die Webseiten keinen Timeout erzeugen.

3) Wenn man debug = true verwendet, wird die Batch Kompilierung deaktiviert, auch wenn das Batch-Attribut <compilation> auf true gesetzt ist.

4) Das System.Diagnostics.DebuggableAttribute wird zum generierten Code hinzugefügt, welches zu einem massiven Leistungsabfall führen kann. Bei debug = true wird generell das Debuggable zum generierten Code hinzugefügt.

5) Alle Client-JavaScript-Bibliotheken und statischen Bildern, die über WebResources.axd eingesetzt werden, werden bei jedem Seitenaufruf heruntergeladen und nicht lokal im Browser zwischengespeichert. Dies kann sich die Geschwindigkeit auswirken, z.B. wenn Sie Atlas einsetzen oder Steuerelemente wie TreeView / Menü / Validatoren. Beachten Sie, dass der Grund, warum diese Mittel nicht im Cache gespeichert werden, debug = true ist. Bei debug= true wird der Browser Cache ständig geleert.

6) Wenn <compilation debug = „false“ /> gesetzt ist, wird demWebResource.axd Handler automatisch Cache-Regeln hinzugefügt, sodass die Ressource nur einmal vom Client heruntergeladen und dort im Cache gespeichert wird (es wird auch auf alle Proxyservern zwischengespeichert werden). Wenn Sie Atlas für Ihre Anwendung installiert haben, wird es auch automatisch den Inhalt von der WebResources.axd Handler komprimieren. Zusätzlich wird die Größe der JavaScript-Bibliotheken und statischen Ressourcen verkleinert.

7) Wenn das Attribut debug auf true gesetzt ist, werden die Symbolinformationsdateien (PDB-Daten) jedes Mal, wenn der Compiler die ASPX-Seiten kompiliert, neu erzeugt.

Wird während einer Unterbrechung der Debugger angefügt, können keine weiteren Anfragen an die Seite bearbeitet werden. Die Seite ist dann nicht mehr aufrufbar.

Bitte beachten Sie auch: http: //support.microsoft.com/kb/301058

Bootstrap Templates

Bootstrap ist ein beliebtes CSS Framework.

Kostenlose Templates findet man auf: Bootstrap Template (http://startbootstrap.com)

 

 

ASP Tipp 1: Zwischenspeichern Sie häufig verwendete Daten auf dem Webserver

Eine typische ASP-Seite ruft Daten aus einem Back-End-Datenspeicher ab und zeichnet die Ergebnisse dann in HTML (Hypertext Markup Language). Unabhängig von der Geschwindigkeit Ihrer Datenbank ist das Abrufen von Daten aus dem Speicher wesentlich schneller als aus dem Back-End-Datenspeicher. Das Lesen der Daten von einer lokalen Festplatte ist normalerweise ebenfalls schneller als das Abrufen aus einer Datenbank. Aus diesem Grund können Sie die Leistung in der Regel verbessern, indem Sie die Daten auf dem Webserver, entweder im Arbeitsspeicher oder auf der Festplatte, zwischenspeichern.

Beim Zwischenspeichern handelt es sich um einen klassischen Kompromiss zwischen Platz und Zeit. Wenn Sie die richtigen Informationen zwischenspeichern, können Sie beeindruckende Leistungssteigerungen erzielen. Damit ein Cache effektiv ist, muss er Daten enthalten, die häufig wieder verwendet werden. Außerdem muss die Neuberechnung dieser Daten (relativ) teuer sein. Ein Cache voller unnötiger Daten ist eine Speicherverschwendung.

Daten, die sich nicht oft ändern, bieten sich zum Zwischenspeichern an, denn Sie müssen sich keine Gedanken darüber machen, die Daten im Laufe der Zeit mit der Datenbank zu synchronisieren. Kombinationsfeldlisten, Referenztabellen, DHTML-Fetzen, XML-Zeichenfolgen (Extensible Markup Language), Menüoptionen und Sitekonfigurationsvariablen (einschließlich Datenquellennamen (DNS) IP-Adressen (Internet Protocol) und Web Pfade) sind für das Zwischenspeichern geeignet. Beachten Sie, dass es möglich ist, die Präsentation der Daten statt die Daten selbst zwischen zu speichern. Wenn sich eine ASP-Seite häufig ändert und ihre Zwischenspeicherung kostspielig ist (z. B. ihr gesamter Produktkatalog), sollten Sie eine HTML-Voraberstellung in Erwägung ziehen, anstatt sie bei jeder Anforderung neu zu zeichnen.

Wo sollen Daten zwischengespeichert werden? Welche Strategien sollten beim Zwischenspeichern befolgt werden? Daten werden häufig entweder im Arbeitsspeicher oder auf den Festplatten des Webservers zwischengespeichert. Diese Optionen werden in den nächsten beiden Tipps behandelt.

ASP Tipp 2: Zwischenspeichern Sie häufig verwendete Daten in den Objekten „Application“ oder „Session“

Das Application- und Session-Objekt in ASP stellen praktische Container zum Zwischenspeichern von Daten im Arbeitsspeicher bereit. Sie können Daten sowohl dem Application- als auch dem Session-Objekt zuweisen. Diese Daten verbleiben zwischen HTTP-Aufrufen im Arbeitsspeicher. Sitzungsdaten werden auf Benutzerbasis gespeichert, während die Anwendungsdaten für alle Benutzer freigegeben werden.

Wann werden die Daten in die Anwendung oder Sitzung geladen? Die Daten werden häufig beim Starten einer Anwendung oder Sitzung geladen. Um Daten beim Anwendungs- oder Sitzungsstart zu laden, fügen Sie Application_OnStart() oder Session_OnStart(), den jeweils geeigneten Code hinzu. Diese Funktionen müssen sich in der Datei Global.asa befinden. Ist dies nicht der Fall, können Sie sie hinzufügen. Sie können die Daten auch erst laden, wenn sie zum ersten Mal benötigt werden. Fügen Sie Ihrer ASP-Seite zu diesem Zweck Code hinzu, der prüft, ob die Daten vorhanden sind, und sie lädt, wenn dies nicht der Fall ist (oder schreiben Sie eine entsprechende wiederverwendbare Skriptfunktion). Dies ist ein Beispiel der klassischen Leistungsmethode, die als verzögerte Auswertung bezeichnet wird. Bei dieser wird eine Berechnung erst bei Bedarf durchgeführt. Dazu ein Beispiel:

<%

Function GetEmploymentStatusList

Dim d

d = Application(„EmploymentStatusList“)

If d = „„ Then

‚ FetchEmploymentStatusList function (not shown)

‚ fetches data from DB, returns an Array

d = FetchEmploymentStatusList()

Application(„EmploymentStatusList“) = d

End If

GetEmploymentStatusList = d

End Function

%>

Sie können ähnliche Funktionen für jeden benötigten Datenblock schreiben.

In welcher Form sollten die Daten gespeichert werden? Sie können alle Variantentypen speichern, da es sich bei allen Skriptvariablen um Varianten handelt. Sie können z. B. Zeichenfolgen, Ganzzahlen oder Arrays speichern. Sie werden häufig den Inhalt eines ADO-Recordsets in einem dieser Variablentypen speichern. Um Daten aus einem ADO-Recordset zu entnehmen, müssen Sie die Daten manuell Feld für Feld in VBScript-Variablen kopieren. Dies ist mithilfe einer der Beständigkeitsfunktionen für ADO-Recordsets, GetRows(), GetString() oder Save() (ADO 2.5), schneller und einfacher. Ausführliche Einzelheiten hierzu gehen über den Zweck dieses Artikels hinaus, aber im Folgenden sehen Sie eine Funktion, die die Verwendung von GetRows() zum Zurückgeben eines Arrays von Recordsetdaten demonstriert.

‚ Get Recordset, return as an Array

Function FetchEmploymentStatusList

Dim rs

Set rs = CreateObject(“ADODB.Recordset”)

rs.Open “select StatusName, StatusID from EmployeeStatus”, _

“dsn=employees;uid=sa;pwd=;”

FetchEmploymentStatusList = rs.GetRows() ‚ Return data as an Array

rs.Close

Set rs = Nothing

End Function

Die oben dargestellte Funktion könnte durch Zwischenspeichern des HTML-Inhalts dieser Liste statt des Arrays weiter angepasst werden. Dazu ein einfaches Beispiel:

‚ Get Recordset, return as HTML Option list

Function FetchEmploymentStatusList

Dim rs, fldName, s

Set rs = CreateObject(“ADODB.Recordset”)

rs.Open “select StatusName, StatusID from EmployeeStatus”, _

“dsn=employees;uid=sa;pwd=;”

s = “<select name=””EmploymentStatus””>” & vbCrLf

Set fldName = rs.Fields(“StatusName“) ‚ ADO Field Binding

Do Until rs.EOF

‚ Next line violates Don’t Do String Concats,

‚ but it’s OK because we are building a cache

s = s & „ <option>„ & fldName & „</option>„ & vbCrLf

rs.MoveNext

Loop

s = s & „</select>„ & vbCrLf

rs.Close

Set rs = Nothing ‚ See Release Early

FetchEmploymentStatusList = s ‚ Return data as a String

End Function

Unter den richtigen Umständen können Sie ADO-Recordsets selbst im Gültigkeitsbereich des Application- oder Session-Objekts zwischenspeichern. Dabei sind aber zwei Dinge zu beachten:

  1. ADO muss als Freethread-Komponente markiert sein.
  2. Sie müssen einen abgetrennten Recordset verwenden.

Wenn es keine Garantie dafür gibt, dass diese beiden Anforderungen erfüllt sind, sollten Sie ADO-Recordsets nicht zwischenspeichern. Im Tipp zu nicht beweglichen Komponenten und im Tipp weiter unten, in dem vom Zwischenspeichern von Datenbankverbindungen abgeraten wird, werden die Risiken beim Speichern von COM-Objekten im Gültigkeitsbereich eines Application- oder Session-Objekts behandelt.

Beim Speichern von Daten im Gültigkeitsbereich eines Application- oder Session-Objekts verbleiben die Daten in diesem, bis Sie sie durch Programmieren ändern, die Sitzung abläuft oder die Webanwendung neu gestartet wird. Was geschieht, wenn die Daten aktualisiert werden müssen? Um eine Aktualisierung von Anwendungsdaten manuell zu erzwingen, rufen Sie eine ASP-Seite auf, auf die nur der Administrator Zugriff hat, und die die Daten aktualisiert. Sie können Ihre Daten stattdessen auch in regelmäßigen Abständen mithilfe einer Funktion aktualisieren. Das folgende Beispiel speichert einen Zeitstempel mit den zwischengespeicherten Daten und aktualisiert die Daten nach einem bestimmten Zeitraum.

<%

‚ error handing not shown…

Const UPDATE_INTERVAL = 300 ‚ Refresh interval, in seconds

‚ Function to return the employment status list

Function GetEmploymentStatusList

UpdateEmploymentStatus

GetEmploymentStatusList = Application(„EmploymentStatusList“)

End Function

‚ Periodically update the cached data

Sub UpdateEmploymentStatusList

Dim d, strLastUpdate

strLastUpdate = Application(„LastUpdate“)

If (strLastUpdate = „„) Or _

(UPDATE_INTERVAL < DateDiff(„s“, strLastUpdate, Now)) Then

‚ Anmerkung: Hier können zwei oder mehr Aufrufe eingehen. Das ist in Ordnung und führt

‚ lediglich zu einigen unnötigen Abrufen (dies kann umgangen werden)

‚ FetchEmploymentStatusList function (not shown)

‚ fetches data from DB, returns an Array

d = FetchEmploymentStatusList()

‚ Update the Application object. Use Application.Lock()

‚ to ensure consistent data

Application.Lock

Application(„EmploymentStatusList“) = Events

Application(„LastUpdate“) = CStr(Now)

Application.Unlock

End If

End Sub

Ein weiteres Beispiel finden Sie im Artikel „World’s Fastest ListBox with Application Data“.

Beachten Sie, dass vom Zwischenspeichern von großen Arrays in Session- oder Application-Objekten abgeraten wird. Bevor Sie auf ein Element des Arrays zugreifen können, setzt die Semantik der Skripterstellungssprachen voraus, dass das gesamte Array kopiert wird. Wenn Sie z. B. ein aus 100.000 Elementen bestehendes Zeichenfolgenarray, das US-amerikanische Postleitzahlen lokalen Wetterstationen zuordnet, in einem Application-Objekt zwischenspeichern, muss ASP zuerst alle 100.000 Wetterstationen in ein temporäres Array kopieren, bevor Sie auch nur eine Zeichenfolge extrahieren können. In diesem Fall empfiehlt es sich, zum Speichern der Wetterstationen eine benutzerdefinierte Komponente mit einer benutzerdefinierten Methode zu erstellen oder eine der Wörterbuchkomponenten zu verwenden.

Zum Schluss noch ein weiterer Kommentar nach dem Motto „das Kind mit dem Badewasser ausschütten“. Arrays stellen schnelle Suche und Speicherung von zentralen Datenpaaren bereit, die im Arbeitsspeicher zusammenhängen. Das Indizieren eines Wörterbuches ist langsamer als das Indizieren eines Arrays. Sie sollten sich für die Datenstruktur entscheiden, die unter den gegebenen Umständen die beste Leistung bietet.

ASP Tipp 3: Zwischenspeichern Sie Daten und HTML auf den Festplatten des Webservers

In einigen Fällen liegen zu viele Daten für die Zwischenspeicherung im Arbeitsspeicher vor. „Zu viel“ ist subjektiv. Es kommt darauf an, wie viel Speicher Sie verwenden möchten, wie viele Elemente zwischengespeichert werden sollen, und wie oft diese Elemente abgerufen werden sollen. Wenn für das Zwischenspeichern im Arbeitsspeicher zu viele Daten vorliegen, sollten Sie auf jeden Fall das Zwischenspeichern von Daten in Text- oder XML-Dateien auf den Festplatten des Webservers in Erwägung ziehen. Sie können sich für eine Kombination des Zwischenspeicherns von Daten auf Festplatten und im Arbeitsspeicher entscheiden, um die optimale Zwischenspeicherungsstrategie für Ihre Site zu erhalten.

Beachten Sie, dass das Abrufen von Daten auf der Festplatte beim Ermitteln der Leistung einer einzelnen ASP-Seite nicht immer schneller als das Abrufen von Daten aus einer Datenbank ist. Durch Zwischenspeichern wird jedoch die Belastung der Datenbank und des Netzwerkes verringert. Bei einer hohen Belastung wird der Durchsatz hierdurch wesentlich verbessert. Das Zwischenspeichern kann beim Zwischenspeichern der Ergebnisse einer kostspieligen Abfrage, z. B. einer Mehrtabellenverknüpfung, einer komplexen gespeicherten Prozedur oder umfangreicher Resultsets, sehr effektiv sein. Testen Sie wie üblich die konkurrierenden Schemas.

ASP und COM stellen mehrere Tools zum Erstellen von festplattenbasierten Zwischenspeicherungsschemas bereit. Die ADO-Funktionen Save() und Open() des ADO-Recordsets speichern und laden Recordsets von der Festplatte. Mithilfe dieser Methoden könnten Sie den Beispielcode des Tipps zum Zwischenspeichern von Anwendungsdaten weiter oben neu schreiben, indem Sie den Code, der das Application-Objekt schreibt, durch eine Save()-Funktion zum Speichern in einer Datei ersetzen.

Es gibt einige weitere Komponenten, die mit Dateien eingesetzt werden können:

  1. Scripting.FileSystemObject ermöglicht das Erstellen, Lesen und Schreiben von Dateien. 
  2. MSXML, der zu Internet Explorer gehörende Microsoftä XML-Parser, unterstützt das Speichern und Laden von XML-Dokumenten. 
  3. Das LookupTable-Objekt (Beispiel, im MSN verwendet) eignet sich hervorragend zum Laden einfacher Listen von der Festplatte.

Zum Schluss sollten Sie das Zwischenspeichern der Datenpräsentation anstelle der Daten selbst auf der Festplatte in Erwägung ziehen. Vorgerenderter HTML-Inhalt kann als HTM- oder ASP-Datei auf der Festplatte gespeichert werden. Hyperlinks können direkt auf diese Dateien verweisen. Sie können das Generieren von HTML mit kommerziellen Tools automatisieren, wie z. B. Xbuilder oder den Funktionen zur Internetveröffentlichung von Microsoftä SQL Serverä. Stattdessen können Sie auch HTML-Ausschnitte in einer ASP-Datei aufnehmen. Sie können HTML-Dateien außerdem mithilfe von FileSystemObject von der Festplatte lesen oder XML für eine frühe Darstellung verwenden.

 

ASP Tipp 4: Vermeiden Sie das Zwischenspeichern von nicht beweglichen Komponenten in den Objekten „Application“ oder „Session“

Während sich das Zwischenspeichern von Daten im Application- oder Session-Objekt empfiehlt, kann das Zwischenspeichern von COM-Objekten große Nachteile haben. Es liegt oft nahe, häufig verwendete COM-Objekte in das Application- oder Session-Objekt abzulegen. Leider führen viele COM-Objekte, darunter alle in Visual Basic 6.0 oder früher verfassten, beim Speichern des Application- oder Session-Objekts zu schwerwiegenden Engpässen.

Insbesondere nicht bewegliche Komponenten führen beim Zwischenspeichern im Application- oder Session-Objekt zu Leistungsengpässen. Eine bewegliche Komponente ist eine mit ThreadingModel=Both markierte Komponente, die den FTM (Free-threaded Marshaler) aggregiert, oder eine mit ThreadingModel=Neutral markierte Komponente. (Das neutrale Modell wird erstmals in Windows 2000 und COM+ verwendet.) Folgende Komponenten sind nicht beweglich:

  1. Freethread-Komponenten (es sei denn, sie aggregieren den FTM)
  2. Apartmentthread-Komponenten
  3. Singlethread-Komponenten

Konfigurierte Komponenten (Microsoft Transaction Server (MTS)/COM+-Bibliothek und Serverpakete/-anwendungen) sind nicht beweglich, es sei denn, sie sind neutralthreaded. Apartmentthread-Komponenten und andere nicht bewegliche Komponenten funktionieren am besten im Gültigkeitsbereich der Seite (d. h. sie werden auf einer einzelnen ASP-Seite erstellt und gelöscht).

In IIS 4.0 wurde eine mit ThreadingModel=Both markierte Komponente als beweglich angesehen. In IIS 5.0 reicht das nicht länger aus. Die Komponente muss nicht nur mit Both markiert sein, sondern muss auch den FTM aggregieren. Der Artikel zur Beweglichkeit beschreibt, wie mit der Active Template Library geschriebene C++-Komponenten dazu veranlasst werden, den FTM zu aggregieren. Wenn Ihre Komponente Schnittstellenzeiger zwischenspeichert, müssen auch diese Zeiger selbst beweglich sein oder in der COM-GIT (Global Interface Table) gespeichert sein. Wenn sich eine Boththread-Komponente nicht zum Aggregieren des FTM neu kompilieren lässt, können Sie sie als ThreadingModel=Neutral markieren. Wenn IIS keine Beweglichkeitsprüfung durchführen soll (d. h. wenn nicht bewegliche Komponenten nicht im Gültigkeitsbereich des Application- oder Session-Objekts gespeichert werden sollen), können Sie AspTrackThreadingModel stattdessen in der Metabasis auf True festlegen. Es wird davon abgeraten, AspTrackThreadingModel zu ändern.

IIS 5.0 gibt einen Fehler aus, wenn Sie versuchen, eine nicht bewegliche, mit Server.CreateObject erstellte Komponente im Application-Objekt zu speichern. Sie können dies durch Verwenden von <object runat=server scope=application …> in der Datei Global.asa umgehen. Davon wird aber abgeraten, da dies wie unten erläutert zu Marshalling und Serialisierung führt.

Was läuft beim Zwischenspeichern nicht beweglicher Komponenten schief? Eine nicht bewegliche, im Session-Objekt zwischengespeicherte Komponente „bindet“ das Session-Objekt an einen ASP-Arbeitsthread. ASP verwaltet einen Pool von Arbeitsthreads, die von Diensten angefordert werden. Normalerweise wird eine neue Anforderung vom ersten verfügbaren Arbeitsthread verarbeitet. Wenn eine Sitzung an einen Thread gebunden ist, muss die Anforderung warten, bis der verknüpfte Thread verfügbar wird. Hierzu eine Analogie, die dies möglicherweise verständlicher macht: Sie gehen zum Supermarkt, kaufen Lebensmittel und bezahlen für diese an Kasse 3. Danach müssen Sie beim Einkaufen in diesem Supermarkt jedes Mal an Kasse 3 bezahlen, selbst wenn die Schlangen an anderen Kassen kürzer sind, oder es Kassen ohne Warteschlangen gibt.

Das Speichern nicht beweglicher Komponenten im Gültigkeitsbereich des Application-Objekts wirkt sich noch negativer auf die Leistung aus. ASP muss einen Spezialthread erstellen, um nicht bewegliche Komponenten im Gültigkeitsbereich des Application-Objekts auszuführen. Dies hat zwei Konsequenzen: Alle Aufrufe müssen zu diesem Thread gemarshallt und alle Aufrufe müssen serialisiert werden. Marshalling bedeutet, dass die Parameter in einem freigegebenen Bereich des Arbeitsspeichers gespeichert werden müssen. Am Spezialthread muss eine kostspielige Kontextänderung durchgeführt und die Methode der Komponente ausgeführt werden. Die Ergebnisse werden in einen freigegebenen Bereich gemarshallt, und eine weitere kostspielige Kontextänderung gibt die Kontrolle an den Originalthread zurück. Serialisierung bedeutet, dass alle Methoden nacheinander ausgeführt werden. Es ist nicht möglich, dass zwei unterschiedliche ASP-Arbeitsthreads gleichzeitig Methoden an einer freigegebenen Komponente ausführen. Dadurch wird Parallelität, insbesondere auf Mehrprozessorcomputern, verhindert. Am schlimmsten ist aber, dass allen nicht beweglichen Komponenten im Gültigkeitsbereich des Application-Objekts ein Thread (der „Host-STA“) gemeinsam ist. Dadurch werden die Auswirkungen der Serialisierung noch verstärkt.

Schwirrt Ihnen der Kopf? Dann dürften diese allgemeinen Regeln helfen. Wenn Sie Objekte in Visual Basic (6.0) oder früher schreiben, zwischenspeichern Sie sie nicht im Application- oder Session-Objekt. Wenn Ihnen das Threading-Modell eines Objekts nicht bekannt ist, sollten Sie es nicht zwischenspeichern. Anstatt nicht bewegliche Objekte zwischenzuspeichern, empfiehlt es sich, diese auf jeder Seite zu erstellen und freizugeben. Die Objekte werden direkt auf dem ASP-Arbeitsthread ausgeführt, so dass es nicht zu Marshalling oder Serialisierung kommt. Die Leistung ist angemessen, wenn die COM-Objekte im IIS-Feld ausgeführt werden, und wenn das Initialisieren und Löschen der COM-Objekte nicht besonders zeitaufwendig ist. Beachten Sie, dass Singlethread-Objekte nicht auf diese Weise verwendet werden sollten. Seien Sie vorsichtig: VB kann Singlethread-Objekte erstellen! Wenn Sie Singlethread-Objekte auf diese Weise (z. B. als Microsoft Excel-Tabelle) verwenden müssen, sollten Sie keinen hohen Durchsatz erwarten.

ADO-Recordsets können problemlos zwischengespeichert werden, wenn ADO als Freethread-Komponente markiert ist. Verwenden Sie die Datei Makfre15.bat, um ADO als Freethread-Komponente zu markieren. Diese befindet sich in der Regel im Verzeichnis \\Programme\Gemeinsame Dateien\System\ADO.

Warnung ADO sollte nicht als Freethread-Komponente markiert werden, wenn Microsoft Access als Datenbank verwendet wird. Das ADO-Recordset muss außerdem abgetrennt sein. Wenn Sie die ADO-Konfiguration auf Ihrer Site nicht steuern können (z. B. wenn Sie als unabhängiger Softwarehersteller eine Webanwendung an Kunden verkaufen, die ihre eigenen Konfigurationen verwalten), ist es im Allgemeinen wahrscheinlich besser, Recordsets nicht zwischenzuspeichern.

Wörterbuchkomponenten stellen ebenfalls bewegliche Objekte dar. Das LookupTable-Objekt lädt Daten aus einer Datendatei und ist sowohl für Kombinationsfelddaten als auch Konfigurationsinformationen geeignet. Das PageCache-Objekt von Duwamish Books stellt ebenso wie das Caprock-Lexikon Wörterbuchsemantiken bereit. Diese Objekte oder Ableitungen davon können die Grundlage einer effektiven Zwischenspeicherungsstrategie bilden. Beachten Sie, dass das Scripting.Dictionary-Objekt NICHT beweglich ist und nicht im Gültigkeitsbereich eines Application- oder Session-Objekts gespeichert werden sollte.

ASP Tipp 5: Zwischenspeichern Sie Datenbankverbindungen nicht in den Objekten „Application“ oder „Session“

Das Zwischenspeichern von ADO-Verbindungen ist normalerweise keine gute Strategie. Wenn ein Connection-Objekt im Application-Objekt gespeichert und auf allen Seiten verwendet wird, konkurrieren alle Seiten um diese Verbindung. Wenn das Connection-Objekt im Session-Objekt von ASP gespeichert wird, wird für jeden Benutzer eine Datenbankverbindung erstellt. Damit werden die Vorteile des Verbindungs-Pooling zunichte gemacht und der Webserver und die Datenbank unnötig belastet.

Anstatt Datenbankverbindungen zwischenzuspeichern, sollten Sie auf jeder Seite, die ADO verwendet, ADO-Objekte erstellen und löschen. Dies ist effizient, da das Verbindungs-Pooling in IIS integriert ist. Genauer gesagt, aktiviert IIS OLEDB- und ODBC-Verbindungs-Pooling automatisch. Dadurch wird auf jeder Seite ein effizientes Erstellen und Löschen von Verbindungen sichergestellt.

Da verbundene Recordsets eine Referenz auf eine Datenbankverbindung speichern, sollten diese nicht im Application- oder Session-Objekt zwischengespeichert werden. Sie können abgetrennte Recordsets, die keine Referenz auf ihre Datenverbindung enthalten, aber problemlos zwischenspeichern. Gehen Sie folgendermaßen vor, um ein Recordset abzutrennen:

Set rs = Server.CreateObject(„ADODB.RecordSet“)

rs.CursorLocation = adUseClient ‚ step 1

‚ Populate the recordset with data

rs.Open strQuery, strProv

‚ Now disconnect the recordset from the data provider and data source

rs.ActiveConnection = Nothing ‚ step 2

Weitere Informationen zum Verbindungs-Pooling finden Sie in den Verweisen auf ADO und SQL Server.