Delphi XE - Datasnap Filter问题

时间:2011-02-17 21:46:46

标签: delphi delphi-xe datasnap

我有一个使用PC1和Zlib过滤器的tcp / ip Datasnap -XE服务器

在客户端上,这两个过滤器都在DataSnap TSqlConnection

中定义

当客户端连接到服务器时,我收到“正常关闭连接”错误消息

如果我自己只使用PC1过滤器 - 没有问题

如果我自己只使用Zlib过滤器 - 没有问题

关于如何让两个过滤器同时工作的任何想法?

4 个答案:

答案 0 :(得分:3)

您还需要在客户端应用程序中部署libeay32.dll和ssleay32.dll。

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

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

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

Groetjes,Bob Swart

答案 1 :(得分:3)

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

要求修复质量控制报告并等待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

答案 2 :(得分:3)

  

直到Embarcadero的某人证实这是应该的方式,我才会在使用之前三思而行。

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

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

答案 3 :(得分: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"}}');