IIS4 speichert ungewollt ASP Variable?!
Ernst
- asp.net
Hallo zusammen,
ich brauch dringend Eure Hilfe.
Mit folgendem Script lade ich den Inhalt einer Textdatei, von meiner Website in eine Variable, um diese dann auszuwerten.
#########################
Private Function GetURL(URL)
Set objHTTP = Server.CreateObject "Microsoft.XMLHTTP")
objHTTP.open "GET", URL, false
objHTTP.send
GetURL = objHTTP.ResponseText
Set objHTTP = Nothing
End Function
str = GetURL("http://www.adresse.de/datei.txt")
####################
Soweit sogut, in 'str' steht nun der Dateiinhalt.
Aber: sobald die Datei geändert wird, wird 'str' scheinbar aus einem Speicher wiedergegeben, also der alte Inhalt. Erst ein Neustart des Servers hilft, übrigens arbeite ich mit NT4-Sp6a und IIS4.
Wie kann ich dieses Speichern verhindern, sodaß immer der aktuelle Inhalt geladen wird?
Vielen Dank für Eure Hilfe
Ernst
Hallo Ernst,
du solltest die Variable von vornherein "entleeren"
Mit folgendem Script lade ich den Inhalt einer Textdatei, von meiner Website in eine Variable, um diese dann auszuwerten.
#########################
Private Function GetURL(URL)
Set objHTTP = Server.CreateObject "Microsoft.XMLHTTP")
objHTTP.open "GET", URL, false
objHTTP.send
GetURL = objHTTP.ResponseText
Set objHTTP = Nothing
End Function
str = GetURL("http://www.adresse.de/datei.txt")
str = ""
####################
Ich weiss nicht ob ich es an die richtige stelle gesetzt habe,
ich habs so verstanden, das du die Funktion GetURL()
neu aufrufst. Ansonsten solltest du vor jedem neuzugriff
str "loeschen" wenn das gewuenscht ist.
Na toll, jetzt hat irgendjemand am Forum rumgespielt, jetzt ist meine ganze schoene lange Antwort floeten gegangen!! *argh*
Also Tach erstmal.
Ich weiss nicht ob ich es an die richtige stelle gesetzt habe,
ich habs so verstanden, das du die Funktion GetURL()
neu aufrufst. Ansonsten solltest du vor jedem neuzugriff
str "loeschen" wenn das gewuenscht ist.
Nein, das ist Quatsch. str wird sowieso beim GetURL-Aufruf neu beschrieben. Setzt Dich mal mit den Grundlagen der gaengigen Programmiersprachen auseinander.
Es sieht so aus, wie wenn die Seite irgendwo gecacht wird, entweder vom Microsoft.XMLHTTP-Objekt oder vom IIS4. Da M$ schon immer ein sehr gespaltenes Verhaeltnis zu Caching-Techniken hatte (siehe z.B. den Thread </selfhtml/sfarchiv/1999_3/t05336.htm>), wuerde es mich nicht ueberraschen, wenn es sich hier um einen weiteren Bug handelt. Vielleicht laesst sich fuer den Request ja irgendwie angeben, dass saemtliche Caches umgangen werden sollen?
So long
Hallo
Ich weiss nicht ob ich es an die richtige stelle gesetzt habe,
ich habs so verstanden, das du die Funktion GetURL()
neu aufrufst. Ansonsten solltest du vor jedem neuzugriff
str "loeschen" wenn das gewuenscht ist.
Nein, das ist Quatsch. str wird sowieso beim GetURL-Aufruf neu beschrieben. Setzt Dich mal mit den Grundlagen der gaengigen Programmiersprachen auseinander.
Es sieht so aus, wie wenn die Seite irgendwo gecacht wird, entweder vom Microsoft.XMLHTTP-Objekt oder vom IIS4. Da M$ schon immer ein sehr gespaltenes Verhaeltnis zu Caching-Techniken hatte (siehe z.B. den Thread </selfhtml/sfarchiv/1999_3/t05336.htm>), wuerde es mich nicht ueberraschen, wenn es sich hier um einen weiteren Bug handelt. Vielleicht laesst sich fuer den Request ja irgendwie angeben, dass saemtliche Caches umgangen werden sollen?
Du solltest dich damit auseinandersetzen! Es ist immer sicherer
die benutzten Variablen neu zu definieren. Das Prozesshandling ist sowieso
nicht das sauberste, da sollte man jede "daemliche" moegliche Fehlerquelle
ausschliessen.
und schonmal was von globalen Variablen gehoert? igitt...
woher willst du wissen was die engine intern macht?
selbst wenn die Seite wirklich gecacht wird, hast du das Problem mit dem
neubeschreiben auch erschlagen.
Du solltest dich damit auseinandersetzen! Es ist immer sicherer
die benutzten Variablen neu zu definieren. Das Prozesshandling ist sowieso
nicht das sauberste, da sollte man jede "daemliche" moegliche Fehlerquelle
ausschliessen.
und schonmal was von globalen Variablen gehoert? igitt...
woher willst du wissen was die engine intern macht?
selbst wenn die Seite wirklich gecacht wird, hast du das Problem mit dem
neubeschreiben auch erschlagen.
Danke Sonja fuer Dein neuerliches Posting. Waere aber nicht noetig gewesen, da mir schon vorher klar war, dass Du nicht weisst, wovon Du redest. Haettest das also nicht extra noch untermauern muessen. Vielleicht solltest Du Dich besser auf Themen beschraenken, von denen Du was verstehst. Dein Beitrag zur Bildungspolitik (</selfaktuell/forum/?m=127075&t=24404>) z.B. war doch ganz ordentlich.
So long
Entweder du weisst nicht was ich meine oder
du weisst selbst nicht was du redest...
selbiges kann ich dir naemlich unterstellen.
Wieviele lauffaehige grosse Anwendungen hast du erstellt?
Ich weiss ganz genau was ich schreibe, soll ich erst noch
eine Literaturliste auffuehren?!
Meine Buecher hab ich, da wo ich bin, nicht dabei,
aber ich empfehle dir eins ueber "Operating Systems".
Das Themengebiet ist so gross, das ich keine Lust hab das
hier genau aufzufuehren wie in welchem Zusammenhang ich
zu meinen Behauptungen (ausser zusaetzlich der mir gemachten
Erfahrungen) komme.
Mag sein das es beim Caching nicht das Problem loest, aber
beim Programmieren von stabilen Anwendungen, gehoert das
zum Grundwissen.
Hier uebrigens ein Auszug, der nach MS Aussage Caching verhindert
-->
You have now prepared your IIS Application so that it won't cache your ASP pages. But this alone is not enough. At
the top of the .asp page that you do not want cached, add the following line:
<% Response.Expires=0 %>
Proxy Server Caching
To prevent the caching of Active Server Pages at the proxy server, add the following lines at the top of your .asp
page:
<% Response.cachecontrol="private" %>
To Enable caching, add the following to your page:
<% Response.cachecontrol="public" %>
<--
Und hier ist das vollstaendige Dokument zu sehen:
http://support.microsoft.com/support/kb/articles/Q189/4/09.ASP
Gruss Sonia
Ich vergass, selbiges hat ja Christian auch schon geschrieben
(nur ausfuehrlicher)
;-)
Entweder du weisst nicht was ich meine oder
du weisst selbst nicht was du redest...
selbiges kann ich dir naemlich unterstellen.
Wieviele lauffaehige grosse Anwendungen hast du erstellt?
Wenn Du mich beeindrucken willst, wirst Du schon mal etwas von Deinem Fachwissen an den Tag legen muessen. Mit (sinngemaess) "globale Variablen sind igitt" und insbesondere dem letzten Satz in Deiner Antwort auf mein erstes Posting in diesem Thread machst Du Dich jedoch schwer unglaubwuerdig.
Ich weiss ganz genau was ich schreibe, soll ich erst noch
eine Literaturliste auffuehren?!
Wahrscheinlich ist sie laenger als meine, und nun?
Das Buch, in dem steht, dass es sinnvoll ist, eine Variable zu "loeschen" (in diesem Fall: Nullstring zuweisen), bevor man ihr einen neuen Wert zuweist, weil sonst nicht sicher ist, dass der neue Wert auch wirklich drinsteht, ja, dieses Buch solltest Du mir mal nennen. Das ist schon deswegen totaler Quatsch, weil eine Null auch nur einer von vielen Werten ist, den nichts vor den anderen auszeichnet. Und Hardwarefehler, die es zu umschiffen gilt, willst Du ja wohl hoffentlich nicht anfuehren?
Meine Buecher hab ich, da wo ich bin, nicht dabei,
aber ich empfehle dir eins ueber "Operating Systems".
Das muss ja ein interessantes OS sein, das mir aus welchen Gruenden auch immer das Beschreiben einer Variable verweigert. Aber danke, ich weiss auch, wie ein OS funktioniert.
Das Themengebiet ist so gross, das ich keine Lust hab das
hier genau aufzufuehren wie in welchem Zusammenhang ich
zu meinen Behauptungen (ausser zusaetzlich der mir gemachten
Erfahrungen) komme.
Musst Du auch nicht, es sei denn, Dir liegt etwas daran, dass ich Dich fuer glaubwuerdig halte. Aber ich nehme mal an, dem ist nicht so.
Mag sein das es beim Caching nicht das Problem loest, aber
beim Programmieren von stabilen Anwendungen, gehoert das
zum Grundwissen.
Dass man eine Variable initialisiert, bevor man drauf zugreift, gehoert tatsaechlich zum Grundwissen. Um das zu wissen, brauche ich aber keine Buecher. Initialisieren bedeutet im uebrigen nicht, dass da unbedingt ein Nullwert rein muss, es kann auch gerne der Rueckgabewert einer Funktion sein, die rein zufaellig vielleicht den schoenen Namen GetURL traegt.
Hier uebrigens ein Auszug, der nach MS Aussage Caching verhindert
[ im wesentlichen, was Christian schrieb ]
Das verhindert das Cachen der generierten Seite, jedoch nicht das der Seite, die mit der GetURL-Funktion angefordert wird. Es waere jedoch denkbar, dass beim Fetchen der Seite gar kein Problem auftritt, sondern tatsaechlich nur der Output gecacht wird. Das beobachtete Ergebnis waere dasselbe. (Ernst koennte dies herausfinden, wenn er einfach immer eine Zufallszahl in der erzeugten Seite mit ausgibt. Aendert die sich, liegt das Problem beim Holen der Seite; bleibt sie gleich, wird der Output gecacht.) Wenn mich meine Erinnerung nicht truegt (ist schon ne Weile her), konnte ich das seinerzeit aber mit den genannten Header nicht abstellen (ISAPI caching war natuerlich aus). Daher habe ich das Verhalten als Bug eingestuft, auch weil es meist erst nach einer gewissen Zeit auftrat, waehrend es direkt nach einem Neustart des IIS gut funktionierte.
So long
Hallo,
ich denke wir koennen jetzt alle Geschuetze wieder einpacken...
:-))
heute nacht, wo man eigentlich schlafen sollte, ist mir
aufgegangen, das du und ich ganz unterschiedliche Sachen meinen.
Denn mir ist endlich aufgefallen was du meinst.
Klar, wenn eine Funktion eine Variable mit einem Wert fuellt, das
dann egal ist was vorher dringestanden hat. und ich meinte, wenn
man sie dann ausliest und keinen Wert darin erwartet (also 0), dann
sollte man auch dafuer sorgen, das sie 0 ist und nichts anderes.
wenn man zwischenzeitlich in einer anderen Funktion war... usw.. usw...
*gg
es fiel mir wie Schuppen aus den Haaren *bg
Sonia
P.S:
Wenn man eine Variable normal deklariert, darf man nicht davon
ausgehen, das der fuer sie reservierte Speicher leer ist und
sie damit 0 daher mein hinweis auf OS ->in hinsicht auf Speicherverwaltung
und so...
schwam drueber
Tach nochmal
P.S:
Wenn man eine Variable normal deklariert, darf man nicht davon
ausgehen, das der fuer sie reservierte Speicher leer ist und
sie damit 0 daher mein hinweis auf OS ->in hinsicht auf Speicherverwaltung
<besserwiss> Das kommt auf die Programmiersprache an, ich glaube, manche Basic-Dialekte tun dies doch; Delphi nullt definitiv globale Variablen und neue Objektinstanzen, lokale Variablen aber nicht. Vom OS wuerde ich eine Initialisierung nun ueberhaupt nicht erwarten. Schon aus Performancegruenden halte ich das fuer sinnlos (andererseits koennte man argumentieren, dass dadurch vermieden wird, dass man auf Daten von einem anderen bereits beendeten Prozess zugreifen kann...). In C kann man beim Reservieren von Heap-Brocken waehlen, was man will (malloc/calloc); wie es dort mit globalen Variablen steht, weiss ich nicht. Naja, laber blubb... *g* </besserwiss> ;-)
So long
*gg *gg
*gg
*gg
*gg *gg
*gg *gg
*gg*gg*g
HAllo,
Bei Stefan Falz steht das:
http://www.aspfaq.de
<%
Response.Expires = 0
Response.Expiresabsolute = Now - 10
Response.AddHeader "pragma","no-cache"
Response.AddHeader "cache-control","private"
%>
Diese Angaben sind für die Browser gedacht.
<% Response.CacheControl = "no-cache" %>
Diese Angabe wird im Normalfall nur von Proxy-Servern interpretiert.
Zur Sicherheit kann man noch Meta-Tags im Head der HTML-Ausgabe definieren:
<html>
<head>
<meta http-equiv="expires" content="0">
<meta http-equiv="cache-control" content="no-cache">
</head>
Gruss
Christian
Hallo Christian, Sonia, Calocybe,
ich hab zwischenzeitlich eine Lösung an anderer Stelle im Netz gefunden.
############
...
key = (ein eindeutiger Schlüssel, z.B. aus dem aktuellem Datum generiert)
str = GetURL("http://www.adresse.de/datei.txt?key")
############
Durch den eindeutigen und immer wechselden Wert von key wird der Cache tatsächlich umgangen. In meinem Fall reicht der Ausgabewert von =now, also ein Schlüssel, der sich alle Sekunde ändert.
Vielleicht fällt Euch ja noch eine elegantere Lösung ein, auf jeden Fall vielen Dank für Eure Überlegungen.
Gruß Ernst