2010-02-11 5 views
3

ISA 또는 IIS에 의해로드되는지 여부에 따라 동작을 변경해야하는 ISAPI 필터로 구현 된 응용 프로그램이 있습니다. GetFilterVersion 동안 ISA에 의해로드되는 경우 SF_NOTIFY_SEND_RAW_DATA에 등록하거나 IIS에 의해로드되는 경우 SF_NOTIFY_SEND_RESPONSE에 등록해야합니다.ISAPI 필터는 IIS 또는 ISA에 의해로드되는 것을 어떻게 구별 할 수 있습니까?

GetFilterVersion에 전달 된 서버에 대한 정보가없는 것 같습니다. IIS와 ISA를 구분하고 구분할 수있는 트릭이 있습니까?

[편집]

응용 프로그램은 GetFilterVersion 통화 중, 초기화시를로드하는 것을 서버 알 필요가있다. 현재 요청이 없으므로 헤더 변수에서 SERVER_VARIABLE을 (를) 얻으려고하면 작동하지 않습니다. 이 시점에서 헤더 변수가 없습니다.

내 응용 프로그램은 쿠키 및 캐시 제어 헤더와 같은 응답 헤더를 설정합니다. ISA 서버 컨텍스트에서 실행될 때 SF_NOTIFY_SEND_RAW_DATA 이벤트를 사용하여이 작업을 완료하고 ISA 프록시에서 보내는 원시 데이터를 수정해야합니다. 그러나 IIS에서이 알림을 사용하면 심각한 성능 저하가 발생하므로 응용 프로그램에서 SF_NOTIFY_SEND_RESPONSE를 사용해야합니다. SF_NOTIFY_SEND_RESPONSE는 ISA에서 발생하는 응답 (오류 페이지 등)에 대해서만이 이벤트가 프록시 응답으로 시작되지 않기 때문에 ISA에서 작동하지 않습니다. 마지막으로 이벤트 등록은 GetFilterVersion() 중에 한 번 발생하며 필터가로드되면 수정할 수 없습니다.

그래서 초기화 중에 SF_NOTIFY_SEND_RESPONSE 또는 SF_NOTIFY_SEND_RAW_DATA에 등록하려고 결정할 때 앱이 IIS 또는 ISA에 의해로드되는지 여부를 알아야합니다.

답변

2

최근 버전의 IIS와 ISA는 모두 작업자 프로세스와 함께 작동해야합니다. "w3proxy.exe"라는 이름은 ISA에 속하며 "w3wp.exe"는 IIS에 속합니다. 현재 프로세스 이름을 가져 와서 테스트 해보십시오.

HANDLE winapi GetCurrentProcess()

this :

DWORD WINAPI GetModuleFileNameEx(
    __in  HANDLE hProcess, 
    __in_opt HMODULE hModule, 
    __out  LPTSTR lpFilename, 
    __in  DWORD nSize 
); 

트릭에게 답장을

+0

감사합니다.그게 내가 생각할 수있는 종류의 일이지만, 충분한 윈도우 API를 기억하지 못했거나 찾을 IIS/ISA에 대해 충분히 알고 있습니다. – veefu

0

필자는 필터가 아닌 isapi 어플리케이션만을 작성했습니다. 그러나 ISAPI 응용 프로그램에서, 당신은 당신이 필터에서 "GetServerVariable"를 호출 할 수 없습니다 경우 http://msdn.microsoft.com/en-us/library/ms525335.aspx

를 참조 GetServerVariable를 호출하고 'SERVER_SOFTWARE'

의 값을 요청할 수 있습니다, 그럼 내가 어떻게 해야할지하지 않습니다 그것.

+0

감사를해야한다. 아쉽게도 GetServerVariable은 필터가 정보를 필요로하는 지점에서 호출 할 수 없습니다. GetFilterVersion은 ISAPI 필터로 구현되며 IIS/ISA가 필터를로드 할 때 한 번 호출됩니다. 필터가 IIS에 필요한 이벤트 알림을 알릴 수있는 기회입니다. HCONN 핸들은 클라이언트가 연결되기 전에 발생하기 때문에이 함수에 전달되지 않습니다. 클라이언트 연결이 설정되고 GetSErverVariable이 호출 될 때까지는 필터가 이벤트 알림을 변경하기에는 너무 늦습니다. – veefu

0

-don 당신은 SERVER_SOFTWARE을 얻을 수 (또는 IIS 대 ISA를 나타내는 다른 변수) getenv()을 통해 환경으로부터 수 있습니다.