首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带有Datasnap Rest和Close会话的TStream

带有Datasnap Rest和Close会话的TStream
EN

Stack Overflow用户
提问于 2017-07-07 08:26:13
回答 1查看 866关注 0票数 1

我构建了一个datasnap应用程序,但无法关闭会话。

例如,如果我在web浏览器中调用我的网址4次:http://127.0.0.1:4445/REST/image?json=false

已打开4个会话。

下面是我的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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后关闭会话吗?

EN

回答 1

Stack Overflow用户

发布于 2017-07-07 13:13:42

在REST服务器上,我更喜欢返回一个base64字符串,与Delphi TStream (字节数组)的JSON表示相比,它更容易处理客户端应用程序。

Soap.EncdDecd单元上的EncodeBase64函数可以非常轻松地完成转换:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 >标记的开头添加它们的类型。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<img src="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEVBMTczNDg3QzA5MTFFNjk3ODM5NjQyRjE2RjA3QTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEVBMTczNDk3QzA5MTFFNjk3ODM5NjQyRjE2RjA3QTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowRUExNzM0NjdDMDkxMUU2OTc4Mzk2NDJGMTZGMDdBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowRUExNzM0NzdDMDkxMUU2OTc4Mzk2NDJGMTZGMDdBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjjUmssAAAGASURBVHjatJaxTsMwEIbpIzDA6FaMMPYJkDKzVYU+QFeEGPIKfYU8AETkCYI6wANkZQwIKRNDB1hA0Jrf0rk6WXZ8BvWkb4kv99vn89kDrfVexBSYgVNwDA7AN+jAK3gEd+AlGMGIBFDgFvzouK3JV/lihQTOwLtOtw9wIRG5pJn91Tbgqk9kSk7GViADrTD4HCyZ0NQnomi51sb0fUyCMQEbp2WpU67IjfNjwcYyoUDhjJVcZBjYBy40j4wXgaobWoe8Z6Y80CJBwFpunepIzt2AUgFjtXXshNXjVmMh+K+zzp/CMs0CqeuzrxSRpbOKfdCkiMTS1VBQ41uxMyQR2qbrXiiwYN3ACh1FDmsdK2Eu4J6Tlo31dYVtCY88h5ELZIJJ+IRMzBHfyJINrigNkt5VsRiub9nXICdsYyVd2NcVvA3ScE5t2rb5JuEeyZnAhmLt9NK63vX1O5Pe8XaPSuGq1uTrfUgMEp9EJ+CQvr+BJ/AAKvAcCiAR+bf9CjAAluzmdX4AEIIAAAAASUVORK5CYII=">
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44966028

复制
相关文章
REST 使用 Web 会话(Sessions)
可以启用 REST 服务以使用 Web 会话。本章描述了为什么以及如何做到这一点。
用户7741497
2022/08/05
3410
带有 Python REST Web 服务示例的 REST API 快速入门指南
它是一种架构风格,一组用于标准化 Web 的规则,以保持全球 Web 应用程序的一致性。它旨在增强 Web 应用程序的可维护性、可扩展性、可靠性和可移植性。
玖柒的小窝
2021/10/06
2.2K0
Delphi XE5中的新增内容
Delphi XE5是所有Delphi开发人员的必须备升级,并且是来自Embarcadero的获奖的、多设备应用开发解决方案的最新版本。使用Delphi XE5的新特性,以交付应用Android、 iOS、Windows 和OS X。以PC机、平板电脑和智能手机为目标,更轻松地与更多数据连接 – 等等!
全栈程序员站长
2022/09/09
2.3K0
关于close和shutdown
我们知道TCP是全双工的,可以在接收数据的同时发送数据。 假设有主机A在和主机B通信,可以认为是在两者之间存在两个管道。就像这样: A ---------> B A <--------- B
xcywt
2022/05/09
1.4K0
delphi xe datasnap 服务器显示客户端,Delphi xe datasnap[通俗易懂]
function SaveData(aDataArr:array of OleVariant;
全栈程序员站长
2022/09/09
8730
C#中Dispose和Close的区别!
当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别? 首先,Dispose和Close基本上应该是一样的。Close是为了那些不熟悉Dispose的开发者设计的。因为基本上所有的developer都知道Close是干吗的(特别是对于那些有C++背景的developer)。 但是当我们写code时候,如果要实现Close和Dispose的时候,要注意Close和Dispose的设计模式。.net的
菩提树下的杨过
2018/01/22
1.5K0
带有Vagrant和Virtualbox的Elasticsearch集群
模拟分布式存储和计算环境的一种简单方法是将Virtualbox作为VM(“虚拟机”)的提供者,将Vagrant作为配置,启动和停止这些VM的前端脚本引擎。这篇文章的目标是构建一个集群虚拟设备,将Elasticsearch作为可由主机使用/控制的服务提供。可以从Github下载本文中使用的工件。
February
2018/11/26
1.5K0
rest和restful
开发了那么久,对接接口已经很老练了,但是对于rest和restful概念真的没有听过,而且也没有用过get、post之外的方法。
wade
2020/04/24
7380
搞清“连接”和“会话”
对Oracle中连接和会话的含义,总是有些模糊,参考TOM大叔的《Oracle编程艺术》,重新整理了下知识点。
bisal
2019/08/16
3.2K0
【EJB学习笔记】——有状态的会话Bean和无状态的会话Bean
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/50970565
DannyHoo
2018/09/13
1.2K0
RPC和REST的区别(转)
原文: http://pgoy.wordpress.com/2007/09/08/rpc%e5%92%8crest%e7%9a%84%e5%8c%ba%e5%88%ab%ef%bc%88%e5%8e%9f%e5%88%9b%ef%bc%89/
全栈程序员站长
2021/05/19
5780
C#中close(),flush()和dispose()区别 ?
Close()方法在这里就是关闭连接的意思,当我们使用完数据库或数据流的时候,就要用Close()方法把它们关闭,然后使用Dispose()方法进行释放,避免占用资源。但要注意,使用Close()方法仅仅只是关闭连接,资源并没有被释放。我们可以直接使用Dispose()方法,因为Dispose方法里面会判断当前连接是否关闭,如果没有关闭,就会调用Close()方法先关闭掉连接,然后再进行资源的释放。在using语句执行完毕之后,程序会自动调用Dispose()进行释放,不需要我们显式的调用Dispose()方法。
用户9127601
2022/11/28
1K0
对C#中的Close()和Dispose()的浅显理解
.net中的许多类都提供了Close()和Dispose()方法,一直以来我都以为它俩是一回事,是完全等价的,在任何地方,用其一即可,这一意识源于《NET设计规范:约定、惯用法与模式》一书中,P239和P240关于这俩方法的设计建议。按书中的字面理解,Close就应该设计为与Dispose一样的功能,是为了照顾自然语言的一种考量,的确对于有些类,说Close比说Dispose更符合用户的理解(如关闭连接、关闭流),所以这让我觉得Close就是作为Dispose的另一种使用渠道而存在,本来只需一个Dispose就够了,事实上我也没有因为随意使用它俩而造成过任何问题,所以一直以来没深究。
AhDung
2018/09/13
9720
TCP的TIME_WAIT和CLOSE_WAIT状态
很多面试中,特别是后端岗位,特别是和服务器相关岗位的面试中喜欢问这两个状态,首先回忆下这两个状态出现的时间,下面是三次握手和四次挥手的状态图
opencode
2022/12/26
7290
TCP的TIME_WAIT和CLOSE_WAIT状态
Discourse 的关闭主题(Close Topic )和重新开放主题
简单的来说就是如果一个主题长期不用或者时间过长了,DIscourse 可以进行关闭。
HoneyMoose
2022/08/09
2380
Discourse 的关闭主题(Close Topic )和重新开放主题
C#种Dispose和Close有什么不同
在 .NET 中有一个很有意思的现象,有些类中同时存在 Close 和 Dispose 两种释放资源的方法,那么它们哪一个更适合做资源清理呢?下面我就来解答一下。 以 SreamReader 为例,我们用 Reflector 来查看该类中的 Close 方法,会发现它其实就是调用 Dispose 方法,并传入参数值 true ,因此如果我们不使用 Using 语句清理资源的话(Using 语句块使用 Dispose 方法清理资源),手动调用 Close 方法的效果基本上和 Dispose 方法是一样的。这里有一点要提一下,使用 using 语句来调用 Dispose 方法,那么资源一定能被释放,如果希望在资源用完后马上释放的话,就必须手动调用 Close 方法。在这里 using 和 close 方法可以同时存在,但 close 必须在 using 语句快结束前调用。 那么, Close 和 Dispose 两个方法都一样,为什么两个都要存在呢?其实我们去看 Dispose 方法和 Close 方法的源码会发现, Dispose 比 Close 多了行 GC.SuppressFinalize(this) 代码,这行代码的意思是通知 GC 当发现 SreamReader 无引用根时不要将它放入队列中,这样就避免了终结器线程再次对它处理,这也减轻了终结器线程的负担。
喵叔
2022/01/11
1.6K0
聊聊Posix语义之open和close系统调用
系统调用 linux下任何进程针对文件类打开和释放资源大部分 都会涉及到系统调用,这里是针对文件相关的系统调用open和close.linux下open一个文件是返回的是一个文件描述符,这个文件描述符关联一个struct file,struct file是通过文件inode初始化而来;close系统调用把进程关联的fd对应的struct file资源给释放了,同时flush这个struct file对应的inode信息到磁盘。整个open和close操作都是通过system call->vfs->ext4这
用户4700054
2022/08/17
9840
聊聊Posix语义之open和close系统调用
实践解读CLOSE_WAIT和TIME_WAIT
CLOSE_WAIT和TIME_WAIT是如何产生的?大量的CLOSE_WAIT和TIME_WAIT又有何隐患?本文将通过实践角度来带你揭开CLOSE_WAIT和TIME_WAIT的神秘面纱!遇事不决先祭此图:
果冻虾仁
2021/12/08
1.4K0
实践解读CLOSE_WAIT和TIME_WAIT
1684: [Usaco2005 Oct]Close Encounter
1684: [Usaco2005 Oct]Close Encounter Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 387  Solved: 181 [Submit][Status][Discuss] Description Lacking even a fifth grade education, the cows are having trouble with a fraction problem from their textbook. Please
HansBug
2018/04/11
8750
REST API和GraphQL API的比较
REST(表述性状态传输)API 是一种应用程序接口 (API) 的架构风格,它使用 HTTP 请求来访问和使用数据。该数据可用于GET、PUT、POST和DELETE数据类型,指的是对资源的读取、更新、创建和删除操作。 RESTful API 使用 HTTP 方法在处理数据时执行 CRUD(创建、读取、更新和删除)过程。 为了促进缓存、AB 测试、身份验证和其他过程,标头向客户端和服务器提供信息。 主体包含客户端想要传输到服务器的数据,例如请求的有效负载。
用户4235284
2023/10/14
5800
REST API和GraphQL API的比较

相似问题

通过DataSnap将文件上载到TStream REST服务器

11

Delphi DataSnap函数返回TStream和内存泄漏

12

DataSnap XE2和TStream方法参数

20

Delphi XE8 Datasnap Server返回和释放TStream

11

Delphi XE2 DataSnap -通过TStream下载带有进度条的文件

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文