TADOConnection
не удается подключиться в разделе инициализации приложения приложения Delphi ISAPI (TISAPIApplication
):
Приложение создано с помощью Delphi XE SPI под управлением Win 7 64/IIS 7.5 и WinServer 2008 RS2 — оно не может подключаться к ADO в глобальном контексте приложения ISAPI. (Пример кода использует MS-SQLServer OLEDB, но мы также не можем использовать поставщика Sybase ASE.)
Следующий код дает сбой при вызове conn.Open
- TADOConnection.open
никогда не возвращается - приложение ISAPI зависает в стиле la-la, никаких исключений не возникает:
library ISAPIBareBones;
uses
ActiveX,
ADODB,
(...)
var
conn: TADOConnection;
begin
CoInitFlags := COINIT_MULTITHREADED;
Application.Initialize;
coinitialize(nil);
conn := TADOConnection.Create(Application);
conn.ConnectionString := 'Provider=SQLOLEDB.1;xxx';
//Fails here:
try
conn.Open;
except on e:exception do
logException(e)
end;
Application.WebModuleClass := WebModuleClass;
Application.Run;
end.
Тот же код в конкретном обработчике запросов (Delphi webAction) работает нормально.
Мы подозреваем проблему с правами выполнения в IIS на уровне приложения ISAPI. Но, насколько мы можем судить, весь стек приложений IIS от самого веб-сервера до конкретного виртуального каталога и самой ISAPI dll работает под одними и теми же учетными данными с одинаковыми привилегиями выполнения.
Между тем, мой обходной путь заключался в том, чтобы инициализировать инфраструктуру базы данных из вызова ответа http (поток ISAPI), а затем просто проверять, инициализирована ли она при каждом последующем вызове. Это работает, но обременяет меня некоторыми ограничениями, с которыми я бы предпочел не иметь дело.
Как установить соединение с базой данных ADO в экземпляре TISAPIApplication
перед обработкой входящих запросов.