C# HTTPWebResponse响应字符串被截断
应用程序正在与REST服务对话。 Fiddler显示完整良好的XML响应作为应用程序响应 该应用程序在法属波利尼西亚,在新西兰有一个完全相同的副本,所以主要嫌疑人似乎在编码,但我们已经检查过了,结果空手而归 查看来自流读取器的输出字符串(UTF8编码),您可以看到它被截断的位置。它位于一段无害的xml中。XmlDocument对象上的下游错误声称在将字符串加载到XML文档对象时遇到了意外的文件结尾,这是很公平的 截断点为C# HTTPWebResponse响应字符串被截断,c#,http,C#,Http,应用程序正在与REST服务对话。 Fiddler显示完整良好的XML响应作为应用程序响应 该应用程序在法属波利尼西亚,在新西兰有一个完全相同的副本,所以主要嫌疑人似乎在编码,但我们已经检查过了,结果空手而归 查看来自流读取器的输出字符串(UTF8编码),您可以看到它被截断的位置。它位于一段无害的xml中。XmlDocument对象上的下游错误声称在将字符串加载到XML文档对象时遇到了意外的文件结尾,这是很公平的 截断点为 ns6:sts krn>1& 哪一个是 ns6:sts krn>1更简单的
ns6:sts krn>1& 哪一个是
ns6:sts krn>1更简单的方法是:
string responseString;
using (StreamReader readStream = new StreamReader(streamResponse, encode))
{
responseString = readStream.ReadToEnd();
}
对于调试,我建议将该响应流写入一个文件,以便您能够准确地看到读取的内容。此外,您可以考虑使用单字节编码(如ISO-859-1)来读取数据并写入文件。
您应该检查
response.ContentType
属性以查看是否使用了其他文本编码。您需要使用使用块:
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());
}
}
}
}
这将确保您的WebResponse
、Stream
和StreamReader
都得到清理,无论是否存在任何异常
促使我考虑使用
块的原因是:
某些操作未完成
没有隐藏异常的try/catch块,因此如果操作由于异常而未完成,我们将知道它
存在实现IDisposable
的对象,这些对象不在使用块的中
结论:尝试使用
块实现,查看处理对象是否会导致操作完成
我加上这一点是因为推理实际上是相当普遍的。同样的道理也适用于“我的邮件在两分钟内无法发送”。在这种情况下,未完成的操作是“发送电子邮件”,实例是SmtpClient
和MailMessage
对象。请用您的代码示例替换“感谢注释”/签名。很可能您读错了/使用了错误的编码。另外,在编辑文章时,也要确保将样本数据格式化为代码。查看Fiddler中的实际字节-我打赌编码不是Utf8和Utf8“这是ns6:sts krn>1的一部分,新西兰安装了相同的REST引擎和相同的应用程序。i、 这是一个封闭的系统。在NZ中,相同的测试事务生成相同的字符串,并且不会被代码截断。从响应头->xml version=“1.0”encoding=“utf-8”standalone=“yes”中,编码肯定是utf-8。FP中的Fiddler能够以XML模式查看响应,而不会出现问题。我们在FP的人进入了十六进制级别的fiddler响应,并确认该区域没有伪造字符。与我的代码相比,它是如此优雅。在明天FP可用之前,我不知道它是否起到了作用。为什么要解决这个问题(这是部分响应,不是挂起或根本没有响应)?添加了响应。ContentType它返回“text/plain”
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());
}
}
}
}