2009-12-14 72 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應用程序,其中嵌入了許多類似的情況。但據我所知,沒有問題。但是,也許有,但我只是沒有意識到。 –

相關問題