Как я могу установить соединения с базой данных ADO в «TISAPIApplication» перед обработкой входящих запросов? - PullRequest
2 голосов
/ 01 сентября 2011

TADOConnection не удается подключиться в разделе инициализации приложения Delphi ISAPI App (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 все работают под одинаковыми учетными данными с одинаковыми привилегиями выполнения.

Тем временем мой обходной путь состоял в том, чтобы инициализировать инфраструктуру базы данных из ответного вызова http (поток ISAPI), а затем просто проверять, инициализируется ли он при каждом последующем вызове.Это работает, но обременяет меня некоторыми ограничениями, с которыми я предпочел бы не иметь дело.

Как я могу установить соединения с базой данных ADO в экземпляре TISAPIApplication до обработки входящих запросов.

Ответы [ 2 ]

3 голосов
/ 16 января 2015

Часть dll begin ... end или initialization является Delphi-эквивалентом dllmain в C ++.Таким образом, применяются те же ограничения, включая:

  • Не вызывать CoInitialize
  • Не вызывать функции COM

Это означает, что вы не можете создать ADOсоединение.

Знаете ли вы все, что происходит, когда вы звоните TADOConnection.Create(Application);?

Так что то, что вы пытаетесь сделать, не сработает.И даже если это так, вы не должны этого делать.Вот несколько лучших объяснений:

http://msdn.microsoft.com/en-us/library/ms682583%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx
http://blogs.msdn.com/b/oldnewthing/archive/2004/01/27/63401.aspx
http://blogs.msdn.com/b/oldnewthing/archive/2004/01/28/63880.aspx
http://blogs.msdn.com/b/oldnewthing/archive/2014/08/21/10551659.aspx

MSDN предлагает создать соединение с базой данных в GetExtensionVersion.Вот как инициализируется ваша isapi dll.Это не только для сообщения о версии расширения.Так что это путь.Создайте свою собственную функцию GetExtensionVersion, которая инициализирует вашу базу данных, а затем вызовите предыдущую функцию Delphi.

library Project1;

uses
  Winapi.ActiveX,
  System.Win.ComObj,
  Web.WebBroker,
  Web.Win.ISAPIApp,
  Web.Win.ISAPIThreadPool,
  Winapi.Isapi2,
  Winapi.Windows,
  WebModuleUnit1 in 'WebModuleUnit1.pas' {WebModule1: TWebModule};

{$R *.res}

function GetExtensionVersion(var Ver: THSE_VERSION_INFO): BOOL; stdcall;
begin
  Result := Web.Win.ISAPIApp.GetExtensionVersion(Ver);
  // create your ado connection here
end;


exports
  GetExtensionVersion,
  HttpExtensionProc,
  TerminateExtension;

begin
  CoInitFlags := COINIT_MULTITHREADED;
  Application.Initialize;
  Application.WebModuleClass := WebModuleClass;
  Application.Run;
end.
2 голосов
/ 01 сентября 2011

Я думаю, что проблема в том, что код, который вы запускаете, выполняется в основной процедуре dll.Эта часть инициализации очень ограничительна, например, вы не можете загружать никакие dll или вам разрешено вызывать CoInitialize (см. http://msdn.microsoft.com/en-us/library/ms678543%28v=vs.85%29.aspx). Все ваши ActiveX-файлы вызовут некоторые проблемы, которые, скорее всего, являются причиной вашего исключения.

...