我正在使用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?
答案 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;