【发布时间】:2015-08-10 12:07:26
【问题描述】:
我点击了一个小型 WinForms 应用程序进行测试。它有两个多行文本框和一个按钮,按下时会向服务器发送请求并将响应标头和内容发布到文本框中,如下所示:
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
int len = 0;
foreach (var header in response.Headers)
{
var str = header.ToString();
textBox1.AppendText(str + "=" + response.Headers[str] + "\n");
if (str == "Content-Length") len = Convert.ToInt32(response.Headers[str]);
}
Stream respStream = response.GetResponseStream();
byte[] x = new byte[len];
respStream.Read(x, 0, len);
var s = new string(ascii.GetChars(x, 0, len));
// textBox2.Text = s;
textBox2.Clear();
textBox2.AppendText(s);
MessageBox.Show(textBox2.TextLength.ToString(), s.Length.ToString());
但无论我使用 AppendText 还是分配字符串,MessageBox 始终显示标题 7653 和消息 3964,并且标题文本框包含行 Content-length=7653。
所以似乎字符串没有完全附加到文本框。为什么会这样?
顺便说一句:我正在请求一个 HTML 文档;显示的最后两个字符是“.5”,缺少的前两个字符是“16”,因此它不会在某些特殊字符处中断。
【问题讨论】:
-
这是一种将响应读取为字符串的复杂方式。
len的值是多少?为什么不直接使用string response = new StreamReader(response.GetResponseStream()).ReadToEnd()? -
@CodeCaster 好吧,我的日常 C# 经验完全没有任何流,并且结合不同对象的这些无限可能,我想我无法自动找到最聪明的解决方案第一次尝试......虽然它适用于您的 sn-p,但我仍然想知道我的代码出了什么问题。
if (str == "Content-Length") len = Convert.ToInt32(response.Headers[str]);应该回答您的问题“len的价值是什么?” -
我可以阅读代码,但我无法在心理上调试它。我问是因为您必须在运行时检查它。您还必须检查
Stream.Read的返回值并在循环中调用它。
标签: c# stream httpwebresponse