- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在Delphi XE6中使用DataSnap传递和返回Stream?
当我调用服务器端方法时,我的流是正确的类,具有大小和位置。然而,当它到达我的客户时,该类不是我所期望的,并且它没有大小或位置
//客户端代码
procedure TForm1.brnGetReportClick(Sender: TObject);
var
RunReportObj: TRunReportObject;
S: TStream;
FS: TFileStream;
begin
....
try
S:= (ClientModule1.ServerMethods1Client.getReport(RunReportObj));
//ShowMessage('Class = ' + S.ClassName + #10#13 +
// 'Size = ' + intToStr(S.Size) + #10#13 +
// 'Position = ' + intToStr(S.Position));
S.Position:= 0;
FS:= TFileStream.Create('test.rpt', fmCreate or fmOpenWrite);
FS.Position:= 0;
try
FS.CopyFrom(S, S.Size);
finally
FS.Free;
end;
finally
S.Free
end;
end;
我在上面的代码中调试 showmessage,显示以下内容
Class = TDBXStreamReaderStream
Size = -1
Position = 0
//服务器端方法
function getReport(const ARunReportObj: TRunReportObject): TStream;
var
r: String;
SS: TStringStream;
begin
result:= TMemoryStream.Create;
r := getRunReportJSON(ARunReportObj);
SS := TStringStream.Create(r, TEncoding.ASCII);
try
try
ServerContainer1.idHttp1.Post
('https://imserver1.runit.com/isapi/isellitreporttest.dll/isellit', SS, result);
ShowMessage('Class = ' + Result.ClassName + #10#13 +
'Size = ' + intToStr(result.Size) + #10#13 +
'Position = ' + intToStr(result.Position));
Result.Position:= 0;
except
end;
finally
SS.Free;
end;
end;
我在上面的代码中调试 showmessage,显示以下内容
Class = TMemoryStream
Size = 373760
Position = 373760
最佳答案
这就是设计的。 DataSnap 仅保证您从服务器获取TStream
,而不保证它实际上是哪个类。您可以从中阅读,但仅此而已。
Position = 0
也是预期的,因为这是您在服务器中设置的。另一方面,我不确定 Position = 0
等其他内容是否有用,因此如果您在无论如何,客户端。虽然,当服务器之前没有将其设置为 0 时,流可能不会在预期位置开始。
对于 Size
属性,我引用了 TStream
文档:
The Size property typically indicates the size of the stream in bytes. But a descendent of TStream can use -1 to indicate an unknown size. When the size is unknown, use the return value from TStream.Read to determine end of the stream.
您应该知道,DataSnap 不一定会通过调用 getReport
来传输流内容,但当您从客户端调用 Read
时可能会这样做。这允许诸如电影或广播播客之类的无尽流。
关于delphi - 如何在Delphi XE6中使用DataSnap传递和返回Stream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37704286/
我的应用程序包含一个“网关”DataSnap REST 服务器,它是所有客户端的第一个访问点。根据客户端在请求中传递的用户名(基本身份验证),请求需要重定向到另一个 DataSnap 服务器。我的问题
DSTCPServerTransport.pas 中的“procedure TDSTCPChannel.Open”方法在分配“FChannelInfo”时使用连接用户的私有(private)IP 地址
我很好奇如何处理这个问题;我目前有一个带有 TDSAuthenticationManager 类管理身份验证的 DataSnap 服务器设置。 如果身份验证失败,我可以直接在 TMemo 或类似的表单
我正在使用 Delphi 10.1 Berlin Update 2 Enterprise 和 DataSnap 客户端/服务器 REST 框架。 如果我在不调试的情况下运行应用程序并调用用户无权调用的
我最近开始使用 Delphi 中的 DataSnap 来生成 RESTful Web 服务。在遵循 Marco Cantu 本人和互联网上其他几个人的指导后,我成功地使整个“链条”正常工作。 但是有一
我是一名业余程序员,尝试使用 Delphi XE 构建客户端/服务器应用程序套件。 我偶尔会编写独立应用程序以供个人使用。问题是我对网络/多层一无所知。不过我愿意学习。 我寻找方法来做到这一点,Dat
以下错误发生在我在下面指出的行中。我不明白为什么会出现此错误。 Project ChirpSR.exe raised exception class $C0000005 with message 'a
我希望能够声明具有以下签名的 Data Snap 方法 type TLoginInfo = record Username: string; Password: string;
我在 Delphi XE6 中有一个 datasnap 客户端/服务器 我在客户端的以下服务器方法调用中收到无效的指针操作。 S := ClientModule1.ServerMethods1Clie
我再次遇到这样的情况:我花费了大量的时间来尝试根据我的需要自定义 datasnap 回调示例。我是老派的 OOP 程序员,在我的“工具箱”PODO 风格中有几个非常大的对象层次结构:-) ..并且拥有
与编写DataSnap相比,使用DataSnap有哪些优势?肥皂服务器应用程序。 我知道Datasnap 可以使用TCP/IP 代替soap。 问候 桑迪普 最佳答案 使用 DataSnap,您可以导
一旦您使用正确的参数名称(Delphi Datasnap Server User Authentication 中进行了说明),Datasnap 身份验证就非常简单。下一个问题是在使用 FireDAC
我正在尝试找出“正确”的方法来从 DataSnap 应用程序的服务器建立到数据库的连接。 数据库中的每个(大多数)表都有名为“Updated”和“Created”(这是写入记录时的当前时间戳)的字段(
我试图在 DataSnap 服务器/客户端之间传输一些大流(~1Mb),但无济于事。我试图理解 Jim Tierney ( http://blogs.embarcadero.com/jimtierne
我正在研究将基于 SQL 的胖客户端 Delphi 应用程序迁移到多层瘦客户端,并且一直在考虑在 Delphi 2010 中使用 Datasnap。我已经阅读了 Bob Swart 撰写的白皮书并进一
我有一个 Delphi XE2 DataSnap 服务器(Windows 服务),连接到后端 MS SQL Server 2008(同一服务器框),为 REST 客户端请求提供服务。 一段时间以来,一
我们使用有状态的 DataSnap 服务器来执行某些业务逻辑任务,并提供客户端数据集数据。 如果我们必须更新服务器来修改业务规则,我们将新版本复制到一个新的空文件夹中并注册它(取决于 Delphi 版
我决定从 SOAP 服务器迁移到 DataSnap 服务器和 REST。我已经查看并遵循了几个教程,甚至尝试了 DXE5 演示,但我一直得到相同的结果。问题是我无法将客户端应用程序上的 TSQLCon
我有一个使用 PC1 和 Zlib 过滤器的 tcp/ip Datasnap -XE 服务器 在客户端上,这两个过滤器都是在 DataSnap TSqlConnection 中定义的 当客户端连接到服
我有一个 Datasnap 应用程序(Delphi 7),它使用 TSocketConnectiom 连接到应用程序服务器。如果我的应用程序在打开客户端数据集后长时间保持空闲状态,大多数时候当我想刷新
我是一名优秀的程序员,十分优秀!