Kategorie: Dateizugriff
Frage: Wie kann ich Dateien von anderen (Internet-)Servern laden?
Manchmal benötigt man Zugriff auf Dateien, die auf anderen Webservern liegen. Damit sind
in diesem Artikel aber nicht Server des lokalen Netzwerks (LAN), sondern andere Internetserver
gemeint.

Ein Beispiel. Sie möchten auf Ihrer Website http://www.aspfaq.de gerne Teile des Inhalts
der Website http://www.asp-database.de anzeigen. Diese Server sind physikalisch und logisch
getrennt. D.h. sie können weder eine Netzwerkfreigabe erstellen noch eine direkte Verbindung
zwischen diesen Servern herstellen.

Um einen HTTP-Request ausführen zu können, musste man früher immer auf Komponenten
von Drittanbietern zurückgreifen. Seit der Einführung des XML-SDK's durch Microsoft kann man
eine dort enthaltene Komponente (die daher auch auf den meisten Server schon vorhanden ist)
verwenden.

Mit der Einführung von XML 3.0 hat Microsoft eine Komponente bereitgestellt, die es auch Ihnen
ermöglich, auch auf Servern die Funktionalität des XMLHTTP-Objekts zu nutzen. Das "alte" Objekt
(siehe 2. Beispiel) basiert auf WinInet, was den Einsatz auf Servern aufgrund einiger Einschränkungen
verbietet. (Siehe Q183110 und Q238425 in der MS KB)

Das Objekt MSXML2.ServerXMLHTTP wurde von Microsoft speziell für den Einsatz auf Servern geschrieben
und bietet von daher eine bessere Unterstützung und Sicherheit. Allerdings läuft dieses Beispiel nicht unter
Windows 95 oder Windows 98. (Siehe: Q279129 in der Microsoft Knowledge Base)
Desweiteren muss zwingend MS IE 5.01 oder höher installiert sein. Internet Explorer 5.0 reicht nicht aus.

Da es Probleme mit Umlauten bei der Ausgabe des ermittelten Contents bei der Verwendung von
objHTTP.ResponseText gibt, haben wir die Skripte dahingehend geändert, dass wir den Inhalt der
Seiten über objHTTP.ResponseBody auslesen und mit Response.BinaryWrite ausgeben



[loaddata.asp]
<%
Private Function GetURL(URL)

' --- Instantiieren des Objekts MSXML2.ServerXMLHTTP
Set objHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")

    ' --- Einstellen der Timeouts in Millisekunden
    ' --- Es gibt 4 Parameter, die in der nachstehenden Reihenfolge angegeben werden müssen
    ' -----------------------------------------------------
    ' --- resolveTimeout - Auflösen des Hostnamens
    ' --- connectTimeout - Verbinden mit dem Host
    ' --- sendTimeout - Senden eines Datenpaketes an den Server
    ' --- receiveTimeout - Empfangen eines Datenpaketes vom Server
    ' -----------------------------------------------------
    objHTTP.SetTimeouts 1000, 1000, 1000, 1000

    ' --- Erstellen des Requests mit folgenden Parametern
    ' --- bstrMethod - Request-Methode
    ' --- bstrURL - Adresse der Seite, die ausgelesen werden soll
    ' --- varAsync - Laden der Seite asynchron (Wenn false, wird synchron geladen)
    objHTTP.open "GET", URL, false

    ' --- Senden des Requests
    objHTTP.send

    ' --- Der gesamte Text der geladenen Seite steht jetzt in ResponseText
    ' --- und wird als Rückgabewert der Funktion GetURL zugewiesen.
    GetURL = objHTTP.ResponseBody

' --- Terminieren des Objekts
Set objHTTP = Nothing

End Function
%>
<html>
<head>
    <title>HTTP GET</title>
</head>
<body>
Hier kommt der Text der Seite http://www.asp-database.de/aspdatabase/index.html<br>
<br>
<% Response.BinaryWrite GetURL("http://www.asp-database.de/aspdatabase/index.html") %>
</body>
</html>

Damit haben Sie jetzt den gesamten Inhalt der o.a. Seite geladen und auf Ihrer eigenen Seite
ausgegeben. Achtung: Sie sollten allerdings beachten, dass das "Ausleihen" von Inhalten nicht von allen
Websitebetreibern erwünscht ist und in gewissen Fällen sogar rechtlich problematisch ist. Daher
sollten Sie, bevor Sie fremde Seiten auslesen und den Inhalt auf Ihren Seiten ausgeben oder
weiterverarbeiten, auf jeden Fall den Betreiber der Website fragen, ob ein solches Auslesen
erwünscht ist. Dies gilt auch für alle unsere Websites.



Das nachstehende Beispiel können Sie, wenn Sie MS XML 3 nicht auf Ihrem Rechner haben, zum Testen
der Möglichkeiten verwenden. Allerdings sollten Sie das Beispiel nur auf Ihrem lokalen Rechner testen,
nicht auf Produktionsservern. Wenn Sie die Beispiele vergleichen, werden Sie merken, dass nur wenige
Unterschiede vorhanden sind. Einmal müssen Sie bei einem Wechsel auf des ServerXMLHTTP-Objekt
den Namen der Komponente austauschen, des weiteren gibt es nun eine "echte" Möglichkeit, Timeouts
anzugeben.


[loaddata.asp]
<%
Private Function GetURL(URL)

' --- Instantiieren des Objekts Microsoft.XMLHTTP
Set objHTTP = Server.CreateObject("Microsoft.XMLHTTP")

    ' --- Erstellen des Requests mit folgenden Parametern
    ' --- bstrMethod - "GET" - Request-Methode
    ' --- bstrURL - URL - Adresse der Seite, die ausgelesen werden soll
    ' --- varAsync - false - Laden der Seite Asynchron
    objHTTP.open "GET", URL, false

    ' --- Senden des Requests
    objHTTP.send

    ' --- Der gesamte Text der geladenen Seite steht jetzt in ResponseText
    ' --- und wird als Rückgabewert der Funktion GetURL zugewiesen.
    GetURL = objHTTP.ResponseBody

' --- Terminieren des Objekts
Set objHTTP = Nothing

End Function
%>
<html>
<head>
    <title>HTTP GET</title>
</head>
<body>
Hier kommt der Text der Seite http://www.asp-database.de/aspdatabase/index.html<br>
<br>
<% Response.BinaryWrite GetURL("http://www.asp-database.de/aspdatabase/index.html") %>
</body>
</html>


Copyright 2000 - 2024 by Stefan Falz Webconsulting