2009-04-25 4 views
1

로깅 목적으로 WCF에 구현 된 내 RESTful 웹 서비스로 보낸 원시 요청을 받고 싶습니다.WCF에서 요청의 원시 바이트를 어떻게 가져올 수 있습니까?

이미 IDispatchMessageInspector을 구현했습니다. AfterReceiveRequest을 구현할 때 메시지의 내용이 유효하지 않은 경우에도 (그리고 특히) 메시지의 원시 바이트를 뱉어 내고 싶습니다. 이것은 디버깅을위한 것입니다. 내 서비스는 완벽하게 작동하지만 서비스를 호출하려고하는 클라이언트의 문제 (원시 바이트)가 무엇인지 알기 위해 도움이되는 경우가 종종 있습니다.

예를 들어 올바른 형식의 XML 문서를 보내는 대신 문자열 "your mama"를 내 서비스 끝점에 게시한다고 가정 해 봅시다. 나는 그들이 그렇게 한 것을보고 싶다. 메시지 내용이 이미 올바른 형식의 XML이 아니라면 불행하게도 MessageBuffer::CreateBufferedCopy()을 사용하면 작동하지 않습니다. 여기

// The immediately following line raises an exception if the message 
// does not contain valid XML. This is uncool because I want 
// the raw bytes regardless of whether they are valid or not. 
using (MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue)) 
{ 
    using (MemoryStream stream = new MemoryStream()) 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     buffer.WriteMessage(stream); 
     stream.Position = 0; 
     Trace.TraceInformation(reader.ReadToEnd()); 
    } 
    request = buffer.CreateMessage(); 
} 

내 생각이 나는 그것이 Message된다 전에 원시 요청 얻을 필요가있다 :

여기에 (대략) 이미 AfterReceiveRequest 내 구현이 무엇인지입니다. 이것은 대부분 IDispatchMessageInspector보다 WCF 스택의 하위 수준에서 수행되어야합니다.

누구든지이 작업을 수행하는 방법을 알고 있습니까?

답변

2

인코더를 제작하고 싶습니다. 이것은 메시지를 생성하기 위해 와이어에서 바이트를 가져옵니다 (모든 프로토콜 채널이 유효성 검사를 시작하기 전에).

http://msdn.microsoft.com/en-us/library/ms751486.aspx

+0

감사 구글! 그것은 트릭을했다. –

관련 문제