首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetResponseStream().ReadToEnd()只读取182955个字符吗?

GetResponseStream().ReadToEnd()只读取182955个字符吗?
EN

Stack Overflow用户
提问于 2014-09-15 21:02:47
回答 1查看 826关注 0票数 0

我正在做一个HTTP,并在响应中获得一个庞大的XML。我看到xml在第182956位图上被截断,因此我无法对响应进行反序列化。有什么方法可以让我阅读全部内容吗?提前谢谢你的帮助。

代码语言:javascript
复制
string myresponse = string.Empty();
 HttpWebResponse httpmyResponse = (HttpWebResponse)myrequest.GetResponse();
 response = new StreamReader(httpmyResponse.GetResponseStream()).ReadToEnd();

内容长度: 444313

内容-类型: application/xml

EN

回答 1

Stack Overflow用户

发布于 2014-09-16 23:20:23

我提到的所以贴 在评论中可能实际上解决了您的问题。特别是,如果将DefaultMaximumErrorResponseLength设置为更大的值,可能会有所帮助。在内部,这里是如何创建ResponseStream

代码语言:javascript
复制
   private Stream MakeMemoryStream(Stream stream) {
           // some code emitted here     
            SyncMemoryStream memoryStream = new SyncMemoryStream(0);      // buffered Stream to save off data
            try {
                //
                // Now drain the Stream
                //
                if (stream.CanRead) {
                    byte [] buffer = new byte[1024];
                    int bytesTransferred = 0;

                    int maxBytesToBuffer = (HttpWebRequest.DefaultMaximumErrorResponseLength == -1)?buffer.Length:HttpWebRequest.DefaultMaximumErrorResponseLength*1024;
                    while ((bytesTransferred = stream.Read(buffer, 0, Math.Min(buffer.Length, maxBytesToBuffer))) > 0)
                    {
                        memoryStream.Write(buffer, 0, bytesTransferred);
                        if(HttpWebRequest.DefaultMaximumErrorResponseLength != -1)
                            maxBytesToBuffer -= bytesTransferred;
                    }
                }
                memoryStream.Position = 0;
            }
            catch {
            }

            // some other code

            return memoryStream;
        }

这里的重要成员是响应流( stream )和响应流( memoryStream )--即响应流,您将因此返回到方法调用GetResposneStream()的响应流。如您所见,在读取流之前,方法将maxBytesToBuffer设置为DefaultMaximumErrorResponseLength*1024,如果DefaultMaximumErrorResponseLength不等于-1,则设置为buffer的长度,即1024。然后,在while循环中,它读取流,并在每次迭代中减少maxBytesToBuffer读取的字节数(maxBytesToBuffer -= bytesTransferred)。现在让我们考虑这两种情况。

  1. DefaultMaximumErrorResponseLength-1stream444313。在本例中,maxBytesToBuffer将等于buffer.Length,即1024。因此它将读取1024字节,因此bytesTransferred将是1024,在第一次迭代之后,maxBytesToBuffer将变为0(因为maxBytesToBuffer -= bytesTransferred),所以下次它将读取0字节,并退出while循环,因此您将只从整个流中读取1024字节。
  2. DefaultMaximumErrorResponseLength1024stream444313。在这种情况下,maxBytesToBuffer将等于DefaultMaximumErrorResponseLength*1024 = 1048576。再次进入while循环,它将读取1024 (因为Math.Min(buffer.Length, maxBytesToBuffer))。在每次迭代时,它都会通过maxBytesToBuffer减少1024,所以虽然循环可以迭代至少1024次,每次读取1024字节。经过粗略的433迭代(即内容长度444313/1024 = 433.8),它应该读取流中的所有内容。

说了这些之后,我首先检查DefaultMaximumErrorResponseLength的值,然后做数学计算(就像我以前做的那样),看看这是否是问题的根本原因。

代码取自参考资料来源网站

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25856853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档