ASP ist eine feine Sache, da man damit relativ schnell ansprechende
Ergebnisse in Form von dynamischen Web-Seiten erzielen kann. Einziges Manko
ist, dass die Sprache zum einen schon relativ alt ist und zum anderen man
beim Programmieren von bestimmten Funktionalitäten auf externe Komponenten
angewiesen ist.
ASP.NET hingegen bietet dem Entwickler wesentlich mehr Möglichkeiten, ist
aber eine neue Sprache, die dem Entwickler quasi abverlangt seine Seiten zu
großen Teilen neu zu gestalten, um diese Möglichkeiten auszureizen.
In vielen Fällen, wo ein funktionierendes ASP-Web vorliegt und der Server
auch mit ASP.NET zurecht kommt, ist zu überlegen, ob man nicht die fehlende
Funktionalität von ASP einfach mit ASP.NET erweitert. Ist jedoch eine
strikte Trennung zwischen den beiden Sprachen notwendig, kommt man nicht
umhin ein Modell zu entwickeln, in dem die beiden lediglich miteinander
kommunizieren.
Als praktisches Beispiel kann die Auflösung des DNS-Host-Names dienen,
das im Artikel "Mit der IP-Adresse den Host-Namen auflösen"
beschrieben ist. Problem: man verfügt nicht über eine entsprechende auf dem
Server installierte Komponente, die den Job in ASP erledigen kann, will die
Funktionalität aber in eine Seite einbauen.
Erster Ansatzpunkt für die Überlegung wie man eine solche Kommunikation
hinbekommen kann, sind die in .NET eingeführten Web-Services. Diese
kommunizieren in XML. Was liegt also näher als für die Kommunikation
zwischen ASP und ASP.NET ebenfalls XML zu verwenden.
ASP.NET
Zu diesem Zweck bohren
wir die erwähnten Artikel ASP.NET-Seite (ASPX) so auf, dass sie statt HTML XML
auswirft. Dabei wandern zunächst die Direktiven in eine Zeile, um eine unnötige erste
Leerzeile zu verhindern, und legen über Response.ContentType fest, dass der
Auswurf der ASP.NET-Seite XML sein soll:
<%@ Page Language="vb" %><%@ Import Namespace="System.Net" %>
<% Response.ContentType="text/xml" %><?xml version="1.0" encoding="utf-8"?>
Als nächstes kommt direkt das Server-Script, dass zum einen um das Reverse-Lookup von Host-Name zu IP-Adresse erweitert wurde und dessen
Prozeduren in Funktionen mit Eingangsparameter und Rückgabewert
umgewandelt wurden. Konnte ein Adresse nicht aufgelöst werden, so wird
ein Leerstring zurückgegeben.
<script runat="server">
Function LookUpHost(strIP as String) As String
Try
Dim HostInfo As IPHostEntry = Dns.GetHostByAddress(strIP)
LookUpHost = HostInfo.HostName
Catch ex As Exception
LookupHost = ""
End Try
End Function
Function LookUpIP(strHost as String) As String
Try
Dim HostInfo As IPHostEntry = Dns.GetHostByName(strHost)
LookUpIP = HostInfo.AddressList(0).ToString()
Catch
LookUpIP = ""
End Try
End Function
</script>
Statt des HTML-Gerüsts aus dem erwähnten Artikel, wird nun ein Stück
ASP-Code verwendet, dass als erstes etwaige Übergabeparameter ausliest und
dann entscheidet was zu tun ist. Das Ergebnis wird in zwei Variablen (strIP
und strHost) gespeichert.
<%
Dim strIP, strHost
'Übergabeparameter auslesen, falls vorhanden
strIP = Request.QueryString("ip")
strHost = Request.QueryString("host")
'Entscheidung was umgewandelt werden soll
If Len(strIP) > 0 then
'IP-Adresse zu Host-Name
strHost = LookUpHost(strIP)
ElseIf Len(strHost) > 0 then
'Host-Name zu IP-Adresse
strIP = LookUpIP(strHost)
Else
'Standard (Localhost), falls keine Parameter übergeben wurden
strIP = "127.0.0.1"
strHost = LookUpHost(strIP)
End if
'Ausnahme, falls Lookup fehlgeschlagen
If Len(strIP) = 0 then strIP = "Unable to resolve"
If Len(strHost) = 0 then strHost = "Unable to resolve"
%>
Als letztes wird nun der Inhalt in einer festgelegten
XML-Struktur ausgegeben:
<info>
<ip><%=strIP%></ip>
<hostname><%=strHost%></hostname>
</info>
Wird nun die Seite im Browser aufgerufen so wird folgendes ausgeworfen:
Aufruf: http://www.meinedomain.de/getdnsinfo.aspx?host=www.yahoo.de

ASP
Nun zur ASP-Seite. Um das in ASP.NET erzeugte XML zu verarbeiten
verwenden wir das Objekt ServerXMLHTTP des XML-Parsers MSXML
von Microsoft. Die Kommentare der nachfolgenden ASP-Funktion beschreiben die
einzelnen Schritte, die zum Auslesen der XML-Datei notwendig sind:
<%
Public Function GetHostName(strIP)
If Len(strIP) > 0 Then
'URL zur ASP.NET-Seite festlegen und im den IP-Parameter ergänzen
strURL = "http://www.zerbit.de/nettools20/getdnsinfo.aspx?ip=" & strIP
'Parser-Objekt initialisieren und XML-Daten abrufen
Set objXMLHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
objXMLHTTP.Open "GET", strURL, False
objXMLHTTP.Send()
'XML-DOM-Dokument initialisieren und mit den XML-Daten bestücken
Set objDoc = Server.CreateObject("MSXML2.DOMDocument")
Set objDoc = objXMLHTTP.ResponseXML
'Benötigtes Element aus dem XML-Baum in Node-Objekt ablegen
Set objNode = objDoc.selectSingleNode("//info/hostname")
'Wert des Nodes auslesen
GetHostName = objNode.text
'Alle Objekte wieder zerstören
Set objNode = Nothing
Set objDoc = Nothing
Set objXMLHTTP = Nothing
End If
End Function
%>
Diese Funktion kann man in den eigenen ASP-Seiten nun beliebig oft
verwenden, wenn man sie in eine externe ASP-Seite schreibt (z.B. "tools.asp")
und auf der jeweiligen Seite mit <!--#include virtual="/tools.asp"
//--> einbindet. Der Code ist für eine Funktion die aus einem
Host-Namen die IP-Adresse ermittelt entsprechend anzupassen.
Fazit
Mit der hier dargestellten Vorgehensweise kann man relativ leicht Daten
zwischen ASP.NET und ASP vermitteln. Das Beispiel kann als Vorlage für
weitere Implementierungen dienen, in denen Daten zwischen den beiden Welten
ausgetauscht werden müssen.
Besonders interessant ist das Beispiel für Sie, wenn Sie nicht über einen
.NET-fähigen Server verfügen. In diesem Fall können Sie die hier
dargestellte ASP.NET-Seite verwenden. Der Aufruf lautet:
http://www.meinedomain.de/getdnsinfo.aspx
Zwei Parameter sind gültig:
- ?ip=<IP-Adresse>
- ?host=<Host-Name>