2012-05-17 1 views
1

Windows Server 2008 상자의 IIS 7.5에서 통합 모드로 실행되는 이전의 오래된 ATL 서버 웹 서비스에 일부 SOAP 메시지 로깅 기능을 추가하려고하지만 이상한 상태로 실행됩니다. 문제. 더 많은 배경 지식을 얻기 위해 HttpModule을 포함하는 어셈블리를 ATL 서버 웹 서비스의 web.config 모듈 요소에 추가했습니다.HttpModule ATL 서버 서비스 InputStream 오류

대답은 here이고 로깅 자체는 훌륭합니다.

그러나이 로깅 기능을 사용할 때마다 서비스는 "SOAP 잘못된 요청"으로 응답하지만 로그 파일에는 예상대로 SOAP 메시지가 있습니다. 나는 주위를 둘러 보면서 많은 일을했으며, BeginRequest 이벤트에 대한 처리기의 요청 개체의 InputStream 속성에 액세스 할 때만 발생한다는 것을 알았습니다. 심지어 단순히이 같은의 InputStream의 길이에 변수를 설정하면 그것은 실패합니다

private void OnBegin(object sender, EventArgs e) 
    { 
    var request = _application.Request; 
    //this will blow up 
    var foo = request.InputStream.Position; 
    } 

내가에만있을 때 훨씬 좋은하지 않습니다 내 처리기에서의 InputStream을 (접촉하지 않는 경우 요청의 내용을 기록하기 위해이를 수행함), 요청은 완벽하게 통과합니다.

요청 개체의 헤더 값과 관련된 다양한 HttpApplication 속성에 액세스 할 수 있지만 InputStream에 액세스하면 서비스가 중단됩니다.

이 로깅을 수행하지 못하게하는 ATL 서버 고유의 것이 있습니까? 이것이 작동하는지 확인하기 위해 BeginRequest 핸들러에 일종의 잠금 또는 기타 안전 장치를 추가해야합니까? 내 처리기가 InputStream을 처리하여 서비스에 사용할 수 없게되는 원인이 무엇입니까?

또 다른 방법은 내 HttpModule이 실행 된 후 요청을 내 서비스로 가져올 수 있는지 확인하는 것입니다.

서비스를 테스트하기 위해 SoapUI를 사용 중임에 유의할 필요가 있습니다.

편집 : 지금 IIS에서 추적을 일부 실패한 요청을 한 적이 그리고 난이 오류 메시지가 :

ModuleName IsapiModule 
Notification 128 
HttpStatus 500 
HttpReason Internal Server Error 
HttpSubStatus 0 
ErrorCode 0 
ConfigExceptionInfo 
Notification EXECUTE_REQUEST_HANDLER 
ErrorCode The operation completed successfully. (0x0) 

이것은 ATL 서버 웹 서비스의 핸들러에 제공 (서비스에 대한 즉, DLL). 나는 그것이 의미 생각

BytesReceived 0 
ErrorCode 2147942438 
ErrorCode Reached the end of the file. (0x80070026) 

은 그 뜻 : 그는 "GENERAL_READ_ENTITY_START"와 "GENERAL_READ_ENTITY_END"메시지와 "END"를 직접 사용하기 전에이 메시지를 가지고? 처리기에서 데이터를 가져 오지 못하고 있습니까? 이게 내 HttpModule이 Request의 InputStream을 망친다는 것을 보여주는 또 다른 증거인가?

답변

0

결국 나는 이것이 실행 가능한 접근 방법이 아니라고 결론을 내 렸습니다. 나는 IIS 6에서 HttpModule을 전혀 사용할 수 없었습니다. (수용 할 수있는 해결책이되기 위해 필요합니다). 요청 개체 및 다른 미친 아이디어, 모든 종류의 필터 속성을 설정했지만 HttpModule 요청 본문을 기록 할 수 및 서비스가 여전히 작동하도록 수있는 모든 사람이 시도했다.

나는 더 많은 것을 파고 들었고이 문서에 관해서는 codeproject인데,이 문서에서는 ATL 서버의 내부 동작, 특히 atlsoap.h의 HandleRequest 메서드에 대해 설명합니다. 나는 잠시 동안 거기에서 비웃었고, 거기의 요청 몸에 도착하는 길을 이해했다. 그리고 그것은 그것을 거기에서 수동으로 파일에 쓰는 것이 꽤 간단했다. 그 호기심에 대한

이 내가 HandleRequest()에 추가 된 마지막 코드 :

//****************************************REQUEST LOGGING********************************************************** 
     BYTE* bytes = pRequestInfo->pServerContext->GetAvailableData(); 
     FILE* pFile; 
     pFile = fopen("C:\\IISLog\\ATL.txt", "a"); 
     fwrite(bytes, 1, pRequestInfo->pServerContext->GetAvailableBytes(), pFile); 
     fclose(pFile); 
//****************************************REQUEST LOGGING********************************************************** 

는 아직도 좀 더 함께 놀러 갈거야,하지만 난 가능한 솔루션으로 표시되는 내용이 .

0

요청 개체가 유효합니까? 참조하는 샘플과 약간 다른 방식으로 작업하고 있습니다. 그들은 회원 변수에 의존하는 반면 발신자 인수에서 스트림을 추출합니다.

+0

좋은 질문 (응답 해 주셔서 감사합니다.)하지만 그래, 요청이 유효하다고 확신합니다. 동일한 결과로 링크 된 해당 예제의 정확한 구문을 사용하여 시도했습니다. 나 또한 온전한 체크를하고 일반 Jane ASP.NET 웹 사이트에이 HttpModule을 추가했으며 제대로 작동했습니다 (요청이 기록되어 대상 페이지에 나타났습니다). 아주 이상한. –