Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi [IdHttpServer] Verhindern das ContentStream freigegeben wird (https://www.delphipraxis.net/138770-%5Bidhttpserver%5D-verhindern-das-contentstream-freigegeben-wird.html)

gsh 17. Aug 2009 12:17


[IdHttpServer] Verhindern das ContentStream freigegeben wird
 
Hallo Leute,

ich bin gerade dabei einen IdHttp Server in einem Windows Service zum laufen zu bekommen.
Dieser hat unter anderem die Aufgabe ein in einem MemoryStream gecachet Bild (wird beim Service Start geladen) über HTTP zur Verfügung zu stellen.

Dies funktioniert auch soweit ... aber nur beim ersten Mal. Beim zweiten Zugriff bekommt er eine AV.
Nach ein paar Tests stelle ich fest, dass der IdHttp meinen MemoryStream frei gibt und somit beim zweiten Mal nicht mehr darauf zugegriffen werden kann.

Meine Frage jetzt: Wie kann ich ihm sagen, dass er den Stream nicht freigeben soll. Ich will nicht, dass der Service das Bild bei jedem Request von der Festplatte laden muss.

Hier der Codeabschnitt:
Delphi-Quellcode:
  if ARequestInfo.Command = 'GET' then
  begin
    if ARequestInfo.Document = 'image.gif' then
    begin
      if MS_Image <> nil then
      begin
        AResponseInfo.ResponseNo := 200;
        AResponseInfo.ContentType := 'image/gif';
        AResponseInfo.ContentStream := MS_Image;
      end
      else
      begin
        AResponseInfo.ResponseNo := 404;
        AResponseInfo.ContentText := 'Not Found';
      end;
    end;
  end;

Assertor 17. Aug 2009 12:25

Re: [IdHttpServer] Verhindern das ContentStream freigegeben
 
Hi,

Zitat:

Zitat von gsh
Delphi-Quellcode:
  if ARequestInfo.Command = 'GET' then
  begin
    if ARequestInfo.Document = 'image.gif' then
    begin
      if MS_Image <> nil then
      begin
        AResponseInfo.ResponseNo := 200;
        AResponseInfo.ContentType := 'image/gif';
        // würd es so machen:
        AResponseInfo.ContentStream.Size := 0;
        AResponseInfo.ContentStream.CopyFrom(MS_Image, MS_Image.Size);      
        AResponseInfo.ContentStream.Position := 0;
      end
      else
      begin
        AResponseInfo.ResponseNo := 404;
        AResponseInfo.ContentText := 'Not Found';
      end;
    end;
  end;

Sollte damit funktionieren.

Edit: Blödsinn geschrieben...

Gruß Assertor

gsh 17. Aug 2009 12:39

Re: [IdHttpServer] Verhindern das ContentStream freigegeben
 
Also das Assign nicht geht hast du eh schon bemerkt :zwinker:
Deine nachbesserung funktioniert auch noch nicht ganz hat mich aber auf den richtigen Weg gebraucht:
Delphi-Quellcode:
if MS_Image <> nil then
      begin
        AResponseInfo.ResponseNo := 200;
        AResponseInfo.ContentType := 'image/gif';
        AResponseInfo.ContentStream := TMemoryStream.Create;
        MS_Image.Position := 0;
        AResponseInfo.ContentStream.CopyFrom(MS_Image, MS_Image.Size);
      end
      else
      begin
        AResponseInfo.ResponseNo := 404;
        AResponseInfo.ContentText := 'Not Found';
      end;
So funktioniert es. Danke :thumb:

Assertor 17. Aug 2009 12:44

Re: [IdHttpServer] Verhindern das ContentStream freigegeben
 
Hi Alex,

Zitat:

Zitat von gsh
Also das Assign nicht geht hast du eh schon bemerkt :zwinker:
Deine nachbesserung funktioniert auch noch nicht ganz hat mich aber auf den richtigen Weg gebraucht:

Richtig, hatte das nur kurz aus dem Kopf ohne Delphi vor der Nase runtergetippt :mrgreen:

Freut mich aber, daß es jetzt geht :)

Gruß Assertor


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 Uhr.

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