며칠째 이거 갖고 고민을 하는데... 아래는 Marco Cantu 의 소스를 그대로 쓴 것입니다. 이해가 안 가는 부분이 있어서..
html 파일의 핵심적 부분은 아래입니다.
<#STYLES><#WARNINGS><#SERVERSCRIPT>
Plain Tags
Session id: <#SessionID>
Session hits: <#SessionHits>
// 여기서 session hit 수를 보여 줍니다.
Script
Session hits (via application): <%= Application.SessionHits.Value %> // sessionhit 가 또 나오는데...
Application hits: <%= Application.Hits.Value %>
// 여기는 application 전체 hit 수를 보여줍니다.
// 위에서 sessionhit 가 두 번 나오는데, 서버와 클라이언트 script 두 가지 다 보여주기 위한 것일 뿐
// 다른 의미는 전혀 없습니다.
========== homepage_dm.pas 의 핵심 부분은 아래입니다.
TSessionDemo = class(TWebAppPageModule)
private
nHits: Integer;
procedure TSessionDemo.PageProducerHTMLTag(Sender: TObject;
Tag: TTag; const TagString: String; TagParams: TStrings;
var ReplaceText: String);
begin
if TagString = 'SessionID' then
ReplaceText := WebContext.Session.SessionID
else if TagString = 'SessionHits' then
ReplaceText := WebContext.Session.Values ['SessionHits']
end;
procedure TSessionDemo.WebAppPageModuleBeforeDispatchPage(
Sender: TObject; const PageName: String; var Handled: Boolean);
begin
// increase application and session hits
Inc (nHits); //여기 Hits 는 위의 Private 영역에 지정된 변수이고
WebContext.Session.Values ['SessionHits'] := // SessionHits 는 Session 내에 지정된 변수입니다.
Integer (WebContext.Session.Values ['SessionHits']) + 1;
end;
procedure TSessionDemo.HitsGetValue(Sender: TObject; var Value: Variant);
begin
Value := nHits;
end;
procedure TSessionDemo.SessionHitsGetValue(Sender: TObject;
var Value: Variant);
begin
Value := Integer (WebContext.Session.Values ['SessionHits']);
end;
어쨌건 핵심은, 이러한 웹 응용 프로그램을 만들어서 실행을 합니다. 한 PC 에 브라우저를 두 개 띄우면 됩니다.
그런데, 원래 cantu 코드는 Delphi 의 web app debugger 를 이용하여 실행하게 되어 있습니다. 이렇게 하면,
두 개 브라우저 띄워 보면 session hit 는 자기 브라우저를 다시 갱신하는 횟수만큼 올라가고, 전체 application hit는
양 쪽 모두에서 갱신한 횟수만큼 올라갑니다.
그.런.데. 제가 이걸 ISAPI/NSAPI dll 형식으로 바꾸어 컴파일했습니다. 물론 project 파일만 바꾸고, 웹모듈은 손
대지 않고 그대로 추가했습니다. 그런데 이 형식에서는 session 과 전체 hit 가 구분이 되지 않습니다. 즉 어느 쪽을
갱신해도 양 쪽 모두가 올라갑니다. 즉 session hit 수 역시 항상 전체 app hit 수와 동일하게 나옵니다.
어떤 이유인지... 아시는 분 설명 부탁드립니다.