我正在使用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的请求、响应和已处理的参数。例如,我已经成功地使用了以下内容,而不是显式创建的操作处理程序:
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中对发送者、请求、响应和处理的引用是“正确的”吗?
发布于 2009-12-15 07:29:36
在处理每个请求时,将为其创建(或从预先分配的池中获取) TWebModule实例。请求和响应作为实例上的属性可用。只要您不尝试访问另一个TWebModule实例,请求/响应属性在请求的整个生命周期内都是有效的。如果在TWebModule上调用其他方法,则不必限定它们的使用。如果您打算让其他对象方法或全局过程/函数可以访问它们,则需要将它们作为参数传递。
发布于 2009-12-14 14:43:05
不,你不能在所有情况下都保证这一点,而且你正在准备一场维护的噩梦。
为什么不创建一个DoMyAction,将请求、响应和处理中所需的任何内容作为参数?
在您的示例中,它将变成:
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;https://stackoverflow.com/questions/1898716
复制相似问题