Ernst: IIS4 speichert ungewollt ASP Variable?!

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

  1. 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.

    1. 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

      1. 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.

        1. 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

          1. 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

            1. Ich vergass, selbiges hat ja Christian auch schon geschrieben
              (nur ausfuehrlicher)
              ;-)

            2. 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

              1. 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

                1. 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

                  1. *gg         *gg

                    *gg
                          *gg

                    *gg          *gg
                      *gg      *gg
                        *gg*gg*g

  2. 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

  3. 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