我正在使用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的引用是“正确的”?
答案 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上调用其他方法,则无需限定其使用。如果您打算让其他对象方法或全局过程/函数可以访问它们,则需要将它们作为参数传递。