Web Broker(Web服务应用程序)入门教程(2)

1. Web 调度器(Web Dispatcher)

如果您使用的是 Web 模块,它就充当 Web 调度器的角色。如果您使用的是现成的数据模块,则必须向该数据模块中添加一个单一的调度器组件(Web.HTTPApp.TWebDispatcher)。调度器维护着一个动作项集合,这些动作项知道如何处理特定类型的请求消息。当 Web 应用程序将请求对象和响应对象传递给调度器时,它负责分派请求消息。

通过向调度器添加动作来设置 Web 调度器。

1.1 向调度器添加动作

通过在调度器的“动作”属性上点击省略号按钮,从对象检查器打开动作编辑器。可以通过在动作编辑器中点击“添加”按钮,将动作项添加到调度器中。

向调度器添加动作,以响应不同的请求方法或目标 URI。您可以以多种方式设置动作项。您可以从预处理请求的动作项开始,并以一个默认动作结束,该默认动作检查响应是否完整,然后发送响应或返回错误代码。或者,您可以为每种类型的请求添加一个单独的动作项,每个动作项完全处理请求。

1.2 分派请求消息

当调度器接收到客户端请求时,它会生成一个 BeforeDispatch 事件。这为应用程序提供了一个机会,在任何动作项处理之前预处理请求消息。

接下来,调度器遍历其动作项列表,寻找与请求消息的目标 URL 的 PathInfo 部分匹配,并且提供请求消息方法所指定的服务的条目。它通过比较 TWebRequest 对象的 PathInfo 和 MethodType 属性与动作项上同名属性来实现这一点。

当调度器找到一个合适的动作项时,它会触发该动作项。当动作项触发时,它会执行以下操作之一:

1) 填充响应内容并发送响应,或发出请求已完全处理的信号。
2) 向响应中添加内容,然后允许其他动作项完成工作。
3) 将请求推迟给其他动作项处理。
在检查了所有动作项之后,如果消息仍未被处理,调度器会检查任何特别注册的自动分派组件,这些组件不使用动作项。

如果在检查了所有动作项和任何特别注册的自动分派组件之后,请求消息仍未被完全处理,调度器将调用默认动作项。默认动作项不需要匹配请求的目标 URL 或方法。

如果调度器到达动作列表的末尾(包括任何默认动作),并且没有触发任何动作,服务器不会向客户端返回任何内容。服务器简单地断开与客户端的连接。

如果请求由动作项处理,调度器会生成一个 AfterDispatch 事件。这为应用程序提供了最后的机会来检查生成的响应,并进行任何最后的修改。
 

注意,什么是动作项(Action items)

2. 动作项

每个动作项(Web.HTTPApp.TWebActionItem)对应于特定类型的请求消息执行特定任务。

动作项可以完全响应一个请求,或者执行响应的一部分并允许其他动作项完成剩余工作。动作项可以发送请求的 HTTP 响应消息,或者简单地为响应设置一部分,由其他动作项来完成。如果响应由动作项完成但未发送,Web 服务器应用程序将发送响应消息。

2.1 动作项触发时机的确定
 

大多数动作项的属性决定了调度器何时选择它来处理 HTTP 请求消息。要设置动作项的属性,首先需要打开动作编辑器:在对象检查器(object inspector)中选择调度器的“Actions”属性并点击省略号。当动作项在动作编辑器中被选中时,可以在对象检查器中修改其属性。

动作项包括以下属性,这些属性指定了:

1)目标 URL
调度器将动作项的 PathInfo 属性与请求消息的 PathInfo 进行比较。这个属性的值应该是动作项准备处理的所有请求的 URL 中路径信息部分。例如,给定这个 URL:

http://www.TSite.com/art/gallery.dll/mammals?animal=dog&color=black
假设 /gallery.dll 部分表示 Web 服务器应用程序,路径信息部分是

/mammals
使用路径信息来指示您的 Web 应用程序在处理请求时应在何处查找信息,或将您的 Web 应用程序划分为逻辑子服务。

2)请求方法类型
动作项的 MethodType 属性表明它可以处理哪种类型的请求消息。调度器将动作项的 MethodType 属性与请求消息的 MethodType 进行比较。MethodType 可以取以下值之一:

MethodType 值:

值    含义
mtGet    请求要求返回与目标 URI 相关联的信息作为响应消息。
mtHead    请求要求返回响应的头部属性,就像处理 mtGet 请求一样,但省略了响应的内容。
mtPost    请求提供要发布到 Web 应用程序的信息。
mtPut    请求要求将与目标 URI 相关联的资源替换为请求消息的内容。
mtAny    匹配任何请求方法类型,包括 mtGet、mtHead、mtPut 和 mtPost。

影响调度器触发动作项的其他属性在以下部分描述:

3)启用和禁用动作项
每个动作项都有一个 Enabled 属性,可以用来启用或禁用该动作项。通过将 Enabled 设置为 False,您可以禁用动作项,这样在调度器寻找处理请求的动作项时就不会考虑它。

BeforeDispatch 事件处理程序可以通过在调度器开始将动作项与请求消息匹配之前更改动作项的 Enabled 属性来控制哪些动作项应该处理请求。

警告:在执行过程中更改动作项的 Enabled 属性可能会导致后续请求出现意外结果。如果 Web 服务器应用程序是一个缓存 Web 模块的 DLL/SO,则初始状态不会为下一个请求重新初始化。使用 BeforeDispatch 事件确保所有动作项正确初始化到它们适当的起始状态。

4)选择默认动作项
只能有一个动作项是默认动作项。通过将动作项的 Default 属性设置为 True 来选择默认动作项。当动作项的 Default 属性设置为 True 时,前一个默认动作项(如果有)的 Default 属性将被设置为 False。

当调度器搜索其动作项列表以选择一个处理请求的动作项时,它会存储默认动作项的名称。如果当调度器到达其动作项列表末尾时请求仍未被完全处理,它将执行默认动作项。

调度器不检查默认动作项的 PathInfo 或 MethodType。调度器甚至不检查默认动作项的 Enabled 属性。因此,您可以通过将 Enabled 属性设置为 False 来确保默认动作项只在最后被调用。

默认动作项应该能够处理遇到的任何请求,即使只是返回表示无效 URI 或 MethodType 的错误代码。如果默认动作项不处理请求,Web 客户端将不会收到任何响应。

警告:在执行过程中更改动作项的 Default 属性可能会导致当前请求出现意外结果。如果已经触发的动作项的 Default 属性被设置为 True,则该动作项不会被重新评估,当调度器到达动作列表末尾时,也不会触发该动作项。

2.2 使用动作项响应请求消息
 

Web 服务器应用程序的真正工作是由执行时的动作项来完成的。当 Web 调度器触发一个动作项时,该动作项可以通过两种方式响应当前的请求消息:

1). 如果动作项有一个与之关联的生成器组件作为其 Producer 属性的值,那么该生成器会自动使用其 Content 方法分配响应消息的内容。工具面板的 Internet 页面包括许多内容生成器组件,这些组件可以帮助构建响应消息内容的 HTML 页面。

2). 生成器分配了任何响应内容(如果有关联的生成器)后,动作项会接收到一个 Web.HTTPApp.TWebActionItem.OnAction 事件。OnAction 事件处理程序会传递一个 Web.HTTPApp.TWebRequest 对象,该对象代表 HTTP 请求消息,以及一个 Web.HTTPApp.TWebResponse 对象,用于填充任何响应信息。

如果动作项的内容可以由单个内容生成器生成,最简单的方法是将内容生成器分配给动作项的 Producer 属性。然而,您也可以在 OnAction 事件处理程序中访问任何内容生成器。OnAction 事件处理程序允许更多的灵活性,以便您可以使用多个内容生成器、分配响应消息属性等。

内容生成器组件和 OnAction 事件处理程序都可以使用任何对象或运行时库方法来响应请求消息。它们可以访问数据库、执行计算、构建或选择 HTML 文档等。有关使用内容生成器组件生成响应内容的更多信息,请参见生成响应消息的内容。

2.3 发送响应

OnAction 事件处理程序可以通过使用 TWebResponse 对象的方法将响应发送回 Web 客户端。然而,如果没有动作项将响应发送给客户端,只要最后一个查看请求的动作项指示请求已处理,Web 服务器应用程序仍会发送响应。

2.4 使用多个动作项

您可以使用单个动作项响应请求,或者将工作分配给多个动作项。如果动作项没有完全完成设置响应消息,它必须在 OnAction 事件处理程序中通过将 Handled 参数设置为 False 来指示这种状态。

如果许多动作项分工响应请求消息,每个都设置 Handled 为 False 以便其他动作项继续处理,请确保默认动作项将 Handled 参数设置为 True。否则,将不会向 Web 客户端发送响应。

在将工作分配给多个动作项时,要么默认动作项的 OnAction 事件处理程序,要么调度器的 AfterDispatch 事件处理程序应该检查所有工作是否完成,如果没有完成,则设置适当的错误代码。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caridle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值