2009-12-14 4 views
0

저는 TWebModule 컴포넌트를 사용하여 델파이로 웹 서버 애플리케이션을 작성하고 있습니다. TWebModule의 Actions 속성을 클릭하면 새 작업을 정의하고 "OnAction"이벤트 처리기를 만들 수 있습니다. 나는 TWebModule의 요청, 응답에 대한 액세스 및 취급 매개 변수를 호출 할 수 있습니다 비 parametered 절차를 발견했습니다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; 

예를 들면 다음과 같습니다. 예를 들어, 나는 성공적으로 사용한 대신 명시 적으로 생성 된 액션 핸들러의 다음

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에 대한 호출에서 TWebModule의 요청, 응답 및 처리에 대한 참조가 매개 변수로 전달 된 것과 동일하다고 가정 할 수 있습니까? 이것은 Francois의 대답을 부정합니다 (다른 TWebModule 인스턴스에 액세스하지 않는다는 가정하에). –

+1

예, 활성 및 비활성 웹 모듈의 내부 목록이 있습니다. 요청이 들어 오면 하나의 목록에서 비활성 모듈을 가져 와서 활성 목록에 추가합니다. 사용할 수없는 경우 새 것을 만듭니다. 다른 TWebModule 인스턴스에 액세스하려고 시도하는 것은 바람직하지 않으며 (특히 쉬운 일도 아닙니다) 다른 요청을 처리하는 중일 수 있습니다. 즉, 모든 요청을 처리하거나 적어도 일관성없는 데이터를 가져올 수 있습니다. François는 그 자산이 범위면에서 포괄적이라고 생각했을 것입니다. 요청/응답은 웹 모듈로 범위가 지정됩니다. –

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 클래스 내에서 이러한 요청 (즉, 요청, 응답)을 볼 수 있습니까? 그것은 사람들이 자신들이 똑같다고 생각하는 것을 그냥 인도 할 수있는 것처럼 보입니다. 또한, 나는 이것들과 같은 많은 상황과 함께 이미 공개 된 두개의 웹 어플리케이션을 가지고있다. 그러나 내가 아는 한 아무런 문제가 없었다. 그러나 또 다시 있을지도 모르지만 나는 단지 알려지지 않았습니다. –

관련 문제