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後關閉會話嗎?
你真的需要有會話?看起來應該將DSServerClass的Lifecycle屬性設置爲Server或Invocation。 –
我試圖把我的DSServerClass到服務器和調用,我有同樣的問題,會話數量增加。我不需要爲我的應用程序進行會話。從其他URL我沒有這個問題,它只是與TStream。 – OhYeah68
你如何檢查活動會話的數量?生命週期作爲服務器沒有會話,所以結果必須是錯誤的。無論如何,你確定要在REST服務器上返回一個Stream?,你的客戶端如何理解Stream(它是以字節數組的形式返回的,不是嗎?)。在非常相似的情況下,我返回一個字符串,用你的流內容的base64表示。您的客戶端應用程序更容易處理base64字符串,並且沒有任何對象可供Datasnap機制處理。 –