TWebModule事件处理程序的参数是全局的吗?

时间:2009-12-14 03:12:32

标签: delphi

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

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的Request,Response和Handled参数。例如,我已成功使用以下内容而不是显式创建的操作处理程序:

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中对Sender,Request,Response和Handled的引用是“正确的”?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

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