2012-02-06 5 views
0

XML-RPC.NET (http://www.xml-rpc.net/)과 특정 네트워크 포트에서 XML-RPC 통신을 수신하고 응답하는 HttpListener 메서드를 사용하고 있습니다.Stream 객체를 읽지 않고 읽음

HttpListener hlListener = new HttpListener(); 
HttpListenerContext hlcContext = hlListener.GetContext(); 
// hlcContext.Request.InputStream contains what I want 

스트림 hlcContext.Request.InputStream에서 액세스 할 수 있지만,이 스트림은 그래서 그것을 읽을 수 없습니다 시크되지 /를 표시 :

에서 오는 요청의 본문은 HttpListenerContextInstance.Request.InputStream Stream 개체를 통해 액세스 할 수 그런 다음 XML-RPC.NET 라이브러리가 필요에 따라 사용할 수 있도록 다시 시작 부분을 찾으십시오. 일단 읽으면 소비되고 다시 읽을 수 없습니다.

이 상황을 처리하는 한 가지 방법은 Stream에서 MemoryStream으로 변환하는 것이지만, XML-RPC.NET이 계속되도록이 방법을 모르는 것입니다. 스트림 대신 MemoryStream을 사용합니다.

// hlcContext.Request.InputStream is currently filled 
MemoryStream msInput = new MemoryStream(); 
hlcContext.Request.InputStream.CopyTo(msInput); 
byte[] byteInput = msInput.ToArray(); 
// hlcContext.Request.InputStream is now empty and XML-RPC.NET can no longer use it :(

내가 문자열에 저장하고 스트림 작업을 계속 가질 수 있도록 내가 스트림에서 읽을 수있는 방법 : 그냥 MemoryStream을에 스트림을 복사하면 그 시점 과거는 사용할 수 없게 스트림을 소비하는 것 그 시점 이후에 XML-RPC.NET?

+0

방법을 사용할 수있다 XML-RPC.NET에 스트림을 제공하고 있습니까? 나는 당신의 예제 코드에서 그것을 보지 못한다. –

+0

스트림은 웹 사이트에 액세스 할 때마다 (http : // localhost/DoSomething) XML-RPC.NET 라이브러리에 의해/어딘가에 만들어집니다. – Coder6841

+0

코드를 살펴볼 시간이 없지만'HttpListener'가 XML RPC 타입이라고 가정하면 서브 클래스를 만들고 필요한 동작을 주입하기 위해'GetContext()'를 구현하는 방법을 변경할 수 있습니다. –

답변

1

은 여기 (최후의 수단으로) Request.InputStream에 스트림을 설정하는 해킹 이제

MemoryStream msInput = new MemoryStream(); 
hlcContext.Request.InputStream.CopyTo(msInput); 
byte[] byteInput = msInput.ToArray(); 
msInput.Seek(0, SeekOrigin.Begin); 

request.GetType().InvokeMember("m_RequestStream", BindingFlags.SetField | BindingFlags.Instance | BindingFlags.NonPublic, null, request, new object[] { msInput }); 

자유롭게 byteInput

+0

코드를 해킹/최후의 수단으로 만드는 것은 무엇입니까? 그것은 불안정성을 가져올 것입니까? 응용 프로그램은 중요한 비즈니스 응용 프로그램이므로 예상치 못한 문제가 발생할 수 있으면 사용하지 않는 것이 좋습니다. – Coder6841

+0

@ Coder6841, 나는 불안정하다고 생각하지 않습니다. 이 코드를 사용하면'request' 객체의 private 변수 ('m_RequestStream')에 접근 할 수 있습니다. MS가 당신이 그것을 원한다면, 그것을 공개로 표시 할 것입니다. 이것은 다음 릴리스에서 변경 될 수 있음을 의미합니다.닷넷 프레임 워크 (이전 버전에서 어떤 변화도 보지 못했지만) –

+0

완벽하게 작동합니다. 감사합니다! – Coder6841

0

이 기능은 검색 (CanSeek == true)을 지원하는 스트림에서 작동합니다. 당신은 합법적 인 방법을 찾을 수없는 경우

MemoryStream msInput = new MemoryStream(); 
var preCopyPosition = hlcContext.Request.InputStream.Position; 

hlcContext.Request.InputStream.CopyTo(msInput); 
byte[] byteInput = msInput.ToArray(); 

// Go back to pre-copy state 
hlcContext.Request.InputStream.Position = preCopyPosition; 
+0

아쉽게도 스트림은 검색을 지원하지 않습니다. "hlcContext.Request.InputStream.Position = preCopyPosition;" 지원되지 않는 예외가 발생합니다. – Coder6841

+2

확인. 복사본을 막으려면이 파일을 남겨 두겠습니다. –

관련 문제