C# 如何在HttpWebReqest中读取ConnectStream
在尝试读取HttpWebRequest和HttpWebResponse类的底层流时,我遇到了麻烦。事实证明,这些不是内存流;它们属于ConnectStream类型。这种类型的流的问题是它不支持读、写、查找,什么都不支持。每次我尝试使用这种类型的流执行某些操作时,都会出现不受支持的异常 有没有一种方法可以使用其他类型的流来代替实际可读的ConnectStream 代码:C# 如何在HttpWebReqest中读取ConnectStream,c#,.net,stream,httpwebrequest,httpwebresponse,C#,.net,Stream,Httpwebrequest,Httpwebresponse,在尝试读取HttpWebRequest和HttpWebResponse类的底层流时,我遇到了麻烦。事实证明,这些不是内存流;它们属于ConnectStream类型。这种类型的流的问题是它不支持读、写、查找,什么都不支持。每次我尝试使用这种类型的流执行某些操作时,都会出现不受支持的异常 有没有一种方法可以使用其他类型的流来代替实际可读的ConnectStream 代码: 请注意,当我使用SoapExtension(用于某些其他功能)时,它会切换流类型,我无意中在这里得到了实际上可读的MemoryS
请注意,当我使用SoapExtension(用于某些其他功能)时,它会切换流类型,我无意中在这里得到了实际上可读的MemoryStream,这正是我所需要的。但是,我必须在某个时候关闭soapextension,这就是问题开始出现的地方:ConnectStream根本不可读。响应流只能读取一次。所有处理都需要使用
MemoryStream
请显示您试图使用的代码。例如,可能您在错误的时间点访问流。您真正想做什么?除了尝试使用底层流之外,可能还有其他方法?添加了其他信息@jgauffin我正在尝试获取底层流,以便读取用于日志记录目的的XML数据。但是流类型是ConnectStream,它显然不支持MemoryStream所做的任何正常读取/查找操作。有没有办法强制HttpWebResponse改用MemoryStream?没有。您可以将对HttpWebRequest的所有调用封装在一个类中,也可以派生它们并使用新的公共流GetResponseStream()覆盖原始实现。您还可以看看微软的Moles项目(尽管我强烈建议您不要使用该解决方案)。
public class BaseAsmxProxy : SoapHttpClientProtocol
{
protected override System.Xml.XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize)
{
string responseXml = GetResponseDataFromStream(message.Stream);
return base.GetReaderForMessage(message, bufferSize);
}
private string GetResponseDataFromStream(System.IO.Stream stream)
{
string returnValue = null;
long initialPosition = stream.Position;
stream.Seek(0, SeekOrigin.Begin);
StreamReader reader = new StreamReader(stream);
returnValue = reader.ReadToEnd();
stream.Seek(initialPosition, SeekOrigin.Begin);
return returnValue;
}
}