【问题标题】:Put string into textbox -> not complete将字符串放入文本框 - >不完整
【发布时间】: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


【解决方案1】:

看看这个Post

您的问题是,使用 Stream.Read 您可能读取的字符数少于总字符数,因为它们可能尚未在网络上可用。

所以你的字符串已经只包含文本的第一部分。 s.Length 表示从字节数组 x 复制过来的正确字符数,但大多数字符为 0 (Char '\0')。 textBox2.TextLength 然后指示已读取的正确字符数。我想它会修剪 '\0' 字符。

您应该改用 while 循环并检查 Read 的结果,如前所述。

还要检查 html 页面的编码。对于 UTF8(HTML 5 中的默认值),一个字节不一定对应一个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2023-01-10
    相关资源
    最近更新 更多