Vazamento de memória do servidor Delphi Datasnap usando TFileStream como valor de retorno
Eu preciso de uma função em um servidor de datasnap, que retorna um arquivo .zip. Então eu comecei com:
function TGetData.getZip (): TFileStream;
begin
result := TFileStream.Create('test.zip', fmOpenRead and fmShareDenyWrite);
end
Isso funciona bem, mas o datasnap não o libera, então recebo um erro de vazamento de memória.
Próxima tentativa: comecei em "TWebModule1.WebModuleAfterDispatch". Eu pensei que poderia ajudar a enviar minha resposta com "response.SendResponse;" e liberar meu stream por conta própria. Então aqui está uma versão curta:
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;
Esta é quase a solução que eu acho, mas o servidor datasnap envia o código html após o envio do meu fluxo e isso está escrito no final do arquivo.
Eu sei, o servidor datasnap não suporta TFileStream. Em vez disso, devo usar TDBXStreamValue, mas parece não haver exemplo de trabalho ...
Alguém tem experiência com esse problema?