No se pueden recuperar TStreams de más de 260,000 bytes de un servidor Datasnap
Tengo un servidor Delphi 10.1 Berlin Datasnap, que no puede devolver paquetes de datos (a través de un TStream) de más de 260,000 bytes.
Lo he programado siguiendo el\ Object Pascal \ DataSnap \ FireDAC muestra de Delphi, que también muestra este problema.
El problema se puede ver simplemente abriendo esa muestra, poniendo en blanco el IndexFieldName del componente qOrders en ServerMethodsUnit.pas y cambiando su propiedad SQL a:
select * from Orders
union
select * from Orders
Ahora la cantidad de datos a enviar está más allá de 260,000 bytes, que parece ser el punto donde no puede recuperarlos del cliente. Obteniendo una EFDException [FireDAC] [Stan] -710. Formato de almacenamiento binario no válido.
Los datos se envían como un flujo que se obtiene de un FDSchemaAdapter en el servidor y se carga en otro FDSchemaAdpater en el cliente. La conexión entre el Cliente y el Servidor también es FireDAC.
Así es como el servidor devuelve ese flujo:
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;
Y así es como el Cliente lo 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;
El Cliente no obtiene todos los datos en el parámetro Blob. Guardo el contenido de Stream en el servidor y el contenido que llega al parámetro Blob en el Cliente, y tienen el mismo tamaño, pero el contenido del parámetro Blob tiene su contenido truncado y los últimos Kbytes son ceros .
Así es como guardo en el servidor el contenido que irá a Stream:
FDSchemaAdapter.SaveToFile('C:\Temp\JSON_Server.json', TFDStorageFormat.sfJSON);
Así es como verifico lo que obtengo en el parámetro de blob del Cliente:
TFile.WriteAllText('C:\Temp\JSON_Client.json', FDStoredProcGet.Params[0].asBlob);
Puedo ver que el Cliente obtiene los datos truncados.
¿Sabes cómo solucionarlo o una solución alternativa para recuperar todo el contenido de Stream del Servidor Datasnap a mi Cliente?
Actualizar: He actualizado a Delphi 10.1 Berlin Update 2, pero el problema persiste.
Gracias.