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