HTTPWebResponse响应字符串被截断

时间:2014-06-13 01:16:57

标签: c# http

App正在与REST服务进行通信。 Fiddler在应用程序响应中显示完整的良好XML响应 该应用程序在法属波利尼西亚和新西兰的相同副本工作,所以主要的嫌疑人似乎编码,但我们已经检查出来并空手而归。

查看流阅读器中的输出字符串(UTF8编码),您可以看到它被截断的位置。它是一个无害的xml片段。 XmlDocument对象的下游错误声称在将字符串加载到XML Document对象时遇到了意外的文件结尾,这是公平的。

截断点为
NS6:STS-KRN→1&安培;

是其中的一部分 NS6:STS-KRN→1< / NS6:STS-KRN><

响应字符串或我们应该检查的其他参数是否有任何大小限制。 我完全没有想法。代码按要求提供。

Stream streamResponse = response.GetResponseStream();
StringBuilder sb = new StringBuilder();

Encoding encode = Encoding.GetEncoding("utf-8");
if (streamResponse != null)
{
    StreamReader readStream = new StreamReader(streamResponse, encode);
    while (readStream.Peek() >= 0)
    {
        sb.Append((char)readStream.Read());
    }
    streamResponse.Close();
}

2 个答案:

答案 0 :(得分:1)

更简单的方法是:

string responseString;
using (StreamReader readStream = new StreamReader(streamResponse, encode))
{
    responseString = readStream.ReadToEnd();
}

对于调试,我建议将该响应流写入文件,以便您可以准确地看到读取的内容。此外,您可以考虑使用单字节编码(如ISO-8859-1)来读取数据并写入文件。

您应该检查response.ContentType属性以查看是否使用了其他文本编码。

答案 1 :(得分:1)

您需要使用using块:

using (WebResponse response = request.GetResponse())
{
    using (Stream streamResponse = response.GetResponseStream())
    {
        StringBuilder sb = new StringBuilder();

        if (streamResponse != null)
        {
            using (StreamReader readStream = new StreamReader(streamResponse, Encoding.UTF8))
            {
                sb.Append(readStream.ReadToEnd());
            }
        }
    }
 }

这将确保您的WebResponseStreamStreamReader全部清除,无论是否有例外。


让我思考using块的原因是:

  1. 某些操作未完成
  2. 没有try / catch块隐藏异常,所以如果由于异常操作没有完成,我们就会知道它。
  3. 有些实现IDisposable的对象不在using
  4. 结论:尝试实现using块以查看是否处理对象将导致操作完成。

    我添加了这个,因为推理实际上非常普遍。同样的推理适用于“我的邮件消息不会被发送两分钟”。在这种情况下,未完成的操作是“发送电子邮件”,实例是SmtpClientMailMessage个对象。