在处理传入请求之前,如何在“TISAPIApplication”中建立 ADO 数据库连接?

2023-12-14

TADOConnectionDelphi ISAPI 应用程序的应用程序初始化部分无法连接(TISAPIApplication):

应用程序是使用 Delphi XE SPI 构建的,运行 Win 7 64/IIS 7.5 和 WinServer 2008 RS2 - 它无法在全局 ISAPI 应用程序上下文中与 ADO 连接。 (示例代码使用 MS-SQLServer OLEDB - 但我们使用 Sybase ASE 提供程序也失败。)

以下代码在以下情况下失败conn.Open叫做 -TADOConnection.open永不返回 - ISAPI 应用程序在 la-la land 中挂起,没有引发异常:

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 应用程序级别的执行权限存在问题。但据我们所知,从 web 服务器本身到特定虚拟目录以及 ISAPI dll 本身的整个 IIS 应用程序堆栈都在具有相同执行权限的相同凭据下运行。

同时,我的解决方法是从 http 响应调用(ISAPI 线程)中初始化数据库基础结构,然后简单地检查它是否在每个后续调用中初始化。这可行,但给我带来了一些我不想处理的限制。

如何在 ADO 中建立数据库连接TISAPIApplication例如,在处理传入请求之前。


The begin ... end or an initializationdll 的一部分在 Delphi 中相当于 C++ 中的 dllmain。因此,同样的限制也适用,包括:

  • 不要调用 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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在处理传入请求之前,如何在“TISAPIApplication”中建立 ADO 数据库连接? 的相关文章

随机推荐

  • 赋值运算符重载被跳过/没有发生

    我正在尝试为某些工作创建一个库 并使用运算符重载进行赋值操作 假设 X 和 Y 是 重载的类的两个实例 A A operator A rhs A assign this rhs return this 当我这样做时 A z z x y x
  • 删除一列中的值等于另一列中的值的行

    我正在努力弄清楚如何从 pandas 数据框中删除行 其中两个指定的列在一行中具有相同的值 例如 在下面的示例中 我想删除第 2 列和第 4 列中具有重复值的行 例如 Column1 Column2 Column3 Column4 Pat
  • jquery 简单地对 div 内的 css 背景图像进行动画/旋转?

    我想知道是否有人可以帮助我 或者为我指出正确的方向 我正在寻找一个 jquery 片段 它将每隔 5 秒左右自动更改 div 的背景图像 我的初始背景图像是在 css 中设置的 但我不确定如何创建函数以使其在图像数组之间交换 我有 5 张图
  • 如何连接在线DB Xamarin? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 请告诉我如何从在线数据库 表 中检索数据 我刚刚创建了一个表在此输入链接描述 我制作了一个 SQL 数据库 谁能告诉我如何从中检索数据 强烈建议您不要直接从 Xamarin 连接
  • 在 Android 上使用 URL 会抛出 IOException:格式错误的 ipv6 地址

    我想将android模拟器上的数据发送到本地主机web 并得到一些结果 String temp http 10 0 2 2 8888 json rec user data user data friends friends URL url
  • 无法检索 Google 群组的成员,获取无效输入

    我从 Google 网上论坛主页创建了一个 Google 网上论坛 并添加了 5 个用户 我正在尝试使用Google Admin SDK API 用于检索我的群组中的成员列表但每当我尝试 API 来自API浏览器 我得到了 400 erro
  • Windows 窗体 PictureBox - 如何在窗体的特定区域中显示图像

    我使用以下代码在我的表单之一中打开并显示图像fileDialog private void btnExplorer Click object sender EventArgs e OpenFileDialog openFileDialog1
  • C++ 中的 include 与 python 中的导入

    python中的 import 相当于c 中的 include 吗 我可以像处理 Python 模块名称一样考虑 C 中的命名空间吗 include在 C 和 C 中是文本包含 import在Python中是very不同 根本没有文字包含
  • 使用 localStorage 缓存 Kendo UI DataSource 对象

    我正在将 Kendo UI ComboBox 与外部 XML 数据源一起使用 这是数据源代码 try var csDataSrc new kendo data DataSource transport read Data StateList
  • 处理现有记录时的 django 表单和 ModelMultipleChoiceField

    我正在尝试做一些我认为很常见的事情 但我真的不确定如何解决这个问题 我目前所做的 目前 我在表单上生成了一个复选框列表 使用 CheckboxSelectMultiple 该列表自动勾选 django 中所有用户列表中 成员 中的所有用户
  • JCombobox - 仅在值更改时执行动作侦听器

    我有一个JComboBox 并且我有一个附加的监听器 现在 每次用户从下拉列表中 选择 某些内容时 事件都会触发 即使他们只是重新选择了之前选择的值 如果组合框的选定值与选择之前不同 是否有任何方法可以仅触发事件 我想我可以将组合框的值存储
  • 在java程序中创建暂停或等待效果

    我正在用 Java 编写一个简单的钓鱼模拟器游戏 我希望每次施法后都有一个随机生成的等待时间 当等待结束时 会发生随机事件 一条鱼会被捕获 一条鱼会咬住你的鱼饵 等等 我听说过很多关于 Thread sleep 的坏事 并且想知道在这种情况
  • JAXB - 将动态生成的名称空间移动到文档根目录

    我有这个 POJO 封装了 Atom 条目的动态非嵌套元素 public class SimpleElement private Namespace namespace private String tagName private Stri
  • 如何在 Eclipse Swing 项目中使用 JavaFX

    我想在 Swing 应用程序中使用一些 JavaFX 组件 尤其是 JFXPanel 因为它支持 HTML 5 渲染 我的应用程序当前在 Eclipse 4 3 Kepler 中设置 并且我的计算机上安装了最新的 Java 7 JDK 本教
  • 在 Google Chrome 扩展程序中使用 Stripe 信用卡表单 - 无法避免“付款不安全?”

    我正在尝试在浏览器弹出窗口中获取一个简单的 Stripe 信用卡表单 以用于 google chrome 扩展 然而 在最新版本的 Chrome 中 信用卡表单始终附有 付款不安全 的消息 付款不安全 我已经在这里阅读了 google ch
  • Python 中的统计累加器

    统计累加器允许执行增量计算 例如 为了计算在任意时间给出的数字流的算术平均值 可以创建一个对象来跟踪当前给出的项目数 n以及它们的总和 sum 当一个人请求平均值时 该对象只是返回sum n 像这样的累加器允许您增量计算 即当给定新数字时
  • 可扩展字符串错误

    我试图在警报对话框中显示一些文本作为超链接 该过程的一部分要求我使用 SpannableString 来格式化一些文本 问题是我的应用程序在代码的 SpannableString 部分遇到运行时错误 TextView Tv TextView
  • 返回承诺时自定义异步验证不起作用

    我正在调用 Web api 来检查 urlalias 是否可用 对于此任务 我在异步验证器中使用 httpservice 问题是 当调用验证器时 将执行所有正确的代码路径 所有console log 运行并按预期运行 验证的承诺是否返回 解
  • 将 calendar_date_select 与 Rails 3 结合使用

    我一直在尝试在注册过程中创建用户出生日期选择字段 代码如下所示 div h3 Register h3 div style width 374px margin 0 auto div div div div div div
  • 在处理传入请求之前,如何在“TISAPIApplication”中建立 ADO 数据库连接?

    TADOConnectionDelphi ISAPI 应用程序的应用程序初始化部分无法连接 TISAPIApplication 应用程序是使用 Delphi XE SPI 构建的 运行 Win 7 64 IIS 7 5 和 WinServe