Утечка памяти сервера Delphi Datasnap с использованием TFileStream в качестве возвращаемого значения

мне нужна функция на сервере datasnap, которая возвращает файл .zip. Итак, я начал с:

function TGetData.getZip (): TFileStream;
begin
   result := TFileStream.Create('test.zip', fmOpenRead and fmShareDenyWrite);
end

Это отлично работает, но datasnap не освобождает его, поэтому я получаю ошибку утечки памяти.

Следующая попытка: я начал с «TVWebModule1.WebModuleAfterDispatch». Я подумал, что это может помочь отправить мой ответ с помощью «response.SendResponse;» и бесплатно мой поток самостоятельно. Итак, короткая версия:

procedure TWebModule1.WebModuleAfterDispatch(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
   test : TFileStream;
begin
   response.ContentType := 'application/x-zip-compressed';
   test := TFileStream.Create('test.zip', fmOpenRead);
   response.ContentStream := test;
   response.CustomHeaders.Values['Content-Disposition'] := 'attachment; filename=test12.zip';
   response.SendResponse; //Also sendStream didn't help
   test.Free;
end;

Это почти решение, я думаю, но сервер datasnap отправляет html-код после того, как мой поток был отправлен, и это написано в конце файла.

Я знаю, что сервер datasnap не поддерживает TFileStream. Вместо этого я должен использовать TDBXStreamValue, но, похоже, нет рабочего примера...

Есть ли у кого-нибудь опыт с такой проблемой?


person ChessDev    schedule 30.09.2016    source источник
comment
Какой HTML записывается в конце файла?   -  person Remy Lebeau    schedule 01.10.2016
comment
См. раздел Параметры потока метода сервера DataSnap.   -  person Remy Lebeau    schedule 01.10.2016
comment
HTML-часть содержит ответную информацию, такую ​​как код ответа (в примере 200), тип контента и т.д.   -  person ChessDev    schedule 01.10.2016
comment
Это не HTML, это HTTP, и я считаю очень маловероятным, что такие данные когда-либо будут записаны в конец файла. Это означало бы, что DataSnap не обнаруживает, что SendResponse() уже был вызван, и пытается отправить второй ответ. Что касается TFileStream, в документации конкретно указано, что TFileStream можно использовать для ContentStream, так почему вы думаете, что это не поддерживается? Потому что не освобождается? Это будет другой баг. Например, вы уже пробовали установить response.FreeContentStream := true;?   -  person Remy Lebeau    schedule 01.10.2016


Ответы (1)


Спасибо @remy lebeau

response.FreeContentStream := true;

это решение.

Моя функция:

function TGetData.articleZippedImages(skip, take: Integer; since: string) : TStream;

функция не освобождает поток!

procedure TWebModule1.WebModuleAfterDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
   response.FreeContentStream := true;
   Response.Content := '';
   Response.CustomHeaders.Values['Content-Disposition'] := 'attachment; filename=test.zip';
   Response.SendResponse;
end;
person ChessDev    schedule 04.10.2016