读取Stream对象而不使用它

时间:2012-02-06 17:16:19

标签: c# winforms xml-rpc

我正在使用XML-RPC.NET(来自http://www.xml-rpc.net/)和HttpListener方法在特定网络端口上侦听XML-RPC通信并对其进行响应。

可以通过HttpListenerContextInstance.Request.InputStream Stream对象访问进入的请求正文:

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

可以从hlcContext.Request.InputStream访问Stream但是这个Stream是不可搜索的,所以我无法读取它/显示它然后回到它的开头,以便XML-RPC.NET库可以使用它需要它。一旦阅读,它就被消耗掉了,无法重新阅读。

我知道处理这种情况的一种方法是将它从Stream转换为支持搜索的MemoryStream,但是,我不知道如何做到这一点,以便XML-RPC.NET继续使用MemoryStream而不是Stream。只是将Stream复制到MemoryStream似乎消耗了Stream,使得它在此之后无法使用:

// 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 :(

如何从Stream读取以便我可以将其存储在String中并让Stream在此之后继续使用XML-RPC.NET?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

这应该适用于支持搜索的Stream(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;