2016-11-28 4 views
2

이것은 IIS 8.5에서 실행되는 고전적인 ASP입니다.기본 ASP : 실제 .asp 파일을 처리하기 전에 모든 요청을 시작할 때 일부 코드를 실행하십시오.

모든 * .asp 페이지에 공통적이어야하는 일부 VBScript를 실행하여 해당 * .asp 파일에 대한 모든 HTTP 요청의 시작 부분에서 실행해야합니다.

현재 각 .asp 파일의 맨 위에 #include 태그를 사용하고 있습니다. 실행할 코드가 들어있는 파일을 참조합니다.

트릭이 있지만 추악하고 위험합니다. * .asp 파일 중 하나에 #include 태그가 누락되면 코드가 실행되지 않습니다.

모든 * .asp 파일 내에 코드를 작성하지 않고 모든 * .asp 요청에 대해 일부 코드를 실행하는 방법이 있습니까?

ASP.NET에서 우리는 HttpApplication.BeginRequest 이벤트가 있습니다. 내가 찾고있는 것은 Classic ASP에서와 비슷하다. 모든 * .asp 요청이 시작될 때 Classic ASP 개체에 액세스 할 수있는 VBScript를 실행해야합니다.

편집 : @ Kul-Tigin 요청에 따라 다음과 같은 이유가 있습니다. 내 * .asp 파일이 ANSI로 인코딩되었습니다. 그러나 URL 요청은 UTF-8로 인코딩되어 문제가 발생합니다.

아무 것도하지 않으면 ASP 엔진은 URL (및 쿼리 문자열)을 ANSI에있는 것처럼 해독합니다. 예를 들어 쿼리 문자열 ?value=ç은 브라우저에서 ?value=%C3%A7으로 전송됩니다. C3A7은 UTF-8로 인코딩 된 'ç'의 바이트입니다. 그러나 ASP 엔진은 2 바이트를 2 개의 별도 ANSI 문자로 읽습니다. 따라서 아무 것도하지 않으면 Request.QueryString("value")은 길이가 2이고 내용이 "§"인 문자열이됩니다.

Sub Workaround() 
    Response.CodePage = 65001 ' Temporarally set the Response CodePage to UTF-8. Originally it was 1252 (ANSI). 
    Dim foo 
    foo = Request.QueryString("foo") 'ASP engine uses the Response.CodePage to decode the querystring 
    Response.CodePage = 1252 ' Set the Response CodePage back to ANSI. 
End Sub 
Workaround() 

나는 "foo는"쿼리 문자열에 대한 상관 없어, 심지어 존재하지 않을 수 있습니다 :

는이 문제를 해결하려면, 나는 WORKS 다음 해결 방법을 만들었습니다. ASP 쿼리 문자열 deserialization 엔진을 "만지기"위해이 작업을 수행합니다. Aparently 그것은 요청 처리 중에 처음 사용 된 모든 쿼리 문자열 값을 디코딩합니다. 따라서 코드 페이지를 1252로 다시 설정 한 후에도 앞의 예제에서 구체적인 쿼리 문자열 Request.QueryString("value")을 읽으면 "ç"이 포함 된 길이 1 문자열이됩니다.

해결 방법 코드를 workaround.inc 파일에 넣었으며 대부분의 * .asp 파일 시작 부분에이 코드를 포함시켜 문제를 해결했습니다. 그러나 1,000 개 이상의 .asp 파일이 있으며 아직 개발되지 않았습니다. 모든 이들이 workaround.inc을 포함하고 있는지 확인하는 것은 불가능합니다. 그래서 include 태그에 관계없이 모든 * .asp 요청에 대한 코드를 실행하려고했습니다.

내 문제에 대해 감사드립니다. 당신이 더 나은 해결책을 제시 할 수 있다면 나는 정말로 행복 할 것이다. 고맙습니다!

+1

당신 자신의 HttpHandler를 만들고 그것을 IIS에 등록하는 것을 제외하면'# include' 파일과는 별개로 많은 옵션이 없습니다. [클라이언트와 서버간에 레이어를 도입하기위한 고전적인 ASP 응용 프로그램의 HTTP 처리기] (http://softwareengineering.stackexchange.com/q/154102/131815)를 참조하십시오. – Lankymart

+0

로거 같은 소리가나요? 통합 파이프 라인이있는 응용 프로그램 풀에서 [Custom HTTP Module] (https://msdn.microsoft.com/en-us/library/ms227673.aspx) (.NET으로 작성)을 사용하여 수행 할 수 있습니다. 다른 방법이있을 수도 있으므로 물어봐야합니다. 어떤 특정 ASP 개체에 액세스 할 계획입니까? –

+0

@ Kul-Tigin 그것은 로거가 아닙니다. '요청'및 '응답'ASP 개체에 액세스해야합니다. 그 이유는 내 * .asp 파일이 ANSI 인 동안 UTF-8로 인코딩 된 쿼리 문자열로 요청을 처리하기위한 해결 코드를 실행해야하기 때문입니다. 아무것도하지 않으면 고전적인 ASP 엔진은 2 바이트 utf-8 단일 문자를 2 개의 별개 ANSI 문자로 읽습니다. 시작 부분에 'Response.CodePage = 65001'(utf-8)을 설정하고 임의의 쿼리 문자열을 읽은 다음 'Response.CodePage'를 다시 원래 값으로 설정하면 나머지 페이지에 대해 올바르게 읽습니다. –

답변

-1

고전적인 ASP에서 당신은 global.asa 파일을 가지고 (응용 프로그램에서) 세션에 대한 응용 프로그램뿐만 아니라 2에 대한이 사건

응용 프로그램 는 (서버가 시작되는/정지)를 사용할 수 있습니다

세션 (사용자 세션이 생성 언로드/완료)

http://www.w3schools.com/asp/asp_globalasa.asp

뿐만 아니라, 페이지 당, 당신은 내가 자체 페이지 기준에 따라 다른 파일을 #include를 할 수있는 공통의 #include 사용하는 것이 단순 들어 onLoadonUnload 이벤트

https://msdn.microsoft.com/en-us/library/ms952648.aspx

+0

'global.asa'의 어떤 이벤트도 요청 당 트리거하지 않으며'Window_OnLoad()'에 대한 참조는 서버 측이 아닌 클라이언트 측 코드로서 명백히 잘못되었습니다. 또한 w3schools를 참조로 사용한다는 사실은 저를 불신으로 가득 채 웁니다. – Lankymart

+0

또한'Application' 이벤트는 서버가 멈추고 시작될 때 발생하지 않습니다. 웹 응용 프로그램이 중지되고 시작될 때 응용 프로그램 풀에 의해 제어되고 어떤 리사이클 일정이 정의 되어도 시작됩니다. – Lankymart

+0

@Lankymart 누군가 개발을 위해, * 서버 시작/중지 *는 APP Pool on/off ...를 의미합니다. 정말로, 이제 의미론을 선택하겠습니까? – balexandre

0

를 사용할 수 있습니다.

+0

ASP는 조건부 포함을 수행하지 않습니다. "페이지 기준에 따라"다른 것을 의미합니까? – Martha

+1

아니요 - 포함 된 코드가 조건부로 실행되면 그 점이 제가 작성한 것입니다. –