C# 如何在HttpWebReqest中读取ConnectStream

C# 如何在HttpWebReqest中读取ConnectStream,c#,.net,stream,httpwebrequest,httpwebresponse,C#,.net,Stream,Httpwebrequest,Httpwebresponse,在尝试读取HttpWebRequest和HttpWebResponse类的底层流时,我遇到了麻烦。事实证明,这些不是内存流;它们属于ConnectStream类型。这种类型的流的问题是它不支持读、写、查找,什么都不支持。每次我尝试使用这种类型的流执行某些操作时,都会出现不受支持的异常 有没有一种方法可以使用其他类型的流来代替实际可读的ConnectStream 代码: 请注意,当我使用SoapExtension(用于某些其他功能)时,它会切换流类型,我无意中在这里得到了实际上可读的MemoryS

在尝试读取HttpWebRequest和HttpWebResponse类的底层流时,我遇到了麻烦。事实证明,这些不是内存流;它们属于ConnectStream类型。这种类型的流的问题是它不支持读、写、查找,什么都不支持。每次我尝试使用这种类型的流执行某些操作时,都会出现不受支持的异常

有没有一种方法可以使用其他类型的流来代替实际可读的ConnectStream

代码:


请注意,当我使用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;
    }
}