Delphi XE – Datasnap Filter problems

2019-04-01 20:00发布

问题:

I have a tcp/ip Datasnap -XE Server that uses a PC1 and Zlib filter

On the Client both of these filters are defined in DataSnap TSqlConnection

When the client connects to the server I get a "Connection Closed Gracefully” error message

If I only use the PC1 filter on its own - there is no problem

If I only use the Zlib filter on its own - there is no problem

Any Ideas on how I can get both filters working at the same time?

回答1:

You need to deploy the libeay32.dll and ssleay32.dll with your client application as well.

A quote from my Delphi XE DataSnap Development courseware manual:

"If you deploy the DataSnap standalone server, using TCP/IP and the RSA and PC1 filters, then you must also deploy two Indy specific SSL DLLs: libeay32.dll and ssleay32.dll – or make sure they already exist at the server machine. These DLLs are needed for the RSA filter (which encrypts the password used by the PC1 filter). Without these two DLLs, any client who wants to connect to the server will get an “Connection Closed Gracefully” message, because the server was unable to load the two DLLs to start the RSA filter to encrypt the PC1 keys, etc.

By the way, the same two DLLs will be required for any DataSnap client, whether connected to the TCP/IP server using the RSA and PC1 filters, or whether connected to the ISAPI filter using HTTPS."

Groetjes, Bob Swart



回答2:

It is probably a bug in DataSnap. I have exactly the same problem and here is the QC report. http://qc.embarcadero.com/wc/qcmain.aspx?d=91180

Vote on QC report to be fixed and wait for an update of Delphi-XE.

Edit 1 A crazy idea, don't specify filters on the client.

Here is a paper from Pawel Glowacki on Transport Filters. http://edn.embarcadero.com/article/41293 He specifically mentions that you should add ZLibCompression to the Filters property of the DataSnap driver on the client.

I have tested not to do so and it works just fine. You do have to add DBXCompressionFilter to the uses clause otherwise you get "ZLibCompression is not registered" error.

With PC1 and ZLibCompression on the server and no filter on the client everything seams to work as expected. I have checked the traffic and it is encrypted and compressed.

Until someone from Embarcadero confirms that this is the way it should be I would think twice before I used it.

Edit 2 Here is a post on Embarcadero Discussion Forums by Bob Swart saying that it is enough to add the filters on the server. Not Embarcadero directly but pretty close :) https://forums.embarcadero.com/thread.jspa?threadID=48875&tstart=0



回答3:

Until someone from Embarcadero confirms that this is the way it should be I would think twice before I used it.

This is true. If you don't specify filters on the client, it is told in the initial handshake protocol during connection what the server's filters are, and it adds them automatically. This is a perfectly reasonable and safe way to use filters.

Note, however, that this isn't true in the reverse. Servers do not adopt filters from a connecting client. If you have an RSA filter on the client but not a matching one on the server, then you will get an exception on connection, saying the server has no matching RSA filter. Any other filter on the client but not on the server will be ignored.



回答4:

Try reversing the order of the filters, leaving the client always contrary server. eg

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"}}');