Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / ASP / Service / ASP mit VB

Server-seitige Anwendungen mit VB

Historie
13.08.2001Aktualisierung auf Win2000 (Hinweis von Toni Pohl)
24.11.2000Erste Version

Die Programmierung von ASP-Seiten erfolgt in einer Skript-Sprache. Schon dadurch gibt es aus Sicht des Software-Entwicklers einige Nachteile (s.a. VBScript - Unterschiede zu VB). Microsoft bietet mit der ActiveX-Technik eine Möglichkeit an, kompilierte Komponenten mit VB zu erstellen, welche in ASP-Seiten eingebunden werden können. So können alle Vorteile von Visual Basic genutzt werden.

Zuerst wird das typische Grundgerüst einer VB-Komponente für ASP vorgestellt. Dann wird die Realisierung anhand eines Beispiels verdeutlicht. Abschließend wird die Problematik der Distribution der erstellten Komponente erläutert.

Grundgerüst

Eine Komponente für den Einsatz unter IIS/ASP wird in VB folgenderweise erstellt und eingerichtet (hier die Beschreibung für die englischsprachige VB5-Version; ansonsten ist analog vorzugehen):

  1. Legen Sie mit VB ein neues ActiveX-DLL-Projekt an. Geben sie dem Projekt und der Klasse sinnvolle Namen (im Beispiel: "ASPKomponente" und "ASPKlasse").
  2. Überprüfen Sie in den Projekt-Eigenschaften (Reiter "General") die Einstellungen für "Unattended Execution" und "Threading Model":
    VB-Dialog für Projekt-Eigenschaften
    Da die Komponente auf einem WebServer ablaufen soll, ist eine direkte Benutzer-Interaktion nicht möglich. Wird z.B. eine MessageBox aufgerufen, so erscheint sie auf dem Server und nicht etwa Client-seitig (also im Browser). Daher sollte die Option "Unattended Execution" gesetzt werden, um solche Probleme zu vermeiden. Dann wird nämlich jede Benutzer-Interaktion unterdrückt.
    Das "Threading Model" beschreibt u.a. das Verhalten der zu erstellenden Komponente bezüglich der Generierung und Wiederverwendung von Objekten. Es sollte "Appartment Threaded" gewählt sein, um einen reibungslosen Betrieb innerhalb von IIS/ASP zu gewährleisten.
  3. Fügen Sie (via "Project/References") folgende Verweise auf externe Komponenten hinzu:
    • "Microsoft Active Server Pages Object Library"
    • "Microsoft Transaction Server Type Library" (bzw. "COM+ Services Type Library" ab Win2000)
    Damit wird sichergestellt, dass die VB-Komponente auf alle notwendigen ASP-Objekte zugreifen kann.
  4. Bei Benutzung von COM+ (Win2000) mit VB6 sollte in den Projekt-Eigenschaften der MTSTransactionMode auf "1 - NoTransaction" gesetzt werden.
  5. Geben Sie folgenden Code in das Klassenmodul ein:
    'ASP-Objekte:
    Private pApplication As ASPTypeLibrary.Application
    Private pRequest As ASPTypeLibrary.Request
    Private pResponse As ASPTypeLibrary.Response
    Private pServer As ASPTypeLibrary.Server
    Private pSession As ASPTypeLibrary.Session
    
    Private Sub InitASP()
      If pApplication Is Nothing Then 
        'Kontext feststellen:
        With GetObjectContext
          Set pApplication = .Item("Application")
          Set pRequest = .Item("Request")
          Set pResponse = .Item("Response")
          Set pServer = .Item("Server")
          Set pSession = .Item("Session")
        End With
      End If
    End Sub
    
    Damit wird (falls noch nicht vorhanden) die Verbindung zwischen der VB-Komponente und IIS/ASP hergestellt.
  6. Speichern Sie das ganze Projekt (also sowohl die VBP- als auch die CLS-Datei) in einem Verzeichnis ab.
  7. Erstellen Sie mindestens eine öffentliche Methode, welche die Logik der Komponente realisiert. Jede Methode sollte als erstes die oben gezeigte Prozedur InitASP aufrufen.
  8. Mit "File/Make ..." wird die VB-Komponente kompiliert und registriert.
  9. Alle ASP-Seiten könnten nun auf die gerade erstellte VB-Komponente mit folgendem Code zugreifen:
    <%
    Set ASPKlasse = Server.CreateObject("ASPKomponente.ASPKlasse")
    ASPKlasse.Methode
    %>
    

Beispiel

In dem nun folgenden Beispiel wird ein Taschenrechner als ASP-Komponente realisiert. Er soll etwa so aussehen:

x 45
Dazu muss der Code im oben gezeigten Klassenmodul um die Methode "Rechner" erweitert werden:

Public Sub Rechner()
  Dim x As String
  Dim y As String
  Dim z As String
  
  InitASP
  
  'Eingabe:
  With pRequest
    x = .Form("txtX")
    y = .Form("txtY")
  End With
  
  'Berechnung:
  On Error Resume Next
    z = CStr(CDbl(x) * CDbl(y))
    If Err Then z = "***"
  On Error GoTo 0
  
  'Ausgabe:
  With pResponse
    .Write "<tt>"
    .Write "<form method=post>"
    .Write "  <input name=txtX value='" & x & "' size=5>"
    .Write "  <sup>x</sup>"
    .Write "  <input name=txtY value='" & y & "' size=5>"
    .Write "  <input type=submit value=' = '>"
    .Write "  <big>" & z & "</big>"
    .Write "</form>"
    .Write "</tt>"
  End With
End Sub

Nach erfolgreicher (Neu-)Kompilierung kann dieser "Taschenrechner" von ASP aus genutzt werden. Dazu genügt folgender Inhalt (hier absolut minimiert, aber voll funktionsfähig):

<% Server.CreateObject("ASPKomponente.ASPKlasse").Rechner %>

Wie man leicht erkennen kann, wird nur noch ein einzeiliges ASP-Skript zum Starten der VB-Komponente benötigt. Die eigentliche Entwicklung findet von nun an nur noch in der VB-Entwicklungsumgebung statt!

Distribution der Komponenten

Registrierung

Erfolgt die Entwicklung einer Komponente nicht auf dem WebServer selbst, so muss diese z.B. mit dem Setup Wizard installiert werden.

Ist jedoch bereits irgendwann mal eine VB-Komponente auf dem WebServer installiert worden, so genügt ein einfaches Kopieren der kompilierten Komponente und ein anschließendes manuelles Registrieren.

Diese manuelle Registrierung erfolgt mit dem Befehl regsvr32, welchen man über die Shell ("Eingabeaufforderung") oder über "Start/Ausführen" absetzen kann. Soll z.B. die Komponente "ASPKomponente.dll" registriert werden, so genügt folgende Eingabe:

regsvr32 Pfad\ASPKomponente.dll

Neue Versionen

Soll ein Update einer VB-Komponente eingespielt werden, so kann dies im laufenden Betrieb des WebServers problematisch sein: Unter Umständen hat eine ASP-Seite irgendwann mal die alte Version der Komponente aufgerufen. Der WebServer behält die Komponente dann im Speicher, um sie eventuell wiederzuverwenden. Versucht man nun, diese Komponente zu entfernen bzw. eine neue Version einzuspielen, so erhält man u.U. folgende Meldung:
Fehlermeldung: Komponente kann nicht kopiert werden
Dies kann übrigens auch dann passieren, wenn Sie auf dem WebServer selbst eine Komponente neu kompilieren möchten.

Um dieses Problem zu umgehen, muss der WebServer "runtergefahren" werden, damit er alle Komponenten wieder frei gibt. Dies geschieht via

net stop iisadmin

(in der Shell auszuführen). Dieser Vorgang dauert etwa 5 Sekunden. Wieder gestartet wird der WebServer mit

net start w3svc

(ebenfalls in der Shell auszuführen).
Daher sollte die Entwicklung einer Komponente nicht auf der Produktionsplattform erfolgen, sondern mittels "Personal Web Server" lokal auf dem Rechner des Entwicklers. In diesem Zusammenhang hat sich auch die folgende Batch als sehr hilfreich erwiesen:

net stop iisadmin /y
net start w3svc

Die Option "y" sorgt dafür, dass keine störenden Sicherheitsabfragen erscheinen.
Sinnvollerweise legen Sie diese Batch auf dem Desktop oder im Start-Menü ab. Dann genügt bereits ein (Doppel-)Klick, um den WebServer runter und sofort wieder hoch zu fahren und damit alle geladenen Komponenten aus dem Speicher zu entfernen. Anschließend können Sie das Update Ihrer Komponente einspielen.

© Jost Schwider, 24.11.2000-11.07.2009 - http://vb-tec.de/asp_vb.htm