2009-12-14 34 views
0

我正在使用TWebModule组件用Delphi编写Web服务器应用程序。点击TWebModule的Actions属性可以定义一个新的动作,并创建一个“OnAction”事件处理程序。例如:TWebModule事件处理程序的参数是全局的吗?

procedure TMainWeb.MyAction(Sender: TObject; 
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
begin 
    Response.Content := '<html><body>myvariable: '+request.queryfields.values['myvariable']+</body></html>'; 
end; 

我已经注意到非参数化的过程可以被称为具有访问TWebModule的请求,响应,处理好和参数。举例来说,我已经成功地使用了以下的,而不是明确创建操作处理程序:

procedure TMainWeb.WebModuleBeforeDispatch(Sender: TObject; 
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
begin 
    if Pos('myaction.html',request.url)>0 then 
    DoMyAction; 
end; 


procedure TMainWeb.DoMyAction; 
begin 
    Response.Content := '<html><body>myvariable: '+request.queryfields.values['myvariable']+</body></html>'; 

end; 

可我总是放心发件人,请求,响应引用,并处理好我使DoMyAction是“正确”的呢?

+0

如果你这样做,一定要始终回应处理为真。 –

回答

2

甲TWebModule实例被创建(或从预先分配的池抓住),用于当处理每个请求。请求和响应可作为实例的属性提供。只要您不尝试访问另一个TWebModule实例,请求/响应属性将在请求的整个生命周期内有效。如果您调用TWebModule上的其他方法,则不必限定其用途。如果您打算让其他对象方法或全局过程/函数可以访问它们,则需要将它们作为参数传递。

+0

你将如何访问另一个TWebModule实例?是否有一些TWebModules的维护列表?示例:TWebModule(WebModulesList [iWebModule])。Request(注意WebModulesList是我解释的)。所以在我原来的问题的TMainWeb.DoMyAction的调用中,我可以假定对TWebModule的请求,响应和处理的引用将与我将它们作为参数传递一样吗?这往往会否定弗朗索瓦的答案(假设不访问另一个TWebModule实例)。 –

+1

是的,有一个活动和不活动的Web模块的内部列表。当请求进入时,它从一个列表中抓取一个不活动的模块,并将其添加到活动列表中。如果一个不可用,则创建一个新的。尝试访问另一个TWebModule实例是不可取的(也不是特别容易)。它可能正处在处理另一个请求的过程中,这意味着你会跺脚,或者至少得到不一致的数据。弗朗索瓦可能认为这些属性是全球性的,在这种情况下他是对的。请求/响应的范围是Web模块。 –

3

不,你不能保证在所有情况下,你正在准备维修噩梦。

为什么不创建一个DoMyAction,它可以从Request,Response和Handled中获取需要的任何参数?

随着你的例子它会成为:

procedure TMainWeb.WebModuleBeforeDispatch(Sender: TObject; 
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
begin 
    if Pos('myaction.html',request.url)>0 then 
    begin 
    DoMyAction(Request, Response); 
    Handled := True; 
    end; 
end; 


procedure TMainWeb.DoMyAction(ARequest: TWebRequest; AResponse: TWebResponse); 
begin 
    AResponse.Content := '<html><body>myvariable: '+ARequest.queryfields.values['myvariable']+</body></html>'; 

end; 
+0

感谢您的回复。现在我知道它们并不总是相同的,我会创建参数化调用。那么为什么在TWebModule类中可见(即Request,Response)呢?看来它可能会让人误入歧途,认为他们是一样的。另外,我还有一些已经发布的Web应用程序,其中嵌入了许多类似的情况。但据我所知,没有问题。但是,也许有,但我只是没有意识到。 –

相关问题