Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Delphi应用程序获取端口/URL数据:_Delphi_Delphi Xe_Isapi_Isapi Extension - Fatal编程技术网

从Delphi应用程序获取端口/URL数据:

从Delphi应用程序获取端口/URL数据:,delphi,delphi-xe,isapi,isapi-extension,Delphi,Delphi Xe,Isapi,Isapi Extension,*)我有一个DelphiXE ISAPI dll,它运行在IIS7.5-Server2008R2下。DLL启动TISAPI应用程序的实例。应用程序驻留在一个谨慎的、固定的、预先确定的URL上,并侦听特定端口(而不是端口80)上的请求——所有这些当然都是“标准配置” *)在我的服务器上,我有几个DLL,每个DLL启动一个不同的TISAPIApplication实例,映射到不同的URL,并在不同的端口上侦听。在运行时,我根据端口号(比解析URL更容易)区分应用程序的各种实例(Dev、Prod、Fai

*)我有一个DelphiXE ISAPI dll,它运行在IIS7.5-Server2008R2下。DLL启动TISAPI应用程序的实例。应用程序驻留在一个谨慎的、固定的、预先确定的URL上,并侦听特定端口(而不是端口80)上的请求——所有这些当然都是“标准配置”

*)在我的服务器上,我有几个DLL,每个DLL启动一个不同的TISAPIApplication实例,映射到不同的URL,并在不同的端口上侦听。在运行时,我根据端口号(比解析URL更容易)区分应用程序的各种实例(Dev、Prod、FailOver等)

*)我查阅了TISAPIApplication及其祖先和相关类的文档和源代码,但我在任何地方都找不到一个属性,该属性告诉我应用程序的特定实例正在侦听哪个端口-该端口似乎仅在逐个请求的基础上可用。在我看来,由于在简单部署中侦听端口通常是静态的,我应该能够在应用程序启动时获取端口值-这将有助于分配特定的资源,而不是等待请求进入,等等

*)有人知道怎么做吗?我需要抓取什么属性,从哪里抓取?事实上,我根本找不到任何东西可以告诉我应用程序本身所在的URL的任何信息-所有内容似乎都是基于每个请求进行的

( 请-我不是在寻找告诉我如何通过请求来实现的变通方法,或者HTTP是无状态的,并且每一个请求都可以工作-我知道这些变通方法,不想使用它们。 而且,尽管ISAPI生成线程以“无状态”方式处理请求,但当IIS加载ISAPI dll时,会启动一个TISAPI应用程序实例,并且该TISAPI应用程序实例在ISAPI应用程序的整个生命周期内都会持续存在,并且包含在应用程序实例的生命周期内有效的状态信息 )


TIA

ISAPI函数GetServerVariable(-表7.7 HTTP环境变量)可以返回服务器端口变量。可能在初始化DLL时可以调用此函数


正如你所写

应用程序驻留在一个谨慎的、固定的、预先确定的URL上,并且 侦听特定端口(不是端口80)上的请求

在运行时,我区分应用程序的各种实例 (开发、生产、故障切换等)基于端口号


我假设您需要在第一个请求到达应用程序之前执行一些操作,比如消耗资源的初始化任务,而不是在每个请求中执行这些操作。在这种情况下,可以在应用程序生命周期的早期阶段使用的函数将是一个优势。然而,我并没有对ISAPI应用程序生命周期进行研究,以找出通常是如何做到这一点的。

我想也许我正在尝试做一些不完全有效的事情:即使简单的应用程序通常在指定的端口上有一个监听器,但它不会改变,不一定是这样-确定侦听端口的唯一方法是从请求本身,而不是之前-因此TISAPIApplication不应该持久化侦听端口的信息,这本质上是不稳定的。

“可能在初始化DLL时调用此函数”-是,也许吧——虽然从外观上看,它需要与请求相关的数据。坦率地说,这还不够重要,不足以麻烦地将调用该函数所需的所有内容连接起来,却发现它不起作用。:-)谢谢。我想我要结束这个问题,因为我在这里试图做一些不完全有效的事情:即使简单的应用程序通常有一个监听器,它位于一个指定的端口上,不会改变,但也不一定是这样-确定监听端口的唯一方法是从请求本身,而不是之前。“…在这种情况下,可以在应用程序生命周期的早期阶段使用的功能将是一个优势。“-是的,事情就是这样。我实现的解决方法是一个旧的标准-中的第一个请求进行适当的初始化,并设置一个标志表示它已经完成。在打电话之前检查标志-因此后续请求将跳过初始化代码。我认为我发布的答案是正确的-你真的不应该在应用程序初始化时依赖某个特定端口-但我不确定所有这些-需要更多了解ISAPI等。不管怎样,我的解决方法很好-不是最优雅的,“没有对ISAPI应用程序生命周期进行研究,以了解通常是如何做到的”——Tisapi应用程序上有一两个钩子,您可以在其中运行不以请求为中心的代码。在Delphi ISAPI应用程序的DPR中,您几乎可以通过初始化资源、缓存等方式做任何您想做的事情。在该上下文中使用ADO时,我确实遇到了一些问题,但同样,不值得花那么多时间,因为您可以使用标志解决方法和旧的Delphi技巧来完成所有事情,即在任何类之外的单元变量上挂起内容,等等。