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

Delphi TWebModule事件处理程序的参数是全局的吗?,delphi,Delphi,我正在使用TWebModule组件用Delphi编写一个web服务器应用程序。单击TWebModule的Actions属性,可以定义一个新的操作并创建一个“OnAction”事件处理程序。例如: procedure TMainWeb.MyAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content := '<htm

我正在使用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;
过程TMainWeb.MyAction(发送方:TObject;
请求:TWebRequest;响应:TWebResponse;处理的变量:Boolean);
开始
Response.Content:='myvariable:'+request.queryfields.values['myvariable']+';
结束;
我注意到可以调用非参数化过程,这些过程可以访问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;
程序TMainWeb.WebModuleBeforeDispatch(发送方:TObject;
请求:TWebRequest;响应:TWebResponse;处理的变量:Boolean);
开始
如果Pos('myaction.html',request.url)>0,则
区域作用;
结束;
程序TMainWeb.DoMyAction;
开始
Response.Content:='myvariable:'+request.queryfields.values['myvariable']+';
结束;

我能否始终确保我在DomainAction中对发件人、请求、响应和处理的引用是“正确”的?

不,您不能保证在所有情况下都是正确的,您正在准备维护噩梦

为什么不创建一个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;
程序TMainWeb.WebModuleBeforeDispatch(发送方:TObject;
请求:TWebRequest;响应:TWebResponse;处理的变量:Boolean);
开始
如果Pos('myaction.html',request.url)>0,则
开始
域操作(请求、响应);
已处理:=真;
结束;
结束;
过程TMainWeb.DoMyAction(请求:TWebRequest;响应:TWebResponse);
开始
AResponse.Content:='myvariable:'+ARequest.queryfields.values['myvariable']+';
结束;

不,在所有情况下都不能保证这一点,您正在准备一场维护噩梦

为什么不创建一个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;
程序TMainWeb.WebModuleBeforeDispatch(发送方:TObject;
请求:TWebRequest;响应:TWebResponse;处理的变量:Boolean);
开始
如果Pos('myaction.html',request.url)>0,则
开始
域操作(请求、响应);
已处理:=真;
结束;
结束;
过程TMainWeb.DoMyAction(请求:TWebRequest;响应:TWebResponse);
开始
AResponse.Content:='myvariable:'+ARequest.queryfields.values['myvariable']+';
结束;

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

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

如果这样做,请确保始终将处理的响应为true。如果这样做,请确保始终将处理的响应为true。感谢您的回复。现在我知道它们不一定总是相同的,我将创建参数化调用。那么,为什么这些在TWebModule类中是可见的(即请求、响应)?这似乎只会让人们误入歧途,以为他们是一样的。另外,我已经发布了两个web应用程序,其中嵌入了很多类似的情况。但据我所知,没有任何问题。不过,也许还有,但我还没有意识到。谢谢你的回复。现在我知道它们不一定总是相同的,我将创建参数化调用。那么,为什么这些在TWebModule类中是可见的(即请求、响应)?这似乎只会让人们误入歧途,以为他们是一样的。另外,我已经发布了两个web应用程序,其中嵌入了很多类似的情况。但据我所知,没有任何问题。但是,也许有,但我还没有意识到。您如何访问另一个TWebModule实例?是否有维护的TWebModules列表?示例:TWebModule(WebModulesList[iWebModule])。请求(注意WebModulesList是我解释的东西)。因此,在我原始问题的TMainWeb.DoMyAction调用中,我可以假设对TWebModule的请求、响应和处理的引用与作为参数传递的引用相同?这往往否定了Francois的答案(假设不访问另一个TWebModule实例)。当请求进入时,它从一个列表中获取一个非活动模块,并将其添加到活动列表中。如果一个不可用,将创建一个新的。尝试访问另一个TWebModule实例是不可取的(也不是特别容易)。它可能在处理另一个请求的过程中,这意味着你会踩在它上面,或者至少得到不一致的数据。弗朗索瓦可能认为这些财产是全球性的,在这种情况下,他是对的。请求/响应的作用域是web模块。如何