intreweb 在Http.sys 部署

Http.sys 应用程序

使用 IntraWeb 创建 Http.sys 应用程序

什么是 http.sys?

Http.sys 是 Windows 内核模式设备驱动程序,用于处理 Windows 系统中的 Http 和 Https 请求。它侦听来自 TCP 堆栈的此类请求并将它们转发给已注册的应用程序。这些应用程序生成对这些请求的完整响应。w3wp.exe 就是一个这样的应用程序,它是 IIS 本身的工作进程。在 IIS 中创建的每个虚拟应用程序都会启动一个新的 w3wp.exe 进程,该进程将自己注册到 Http.sys。因此,如您所见,当我们直接与 Http.sys 对话而不是通过 IIS 时,我们实际上移除了一层间接性,使整个过程更加简单并提高了整体性能。

您可以在此处找到有关 Http.sys 的完整信息:  https ://docs.microsoft.com/en-us/iis/get-started/introduction-to-iis/introduction-to-iis-architecture

为什么 Http.sys 这么酷?

出于各种原因:它速度超级快,扩展性非常好,管理简单——比 IIS 好得多,而且可以正常工作!除此之外,您可以在同一服务器端口(例如标准端口 80 和 443)上运行多个应用程序,甚至可以使用 IIS 使用的同一端口,这意味着您实际上可以在端口 80 上安装 Http.sys IW 应用程序(或 HTTPS 标准端口 443),即使您在同一台服务器上激活了 IIS!这真是太棒了!

它超级快,因为 Http.sys 是内核模式设备驱动程序

我是否需要 IIS 来开发或部署 Http.sys IntraWeb 应用程序?

,绝对不是!您甚至不需要在开发机器上安装 IIS!您也不需要在服务器上安装它!

Http.sys 应用程序是否像 ISAPI 一样部署为 DLL?

,他们不是!Http.sys IW 应用程序是独立的可执行文件(一个简单的 EXE),应该作为服务安装。它们的工作方式与基于 Indy 的 IntraWeb 应用程序完全相同,但它们根本不使用 Indy。

Http.sys 是否有任何其他外部依赖项?

再次, !唯一的依赖是 http.sys 设备驱动程序,它是每个 Windows 操作系统的核心部分。只需将您的 EXE 复制到服务器上的文件夹即可运行。

那么它是怎样工作的?

以非常简化的方式:

当您的应用程序运行时,它会告诉 Http.sys 每个具有特定地址的请求都应该转发给它,以便我们可以处理它并做出响应。示例:您的应用程序希望将在端口 8888 中接收到的每个请求都转发给它,并且 URL 路径中包含 /MyIWApp/。所以它像 Http.sys 一样注册

http://+8888/MyIWApp/

这称为“URL 保留”。加号称为强通配符(在此处阅读更多信息: https ://docs.microsoft.com/en-us/sql/reporting-services/install-windows/url-reservation-syntax-ssrs-configuration-  manager?view=sql-server-2017

在 URL 注册成功后,所有以 /MyIWApp/ 作为 URL 基础的端口 8888 的请求都将被转发到您的应用程序。这正是 IIS 在后台对托管在其上的每个应用程序所做的事情。

收到新请求后,您的 Http.sys IW 应用程序将像处理任何其他请求一样处理它,生成响应,将其压缩并写回,使用其他 Http.sys API 函数。Http.sys 将负责其余的工作,并将其发送回浏览器。很简单,不是吗?

如何创建 Http.sys IntraWeb 应用程序?

您需要做的就是:

- 从 Delphi/C++ Builder IDE 中,选择 File – New – Other。然后是 IntraWeb,IntraWeb 应用程序向导

– 然后选择:

应用程序类型:独立应用程序 (Http.sys)

Url Base(可选):您的应用程序将使用 url base 创建用作应用程序地址的 url。它的格式为:http(s) : //yourserver.com/urlbase/

如果您愿意,您可以稍后设置或更改 URL 库。

而已!只需单击确定,您的应用程序将被创建。构建它,它就会工作!

第一次运行/调试它

如果您构建最近创建的应用程序并运行它,它应该可以正常工作,就像任何常规的 IntraWeb 独立应用程序一样。但是,在调试它时,您可能会收到这样的异常:

如消息所示,Http.sys 应用程序调用的某些特定功能(例如 URL 注册)需要 管理员权限。这就是它引发此异常的原因。在 Delphi/C++ Builder 调试器之外运行时,如果发生同样的情况,您应该会看到如下内容:

http://+8888/MyIWApp/ 是注册失败的 URL。

如何解决这个问题?简单 -> 以本地管理员身份运行您的 Delphi IDE  。

在 IIS 上调试 ISAPI 应用程序时也需要这样做(有时调试 ISAPI 很痛苦,但当您以本地管理员身份运行 Delphi 时,痛苦会减轻)。

Http.sys 应用程序选项

检查应用程序的 ServerController 时,您会发现以下新属性:

AddDefaultBinding:意味着您的应用程序将在运行时向 Http.sys 注册默认 URL(也称为“URL 保留”)。由协议(http 或 https)、通配符(强或弱)或虚拟主机名、端口和 Url Base(如果适用)组成的默认 URL。

HostWildcard:它可能是强或弱。简而言之,强通配符意味着所有到达该端口的东西,与请求的 URL 无关。弱通配符意味着对那个端口的所有请求都没有被其他保留捕获。

LimitThreadCountInDebug:当 True(默认)时,IntraWeb 将忽略属性 ThreadsPerCore(设置时)并使用默认 ThreadsPerCore = 0,仅在调试时(即在 Delphi IDE 上运行)。它使应用程序的启动和关闭稍微更快,调试更方便。

ThreadsPerCore:当设置(任何大于零的值)时,IntraWeb 将在为 Http.sys 进程创建线程时将此值用作每个核心的线程数。未设置时(即 ThreadsPerCore = 0,默认值),IntraWeb 将为每个核心创建 16 个线程。例如,如果机器有 8 个内核,应用程序将总共创建 128 个线程。请注意,在调试时此数字可能不同(请参阅 LimitThreadCountInDebug)。根据我们的测试,这是此类应用程序的平均推荐值。我们建议您使用默认值,除非您有充分的理由更改它。

VirtualHostNames:您可以使用 VirtualHostNames 来创建使用 主机名而不是通配符(强或弱)的 URL 保留。例如:http://myvirtualhostname:8888/MyIWApp/。这样,Http.sys 会将具有该确切 URL 的所有请求转发到您的应用程序。可以提供多个虚拟主机名(逗号分隔)。到达端口 8888 的所有其他请求都不会转发到您的应用程序(它们可以转发到不同的 IW 应用程序、IIS 或使用 Http.sys 的任何其他应用程序)。

还有一个新事件可用于配置 Http.sys IW 应用程序:

OnBind: 您可以使用 OnBind 事件来设置自己的应用程序使用的 http 和 https 绑定。例子:

过程 TIWServerController.IWServerControllerBaseBind(const aHttpBindings, aHttpsBindings: TStrings);  
开始    
  aHttpBindings.Add('http://+:8888/MyIWApp/');  
结尾;  

Http.sys 应用程序项目的结构

这是一个标准的 Http.sys 应用程序项目:

程序 HttpSysDemo;  

用途    
  IWRtlFix,    
  IWJclStackTrace,    
  IWJcl调试,    
  IWStartHSys,    
  'Unit1.pas' {IWForm1: TIWAppForm} 中的 Unit1,    
  'ServerController.pas' {IWServerController: TIWServerControllerBase} 中的 ServerController,    
  “UserSessionUnit.pas”中的 UserSessionUnit {IWUserSession: TIWUserSessionBase};    

{$R *.res}  

开始    
  TIWStartHSys.Execute(True);  
结尾。  

请注意 使用了单元IWStartHSys.pas(而不是 Indy 服务器项目中的 IWStart.pas)和行 TIWStartHSys .Execute()(而不是 Indy 服务器项目中的 TIWStart.Execute())。

将 Indy SA 转换为 Http.sys 应用程序

这真的很容易!您现有的 IntraWeb 14 SA 应用程序可以修改为作为 Http.sys 应用程序运行,在您的 DPR 文件中编辑 2 行!

请按照以下简单步骤操作:

1) 用 IWStartHSys 替换 IWStart 单元

2) 用 TIWStartHSys.Execute() 替换对 TIWStart.Execute() 的调用

构建并运行您的应用程序。一切都应该正常工作,现在使用 Http.sys 作为 Http 服务器而不是 Indy 服务器。

Http.sys 应用程序的部署

通常,您可以像部署 Indy IW 应用程序一样部署 Http.sys 应用程序。应该使用命令行将它们安装为 Windows 服务:

YourApplicationName.exe /安装

请注意,您必须在 TIWStartHSys.Execute() 方法中将 aForceUI 参数设置为 FALSE,就像在:

开始    
  TIWStartHSys.Execute(False);  
结尾。  

否则将使用 GUI 版本。应用程序的 GUI 版本非常适合调试、测试和原型设计,但不适用于生产中的部署。 始终使用服务版本

在哪里可以找到 Http.sys IW 演示?

此演示有 2 个独立的应用程序,它们共享相同的端口(8888,但您可以使用任何其他端口)但响应不同的地址(它们具有不同的 UrlBase 属性)。它显示了 Http.sys 应用程序的主要功能之一。如您所见,它与任何 Indy 服务器应用程序一样简单,也可以轻松部署。

也可以看看

有关 Http.sys 的一般信息:

网址预订:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值