Delphi XE - Проблемы с фильтром данных
У меня есть tcp/ip Datasnap -XE Server, который использует фильтр PC1 и Zlib
На клиенте оба эти фильтра определены в DataSnap TSqlConnection
Когда клиент подключается к серверу, я получаю сообщение об ошибке "Соединение закрыто изящно"
Если я использую только фильтр PC1 сам по себе - нет проблем
Если я использую только фильтр Zlib - нет проблем
Любые идеи о том, как я могу заставить оба фильтра работать одновременно?
4 ответа
Вам также необходимо развернуть libeay32.dll и ssleay32.dll вместе с клиентским приложением.
Цитата из моего учебного руководства по Delphi XE DataSnap Development:
"Если вы развертываете автономный сервер DataSnap, используя TCP/IP и фильтры RSA и PC1, то вы также должны развернуть две специфичные для Indy DLL-библиотеки SSL: libeay32.dll и ssleay32.dll - или убедиться, что они уже существуют на компьютере сервера. Эти библиотеки DLL необходимы для фильтра RSA (который шифрует пароль, используемый фильтром PC1). Без этих двух библиотек DLL любой клиент, который хочет подключиться к серверу, получит сообщение "Соединение закрыто изящно", поскольку сервер не смог загрузите две библиотеки DLL, чтобы запустить фильтр RSA для шифрования ключей PC1 и т. д.
Кстати, те же две библиотеки DLL будут необходимы для любого клиента DataSnap, независимо от того, подключен ли он к серверу TCP/IP с использованием фильтров RSA и PC1 или подключен к фильтру ISAPI с использованием HTTPS ".
Groetjes, Боб Сварт
Это, вероятно, ошибка в DataSnap. У меня точно такая же проблема, и вот отчет QC. http://qc.embarcadero.com/wc/qcmain.aspx?d=91180
Проголосуйте за исправление отчета QC и дождитесь обновления Delphi-XE.
Редактировать 1 Сумасшедшая идея, не указывайте фильтры на клиенте.
Вот статья Павла Гловаки о транспортных фильтрах. http://edn.embarcadero.com/article/41293 Он специально упоминает, что вы должны добавить ZLibCompression к свойству Filters драйвера DataSnap на клиенте.
Я проверил, чтобы не сделать это, и это работает просто отлично. Вы должны добавить DBXCompressionFilter к предложению использования, в противном случае вы получите сообщение об ошибке "ZLibCompression не зарегистрирован".
С PC1 и ZLibCompression на сервере и без фильтра на клиенте все работает нормально. Я проверил трафик, и он зашифрован и сжат.
Пока кто-то из Embarcadero не подтвердит, что так и должно быть, я дважды подумал бы, прежде чем использовать его.
Редактировать 2 Вот пост на дискуссионных форумах Embarcadero Боба Сварта, в котором говорится, что достаточно добавить фильтры на сервер. Не Embarcadero напрямую, но довольно близко:) https://forums.embarcadero.com/thread.jspa?threadID=48875&tstart=0
Пока кто-то из Embarcadero не подтвердит, что так и должно быть, я дважды подумал бы, прежде чем использовать его.
Это правда. Если вы не указываете фильтры на клиенте, во время подключения в исходном протоколе квитирования сообщается, что такое фильтры сервера, и он добавляет их автоматически. Это совершенно разумный и безопасный способ использования фильтров.
Обратите внимание, однако, что это не так в обратном направлении. Серверы не принимают фильтры от подключающегося клиента. Если у вас есть фильтр RSA на клиенте, но нет соответствующего на сервере, тогда вы получите исключение при подключении, говоря, что на сервере нет соответствующего фильтра RSA. Любой другой фильтр на клиенте, но не на сервере, будет игнорироваться.
Попробуйте поменять порядок фильтров, оставив клиента всегда напротив сервера. например
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"}}');