2009-12-14 2 views
0

Я использую компонент TWebModule для написания приложения веб-сервера с Delphi. Нажав на свойство Actions в TWebModule, можно определить новое действие и создать обработчик событий 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; 

я заметил, не parametered процедуры могут быть вызваны, которые имеют доступ к 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, свойства Request/Response будут действительны на протяжении всего срока службы запроса. Если вы вызываете другие методы в TWebModule, вам не нужно квалифицировать их использование. Если вы намерены сделать их доступными для других методов объекта или глобальных процедур/функций, вам необходимо передать их в качестве параметров.

+0

Как получить доступ к другому экземпляру TWebModule? Есть ли поддерживаемый список TWebModules? Пример: TWebModule (WebModulesList [iWebModule]). Запрос (примечание. WebModulesList - это то, что я толкую). Поэтому в вызове TMainWeb.DoMyAction моего исходного вопроса я могу предположить, что ссылки на Request, Response и Handled из TWebModule будут такими же, как если бы я передал их в качестве параметров? Это, как правило, отрицает ответ Франсуа (с предположениями о невозможности доступа к другому экземпляру TWebModule). –

+1

Да, есть внутренний список активных и неактивных веб-модулей. Когда приходит запрос, он захватывает неактивный модуль из одного списка и добавляет его в активный список. Если он недоступен, создается новый. Не рекомендуется (и не особенно просто) вообще пытаться получить доступ к другому экземпляру TWebModule. Это может быть в середине обработки другого запроса, что означало бы, что вы бы топали по всему миру или, по крайней мере, получить непоследовательные данные. Франсуа, возможно, думал, что эти свойства являются глобальными по масштабам, и в этом случае он будет прав. Запрос/ответ привязаны к веб-модулю. –

3

Нет, вы не можете быть уверены в этом во всех случаях, и вы готовите кошмар для обслуживания.

Почему вы не создаете 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; 
+0

Спасибо за ответ. Теперь, когда я знаю, что они не всегда обязательно одинаковы, я создам параметризованные вызовы. Почему же тогда они видны (т. Е. Запрос, ответ) в классе TWebModule? Кажется, это может просто привести людей в заблуждение, чтобы думать, что они одинаковы. Кроме того, у меня есть несколько веб-приложений, уже выпущенных с такими ситуациями, как встроенные в них. Но, насколько я знаю, проблем не было. Но опять же, может быть, есть, но я просто не был осведомлен. –

Смежные вопросы