2017-07-07 97 views
0

我構建了一個datasnap REST應用程序,我無法關閉會話。Datasnap休息和關閉會話的TStream

例如,如果我打電話給我的網址在我的Web瀏覽器4次: 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

你真的需要有會話?看起來應該將DSServerClass的Lifecycle屬性設置爲Server或Invocation。 –

+0

我試圖把我的DSServerClass到服務器和調用,我有同樣的問題,會話數量增加。我不需要爲我的應用程序進行會話。從其他URL我沒有這個問題,它只是與TStream。 – OhYeah68

+0

你如何檢查活動會話的數量?生命週期作爲服務器沒有會話,所以結果必須是錯誤的。無論如何,你確定要在REST服務器上返回一個Stream?,你的客戶端如何理解Stream(它是以字節數組的形式返回的,不是嗎?)。在非常相似的情況下,我返回一個字符串,用你的流內容的base64表示。您的客戶端應用程序更容易處理base64字符串,並且沒有任何對象可供Datasnap機制處理。 –

回答

0

在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; 

另外一個好處是,你現在可以釋放你流,而不是依賴的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=">