[英]TStream with Datasnap Rest and Close-session
我构建了一个数据快照REST应用程序,但无法关闭该会话。
例如,如果我在Web浏览器中调用URL 4次: http://127.0.0.1:4445/REST/image?json=false
: http://127.0.0.1:4445/REST/image?json=false
: 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后如何关闭会话吗?
在REST服务器上,我更喜欢返回base64字符串,对于客户端应用程序而言,它比Delphi TStream(字节数组)的JSON表示更容易处理。
Soap.EncdDecd单元上的EncodeBase64函数可以非常轻松地完成转换:
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;
另一个好处是您现在可以释放Stream,而不必依赖Datasnap进行发布。 因此,您应该能够在没有该指针异常的情况下手动关闭连接,并解决多个会话保持打开状态的问题。
您可以在Web应用程序上直接使用该base64图像字符串。 您只需要在<img>标记的开头添加其类型。
范例:
<img src="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEVBMTczNDg3QzA5MTFFNjk3ODM5NjQyRjE2RjA3QTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEVBMTczNDk3QzA5MTFFNjk3ODM5NjQyRjE2RjA3QTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowRUExNzM0NjdDMDkxMUU2OTc4Mzk2NDJGMTZGMDdBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowRUExNzM0NzdDMDkxMUU2OTc4Mzk2NDJGMTZGMDdBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjjUmssAAAGASURBVHjatJaxTsMwEIbpIzDA6FaMMPYJkDKzVYU+QFeEGPIKfYU8AETkCYI6wANkZQwIKRNDB1hA0Jrf0rk6WXZ8BvWkb4kv99vn89kDrfVexBSYgVNwDA7AN+jAK3gEd+AlGMGIBFDgFvzouK3JV/lihQTOwLtOtw9wIRG5pJn91Tbgqk9kSk7GViADrTD4HCyZ0NQnomi51sb0fUyCMQEbp2WpU67IjfNjwcYyoUDhjJVcZBjYBy40j4wXgaobWoe8Z6Y80CJBwFpunepIzt2AUgFjtXXshNXjVmMh+K+zzp/CMs0CqeuzrxSRpbOKfdCkiMTS1VBQ41uxMyQR2qbrXiiwYN3ACh1FDmsdK2Eu4J6Tlo31dYVtCY88h5ELZIJJ+IRMzBHfyJINrigNkt5VsRiub9nXICdsYyVd2NcVvA3ScE5t2rb5JuEeyZnAhmLt9NK63vX1O5Pe8XaPSuGq1uTrfUgMEp9EJ+CQvr+BJ/AAKvAcCiAR+bf9CjAAluzmdX4AEIIAAAAASUVORK5CYII=">
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.