Delphi XE - Проблемы с фильтром данных - PullRequest
2 голосов
/ 18 февраля 2011

У меня есть сервер tcp / ip Datasnap -XE, использующий фильтр PC1 и Zlib

На клиенте оба эти фильтра определены в DataSnap TSqlConnection

Когда клиент подключается к серверу, я получаю «Изящное соединение закрыто» Сообщение об ошибке

Если я использую только фильтр PC1 - нет проблем

Если я использую только фильтр Zlib - нет проблем

Есть идеи, как заставить оба фильтра работать одновременно?

Ответы [ 4 ]

3 голосов
/ 21 февраля 2011

Вероятно, это ошибка в DataSnap.У меня точно такая же проблема, и вот отчет QC.http://qc.embarcadero.com/wc/qcmain.aspx?d=91180

Голосуйте за исправление отчета о контроле качества и ждите обновления Delphi-XE.

Редактировать 1 Сумасшедшая идея, не устанавливайте фильтры наклиент.

Вот статья Павла Гловаки о транспортных фильтрах.http://edn.embarcadero.com/article/41293 Он специально упоминает, что вы должны добавить ZLibCompression в свойство Filters драйвера DataSnap на клиенте.

Я проверил, чтобы не делать этого, и он работает просто отлично,Вы должны добавить DBXCompressionFilter к предложению использования, в противном случае вы получите ошибку «ZLibCompression не зарегистрирован».

С ПК1 и ZLibCompression на сервере и без фильтра на клиенте все работает, как и ожидалось.Я проверил трафик, и он зашифрован и сжат.

Пока кто-то из Embarcadero не подтвердит, что так и должно быть, я дважды подумал бы, прежде чем его использовать.

Редактировать2 Вот пост на дискуссионных форумах Embarcadero Боба Сварта, в котором говорится, что достаточно , чтобы добавить фильтры на сервер.Не Embarcadero напрямую, но довольно близко :) https://forums.embarcadero.com/thread.jspa?threadID=48875&tstart=0

3 голосов
/ 18 марта 2011

Пока кто-то из Embarcadero не подтвердит, что так и должно быть, я дважды подумал бы, прежде чем использовать его.

Это правда. Если вы не указываете фильтры на клиенте, во время соединения в исходном протоколе квитирования сообщается, что такое фильтры сервера, и он добавляет их автоматически. Это совершенно разумный и безопасный способ использования фильтров.

Обратите внимание, однако, что это не так, наоборот. Серверы не принимают фильтры от подключающегося клиента. Если у вас есть фильтр RSA на клиенте, но нет соответствующего на сервере, тогда вы получите исключение при подключении, говоря, что на сервере нет соответствующего фильтра RSA. Любой другой фильтр на клиенте, но не на сервере, будет игнорироваться.

3 голосов
/ 18 февраля 2011

Вам также необходимо развернуть libeay32.dll и ssleay32.dll вместе с клиентским приложением.

Цитата из моего учебного руководства по Delphi XE DataSnap Development:

"Если вы развернетеАвтономный сервер DataSnap, использующий фильтры TCP / IP и фильтры RSA и PC1, затем необходимо также развернуть две специальные SSL-библиотеки Indy: libeay32.dll и ssleay32.dll - или убедиться, что они уже существуют на компьютере сервера. Эти библиотеки необходимы дляфильтр RSA (который шифрует пароль, используемый фильтром PC1). Без этих двух библиотек DLL любой клиент, желающий подключиться к серверу, получит сообщение «Соединение закрыто изящно», поскольку серверу не удалось загрузить две библиотеки DLL взапустить фильтр RSA для шифрования ключей PC1 и т. д.

Кстати, для любого клиента DataSnap потребуются одни и те же две библиотеки DLL, независимо от того, подключены ли они к серверу TCP / IP с использованием фильтров RSA и PC1, илиподключен ли он к фильтру ISAPI через HTTPS. "

Groetjes, Боб Сварт

2 голосов
/ 31 октября 2012

Попробуйте поменять порядок фильтров, оставив клиента всегда напротив сервера.например,

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