2
4

4 回答 4

4

这可能是 DataSnap 中的一个错误。我有完全相同的问题,这是 QC 报告。 http://qc.embarcadero.com/wc/qcmain.aspx?d=91180

对 QC 报告进行投票以修复并等待 Delphi-XE 的更新。

编辑 1 一个疯狂的想法,不要在客户端上指定过滤器。

这是 Pawel Glowacki 关于传输过滤器的论文。 http://edn.embarcadero.com/article/41293 他特别提到您应该将ZLibCompression添加到客户端DataSnap驱动程序的Filters属性中。

我已经测试过不要这样做,它工作得很好。您必须将 DBXCompressionFilter 添加到 uses 子句,否则您会收到“ZLibCompression 未注册”错误。

在服务器上使用 PC1 和 ZLibCompression 并且在客户端上没有过滤器,一切都可以按预期工作。我检查了流量,它是加密和压缩的。

直到 Embarcadero 的某个人确认这是应该的方式,在我使用它之前我会三思而后行。

编辑 2这是 Bob Swart 在 Embarcadero 论坛上发表的一篇文章,说在服务器上添加过滤器就足够了。不是 Embarcadero 直接但非常接近 :) https://forums.embarcadero.com/thread.jspa?threadID=48875&tstart=0

于 2011-02-21T10:13:28.157 回答
4

您还需要将 libeay32.dll 和 ssleay32.dll 与您的客户端应用程序一起部署。

引用我的 Delphi XE DataSnap 开发课件手册:

“如果您部署 DataSnap 独立服务器,使用 TCP/IP 以及 RSA 和 PC1 过滤器,那么您还必须部署两个 Indy 特定的 SSL DLL:libeay32.dll 和 ssleay32.dll——或者确保它们已经存在于服务器机器上。这些 DLL 是 RSA 过滤器(加密 PC1 过滤器使用的密码)所必需的。没有这两个 DLL,任何想要连接到服务器的客户端都会收到“Connection Closed Gracefully”消息,因为服务器无法加载两个 DLL 以启动 RSA 过滤器以加密 PC1 密钥等。

顺便说一句,任何 DataSnap 客户端都需要相同的两个 DLL,无论是使用 RSA 和 PC1 过滤器连接到 TCP/IP 服务器,还是使用 HTTPS 连接到 ISAPI 过滤器。”

Groetjes,鲍勃·斯沃特

于 2011-02-18T07:52:40.560 回答
3

直到 Embarcadero 的某个人确认这是应该的方式,在我使用它之前我会三思而后行。

这是真实的。如果您未在客户端上指定过滤器,则在连接期间的初始握手协议中会告知服务器的过滤器是什么,并自动添加它们。这是使用过滤器的一种完全合理且安全的方式。

但是请注意,反过来,情况并非如此。服务器不采用来自连接客户端的过滤器。如果您在客户端上有一个 RSA 过滤器,但在服务器上没有匹配的过滤器,那么您将在连接时收到异常,说服务器没有匹配的 RSA 过滤器。客户端上但不在服务器上的任何其他过滤器都将被忽略。

于 2011-03-18T19:17:50.323 回答
2

尝试颠倒过滤器的顺序,让客户端始终与服务器相反。例如

Server
     Filters = <
       item
         FilterId = 'ZLibCompression'
         Properties.Strings = (
           'CompressMoreThan = 1024')
       end
       item
         FilterId = 'PC1'
         Properties.Strings = (
           'Key = test')
       end>

Client
         Params.Add ('Filters = {"PC1": {"Key": "test"}, "ZLibCompression": {"CompressMoreThan": "1024"}}');
于 2012-10-31T13:00:59.217 回答