2010-03-19 3 views
0


IIS6에서 실행되는 이전 ISAPI 필터를 바꾸고 싶습니다. 이 필터는 요청이 특별한 종류인지 확인한 다음 헤더를 조작하고 요청을 계속합니다. 다른 특별한 ISAPI 모듈을 호출 할 때 필요한 두 가지 헤더가 조작 방법에 추가되었습니다.헤더를 조작 한 다음 C#으로 헤더를 처리하는 방법?

DWORD OnPreProc(HTTP_FILTER_CONTEXT *pfc, HTTP_FILTER_PREPROC_HEADERS *pHeaders) 
{ 
    if (ManipulateHeaderInSomeWay(pfc, pHeaders)) 
    { 
     return SF_STATUS_REQ_NEXT_NOTIFICATION; 
    } 
    return SF_STATUS_REQ_FINISHED; 
} 

내가 지금 IIS7에 대한 관리 모듈로이 ISAPI 필터를 다시 작성하려면 : 같은
그래서 내가 ISAPI C를 가지고 ++ 코드입니다. 그래서 저는 다음과 같은 것을 가지고 있습니다 :

private void OnMapRequestHandler(HttpContext context) 
{ 
    ManipulateHeaderInSomeWay(context); 
} 

이제 무엇을 할 수 있습니까? 요청이해야 할 일을하지 않는 것처럼 보입니다.
이미 동일한 방법을 구현하는 IIS7 기본 모듈을 작성했습니다. 그러나이 방법은 다음에 무엇을 해야할지를 알 수있는 반환 값을 가지고 있습니다.

REQUEST_NOTIFICATION_STATUS CMyModule::OnMapRequestHandler(IN IHttpContext *pHttpContext, OUT IMapHandlerProvider *pProvider) 
{ 
    if (DoSomething(pHttpContext)) 
    { 
     return RQ_NOTIFICATION_CONTINUE; 
    } 
    return RQ_NOTIFICATION_FINISH_REQUEST; 
} 

다시 조작 된 컨텍스트를 다시 보낼 수있는 방법이 있습니까?

+0

. 그 컬렉션의 값을 조작하고 나중에 ASP.Net 파이프 라인에서 계속하려고한다고 생각합니다. –

+0

컬렉션의 값을 조작하지 않지만 "url"및 "ORIGINALURL"이라는 두 개의 추가 헤더를 컬렉션에 추가합니다. "url"헤더의 값은 내가 사용하는 DLL의 상대 경로를 가리키며 "ORIGINALURL"헤더는 원래 보낸 URL을 값으로 가져옵니다. –

+0

요청에 대한 HttpHandler에 도달하면 해당 항목이 더 이상 존재하지 않습니까? 의도 한 기능은 무엇입니까? 일반적으로 "초기화"메서드의 IHttpModule을 "PostAuthorize"이벤트 (또는 적절하다고 생각되는 다른 이벤트)에 연결합니다. 이 기능은 ASP.Net 파이프 라인에서 필터로 실행되며 결국 HttpHandler에서 끝납니다. 당신에게 적합하지 않은 기능은 무엇입니까? 또는 귀하의 질문을 잘못 읽고 있습니까? (추가 된 헤더가 필요한 기능은 Request.Headers를 읽거나 HTTP 스트림에서 헤더를 읽는 것입니까? –

답변

0

마침내 발견했습니다. 덧글에서 언급했듯이 요청에 두 개의 헤더를 추가합니다.이 헤더는 결국 DLL에서 요청을 처리하는 데 필요합니다. url 헤더에 DLL 경로가 포함되어 있습니다. 그래서 그 DLL로 리디렉션을해야합니다.
이것은 다음 코드로 수행됩니다 : 당신은 ASP.Net 파이프 라인에있을 때, 당신의 HttpHeader가 Request.Headers 수집로 추상화되어

private void OnMapRequestHandler(HttpContext context) 
{ 
    ManipulateHeaderInSomeWay(context); 
    string url = context.Request.Header["url"]; // path of the DLL 

    // now this is the important call! 
    context.Server.TransferRequest(url, true); 
}