GetResponseStream())。ReadToEnd()只读182955个字符

时间:2014-09-15 21:02:47

标签: c# http

我正在进行HTTP POST并在响应中获取大量XML。我看到xml在182956的charcater被截断,因此我无法反序列化响应。有没有办法可以阅读整个内容?在此先感谢您的帮助。

string myresponse = string.Empty();
 HttpWebResponse httpmyResponse = (HttpWebResponse)myrequest.GetResponse();
 response = new StreamReader(httpmyResponse.GetResponseStream()).ReadToEnd();

内容长度:444313

Content-Type:application / xml

1 个答案:

答案 0 :(得分:0)

SO post我提到in comments可能会解决您的问题。特别是如果您将DefaultMaximumErrorResponseLength设置为更大的值,它可能会有所帮助。在内部,这里是如何创建ResponseStream

   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 { {1}}。然后,在1024循环中,它读取流,并在每次迭代时减少while读取的字节数(maxBytesToBuffer)。 现在让我们考虑两种情况

  1. maxBytesToBuffer -= bytesTransferredDefaultMaximumErrorResponseLength-1长度为stream。在这种情况下,444313将等于maxBytesToBuffer,即buffer.Length。因此它会读取1024字节,结果1024将为bytesTransferred,在第一次迭代后,1024将变为0(因为maxBytesToBuffer),所以下次它将读取maxBytesToBuffer -= bytesTransferred个字节,并退出0循环,因此您将从整个流中读取while个字节。
  2. 1024DefaultMaximumErrorResponseLength1024长度为stream。在这种情况下,444313将等于maxBytesToBuffer。再次首次输入DefaultMaximumErrorResponseLength*1024 = 1048576循环,它将显示while(因为1024)。在每次迭代时,它将Math.Min(buffer.Length, maxBytesToBuffer)减少maxBytesToBuffer,因此while循环可以迭代至少1024次,每次读取1024个字节。经过大约1024次迭代(即您的内容长度433)后,它应该会读取流中的所有内容。
  3. 说完这个之后,我首先要检查444313/1024 = 433.8的价值是什么,然后做数学运算(就像我之前做过的那样),看看这是否是你问题的根本原因。

    代码取自MS Reference Source web site