/ / TStream з Datasnap Rest and Close-session - відпочинок, delphi, сеанс, datasnap

TStream з файлом Datasnap Rest і Close-session - відпочинок, delphi, session, datasnap

Я будую додаток REST datasnap і не можу закрити сеанс.

Наприклад, якщо я 4 рази дзвоню свою URL-адресу у своєму веб-браузері: http://127.0.0.1:4445/REST/image?json=false

Відкрито 4 сеанси.

Ось моя функція:

function TV1.TestImage:TStream;
var
ContentType : String;
FileStream : TFileStream;
begin
FileStream := TFileStream.Create("C:santiago.jpg", fmOpenRead or fmShareDenyNone);
ContentType := "image/jpg";

GetInvocationMetadata.ResponseContentType := ContentType;
ContentTypeHeaderToUse := ContentType;
GetInvocationMetadata().ResponseCode := 200;

result := FileStream;

//Can"t call CloseSession with TStream, pointer exception
//GetInvocationMetaData.CloseSession := True;

end;

І я використовую WebModuleAfterDispatch таким чином:

  procedure TWebModule2.WebModuleAfterDispatch(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var session : TDSSession;
begin
response.FreeContentStream := true;

if ContentTypeHeaderToUse<>"" then begin
Response.ContentType := ContentTypeHeaderToUse;
ContentTypeHeaderToUse := ""; // Reset global variable
end;

end;

Як ти бачиш, GetInvocationMetaData.CloseSession := True; тут не можна використовувати

Чи знаєте ви, як закрити сеанс після надсилання TStream?

Відповіді:

0 для відповіді № 1

На сервері REST я вважаю за краще повернути рядок base64, мати справу з простішою для клієнтського додатка, ніж представлення JSON Delphi TStream (масив байтів).

Функція EncodeBase64 на пристрої Soap.EncdDecd перетворення робить дуже легко:

function TV1.TestImage:string;
var MemoryStream: TMemoryStream;
begin
MemoryStream := TMemoryStream.Create;
MemoryStream.LoadFromFile("C:santiago.jpg");
Result := EncodeBase64(MemoryStream.Memory, MemoryStream.Size);
MemoryStream.Free; // Now you can free the Stream yourself
end;

Додатковою перевагою є те, що тепер можна звільнитиваш потік і не залежить від Datasnap, що це робить. Таким чином, ви повинні мати можливість вручну закрити з'єднання без виключення з цього вказівника та вирішити проблему, коли кілька сеансів залишаються відкритими.

Ви можете безпосередньо використовувати цей рядок зображень base64 у своєму веб-додатку. Вам потрібно лише додати їх тип на початку тегу <img>.

Приклад:

<img src="/images/data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEVBMTczNDg3QzA5MTFFNjk3ODM5NjQyRjE2RjA3QTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEVBMTczNDk3QzA5MTFFNjk3ODM5NjQyRjE2RjA3QTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowRUExNzM0NjdDMDkxMUU2OTc4Mzk2NDJGMTZGMDdBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowRUExNzM0NzdDMDkxMUU2OTc4Mzk2NDJGMTZGMDdBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjjUmssAAAGASURBVHjatJaxTsMwEIbpIzDA6FaMMPYJkDKzVYU+QFeEGPIKfYU8AETkCYI6wANkZQwIKRNDB1hA0Jrf0rk6WXZ8BvWkb4kv99vn89kDrfVexBSYgVNwDA7AN+jAK3gEd+AlGMGIBFDgFvzouK3JV/lihQTOwLtOtw9wIRG5pJn91Tbgqk9kSk7GViADrTD4HCyZ0NQnomi51sb0fUyCMQEbp2WpU67IjfNjwcYyoUDhjJVcZBjYBy40j4wXgaobWoe8Z6Y80CJBwFpunepIzt2AUgFjtXXshNXjVmMh+K+zzp/CMs0CqeuzrxSRpbOKfdCkiMTS1VBQ41uxMyQR2qbrXiiwYN3ACh1FDmsdK2Eu4J6Tlo31dYVtCY88h5ELZIJJ+IRMzBHfyJINrigNkt5VsRiub9nXICdsYyVd2NcVvA3ScE5t2rb5JuEeyZnAhmLt9NK63vX1O5Pe8XaPSuGq1uTrfUgMEp9EJ+CQvr+BJ/AAKvAcCiAR+bf9CjAAluzmdX4AEIIAAAAASUVORK5CYII=">