Não é possível recuperar TStreams maiores que 260.000 bytes de um servidor Datasnap

Eu tenho um Delphi 10.1 Berlin Datasnap Server, que não pode retornar pacotes de dados (por meio de um TStream) maiores que 260.000 bytes.

Eu programei seguindo as\ Objeto Pascal \ DataSnap \ FireDAC amostra do Delphi, que também mostra esse problema.

O problema pode ser visto apenas abrindo esse exemplo, colocando em branco o IndexFieldName do componente qOrders no ServerMethodsUnit.pas e alterando sua propriedade SQL para:

select * from Orders
union 
select * from Orders

Agora, a quantidade de dados a serem enviados ultrapassa 260.000 bytes, o que parece ser o ponto em que você não pode recuperá-los do cliente. Obtendo uma exceção EFD [FireDAC] [Stan] -710. Formato de armazenamento binário inválido.

Os dados são enviados como um fluxo que você obtém de um FDSchemaAdapter no servidor e carrega em outro FDSchemaAdpater no cliente. A conexão entre cliente e servidor também é FireDAC.

É assim que o servidor retorna esse fluxo:

function TServerMethods.StreamGet: TStream;
begin
  Result := TMemoryStream.Create;
  try
    qCustomers.Close;
    qCustomers.Open;
    qOrders.Close;
    qOrders.Open;
    FDSchemaAdapter.SaveToStream(Result, TFDStorageFormat.sfBinary);
    Result.Position := 0;
  except
    raise;
  end;
end;

E é assim que o Cliente o recupera:

procedure TClientForm.GetTables;
var
  LStringStream: TStringStream;
begin
  FDStoredProcGet.ExecProc;
  LStringStream := TStringStream.Create(FDStoredProcGet.Params[0].asBlob);
  try
    if LStringStream <> nil then
    begin
      LStringStream.Position := 0;
      DataModuleFDClient.FDSchemaAdapter.LoadFromStream(LStringStream, TFDStorageFormat.sfBinary);
    end;
  finally
    LStringStream.Free;
  end;
end;

O cliente não obtém todos os dados no parâmetro Blob. Eu salvo o conteúdo do Stream no servidor e o conteúdo que chega no parâmetro Blob no cliente, e eles têm o mesmo tamanho, mas o conteúdo do parâmetro Blob tem o conteúdo truncado e os últimos Kbytes são zero. .

É assim que eu salvo no servidor o conteúdo que irá para o Stream:

FDSchemaAdapter.SaveToFile('C:\Temp\JSON_Server.json', TFDStorageFormat.sfJSON);

É assim que verifico o que recebo no parâmetro blob do cliente:

TFile.WriteAllText('C:\Temp\JSON_Client.json', FDStoredProcGet.Params[0].asBlob);

Eu posso ver que o cliente obtém os dados truncados.

Você sabe como corrigi-lo ou uma solução alternativa para recuperar todo o conteúdo do Stream do servidor Datasnap para o meu cliente?

Atualizar: Atualizei para o Delphi 10.1 Berlin Update 2, mas o problema permanece.

Obrigado.

questionAnswers(6)

yourAnswerToTheQuestion