Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ISAPI - DLL - Private Variablen (https://www.delphipraxis.net/147794-isapi-dll-private-variablen.html)

LD93 16. Feb 2010 14:45


ISAPI - DLL - Private Variablen
 
Hallo,

(leider hat mein PC den nichtabgeschickten Post geschreddert, deshalb etwas kürzer)

ich habe eine ISAPI-DLL Entwickelt, die Proxy spielt. Leider bekomme ich beim Laden einer Seite mit Bildern Probleme: Die Bilder werden nicht geladen, ein Druck auf F5 zeigt Wirres Zeug oder ein Bild (Statt der Website) an.

Vermutung: Die im Action-Teil (ich nutze die Delphi-TWebModule Komponente) definierten Variablen überschreiben sich. Kann das sein? Was kanns sonst sein?
Und vor allem: Was kann ich dagegen tuen?

mfg

D.

nahpets 16. Feb 2010 15:31

Re: ISAPI - DLL - Private Variablen
 
Hallo,

zeig' uns bitte den fraglichen Quelltext, die Fehlermöglichkeiten sind hier zu vielfältig, um sie theoretisch abzuhandeln.

Mavarik 16. Feb 2010 15:37

Re: ISAPI - DLL - Private Variablen
 
Hi!

Versucht Du die Bilder mit im HTTP-Stream zu senden oder per IMG Tag einzelrequest?

Mavarik

LD93 16. Feb 2010 20:40

Re: ISAPI - DLL - Private Variablen
 
Ok,
Delphi-Quellcode:


procedure TProxy.WebModule1WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
mem:tmemorystream;


www: TIdHTTP;
IdCookieManager1: TIdCookieManager;
Werte : TStringStream;

const
server='http://atom:81';
begin
    www:= TIdHTTP.Create(webmodule1);
    IdCookieManager1:= TIdCookieManager.Create(www);
    mem:=tmemorystream.Create;
[url]www.CookieManager:=[/url] IdCookieManager1;
[url]www.AllowCookies:=true;[/url]
    try

for i:=0 to request.CookieFields.Count-1 do
IdCookieManager1.AddCookie(request.CookieFields.Strings[i],'/');

werte:=TStringStream.Create(request.Content);

if uppercase(request.Method)='POST' then
www.Post(server+anfrage+request.Query ,werte,mem)
 else
 www.Get(server+anfrage+request.Query ,mem);


 for i:=0 to     IdCookieManager1.CookieCollection.Count-1 do

      with response.Cookies.Add do
            begin

             Name:=idCookieManager1.CookieCollection.Items[i].CookieName  ;
             Value:=     IdCookieManager1.CookieCollection.Items[i].value;
              expires:=(now)+1000;
              Path:='/';
              secure:=false;
            end;

mem.Position:=0;
response.ContentStream:=mem;
 response.SendResponse;
 response.ContentLength:=response.ContentStream.Size;
 finally
 mem.Free;
  [url]www.Free;[/url]
  IdCookieManager1.Free;
   werte.Free;
 end;
end;
ich hole darüber eine html-seite, worin wieder <img> Tags enthalten sind.
Der Code "klappt" ja auch, aber nur wenn ich nur eine Sache gleichzeitig mache...

nahpets 17. Feb 2010 07:20

Re: ISAPI - DLL - Private Variablen
 
Hallo,

den Server hast Du in einer Konstanten deklariert, aber woher kommt anfrage?
Delphi-Quellcode:
www.Post(server+anfrage+request.Query ,werte,mem)
Habe den Eindruck, dass das so, wie Du es gebaut hast, nicht threadsicher ist. Vermutlich wird die Routine für jede Anfrage aufgerufen, aber es ist nicht für jede Anfrage eine eigene Instanz verfügbar, so dass das Ergebnis eher als zufällig zu betrachten ist, da sich alle Anfragen die gleichen Variabeln "teilen" und alle immer mit den Werten arbeiten, die der "Letzte" den globalen Variabeln zugewiesen hat.
Globale Variabeln in ISAPI.DLL's sind tödlich (eigene Erfahrung ;-)).

LD93 17. Feb 2010 14:20

Re: ISAPI - DLL - Private Variablen
 
Bzgl. Anfrage: Da habe ich wohl zuviel beim posten zuviel gekürzt.
bei var:
anfrage:string;

und vor Werte:= kommt
anfrage:=Request.Pathinfo;


Das das Programm so nicht threadsicher ist vermute ich auch, aber ich dachte der IIS/whatever würde die einzelnen Teile so aufrufen,dass das klappt :glaskugel: - scheint ja nicht so.
Ich dachte ich hätte die Variablen so richtig privat deklariert :gruebel:

Ich wüsste gerne wie es richtig geht - weiß jemand Bescheid?

nahpets 17. Feb 2010 15:14

Re: ISAPI - DLL - Private Variablen
 
Hallo,

welche Delphiversion hast Du, meine mich daran erinnern zu können, das ISAPI-DLL's von älteren Delphiversionen nicht threadsicher sind, weil das Grundgerüst der DLL's einen Fehler enthält. Weiß aber nicht mehr, für welche Versionen das galt und wie man den Fehler wegbekommen konnt.

Ich glaube, es hing mit der Reihenfolge der in der DPR automatisch eingefügten Unit in der USES-Klausel zusammen.

Habe mal Google befragt und bin auf dieses hier gestoßen. Eventuell hilft Dir das ja weiter.

LD93 17. Feb 2010 15:44

Re: ISAPI - DLL - Private Variablen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich benutze Delphi 7, der trick mit dem Reihenfolge wechseln hat nichts gebracht, aber ich hab nen screenshot machen können.

und das coinitflag steht auf COINT_MULTITHERADED;

nahpets 17. Feb 2010 15:55

Re: ISAPI - DLL - Private Variablen
 
Hallo,

der Screenshot enthält ein Bitmap-Bild, stimmt der Contenttype? Müsste in diesem Fall image/bmp sein.

LD93 17. Feb 2010 15:59

Re: ISAPI - DLL - Private Variablen
 
dachte mir das das ein bild ist

sollte aber ne html seite sein ;)
von daher ist der content-type sogar richtiger als der inhalt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz