我使用XML-RPC.NET (来自http://www.xml-rpc.net/)和HttpListener方法来侦听特定网络端口上的XML-RPC通信并对其进行响应。
传入的请求主体可以通过HttpListenerContextInstance.Request.InputStream流对象进行访问:
HttpListener hlListener = new HttpListener();
HttpListenerContext hlcContext = hlListener.GetContext();
// hlcContext.Request.InputStream contains what I want流可以从hlcContext.Request.InputStream访问,但是这个流是不可查找的,所以我不能读取它/显示它,然后返回到它的开头,这样XML-RPC.NET库就可以根据需要使用它。一旦它被读取,它就会被消耗,并且不能被重新读取。
我知道处理这种情况的一种方法是将它从流转换成支持查找的MemoryStream,然而,我不知道有什么方法可以这样做,这样XML-RPC.NET就可以继续使用MemoryStream而不是流。仅仅将流复制到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 :(如何读取Stream,以便将其存储在字符串中,并使Stream在该点之后继续与XML-RPC.NET一起工作?
发布于 2012-02-07 02:29:37
如果你不能找到一种合法的方式,这里有一个将流设置为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了
发布于 2012-02-07 01:30:54
这应该与支持查找的流一起工作(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;https://stackoverflow.com/questions/9164194
复制相似问题