【问题标题】:C# HttpWebRequest Server not returning full responseC# HttpWebRequest 服务器未返回完整响应
【发布时间】:2014-08-22 05:11:29
【问题描述】:

我正在向返回带有数据的 HTML 的服务器发出 HTTP 请求。但有时它在没有任何明确解释的情况下“停在中间”。 例如响应结束:

[...Content length 14336 chars ...]</tbody></table><p /><br /><ul id=

它只是在生成 HTML 的过程中停止。 我的代码:

var request = (HttpWebRequest) WebRequest.Create("http://example.com);
var authInfo = string.Format("{0}:{1}", "username", "password");
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
request.Headers.Add("Authorization", "Basic " + authInfo);
request.Credentials = new NetworkCredential(user.Xname, decryptedPassword);
request.Method = WebRequestMethods.Http.Get;
request.AllowAutoRedirect = true;
request.Proxy = null;
var response = (HttpWebResponse) request.GetResponse();
var stream = response.GetResponseStream();
var streamreader = new StreamReader(stream, Encoding.GetEncoding("ISO-8859-2"));
var s = streamreader.ReadToEnd();

代码有没有可能一直等到最后?

【问题讨论】:

  • 如果网络服务器的防病毒软件中有电子邮件过滤器,可能会导致类似的症状。
  • 响应文本中是否有NULL 字符? bytes.com/topic/asp-net/answers/…

标签: c# .net http


【解决方案1】:

当您在本地(调试)执行 http web 请求时,几乎没有网络延迟,一切都很好,但是当您在互联网上使用相同的代码时,服务器不会将所有响应数据发送到一个块中,服务器可能是忙于处理其他请求或可能存在一些网络延迟,然后,您会收到多个块的响应数据。

StreamReader 的 ReadToEnd 方法只会在您将第一个数据块接收到流中时读取可用数据,而不会等待进一步的数据。

这并不意味着响应已完成并且您已收到所有响应数据,在互联网某处找到的下一个代码可以正确处理读取过程......(代码不是我的,我无法获得它的功劳)

    public static byte[] ReadFully(Stream stream, int initialLength)
    {
        // If we've been passed an unhelpful initial length, just
        // use 32K.
        if (initialLength < 1)
        {
            initialLength = 32768;
        }


        byte[] buffer = new byte[initialLength];
        int read = 0;


        int chunk;
        while ((chunk = stream.Read(buffer, read, buffer.Length - read)) > 0)
        {
            read += chunk;


            // If we've reached the end of our buffer, check to see if there's
            // any more information
            if (read == buffer.Length)
            {
                int nextByte = stream.ReadByte();


                // End of stream? If so, we're done
                if (nextByte == -1)
                {
                    return buffer;
                }


                // Nope. Resize the buffer, put in the byte we've just
                // read, and continue
                byte[] newBuffer = new byte[buffer.Length * 2];
                Array.Copy(buffer, newBuffer, buffer.Length);
                newBuffer[read] = (byte)nextByte;
                buffer = newBuffer;
                read++;
            }
        }
        // Buffer is now too big. Shrink it.
        byte[] ret = new byte[read];
        Array.Copy(buffer, ret, read);
        return ret;
    }

【讨论】:

  • ReadToEnd 读取所有内容,直到源流指示没有更多数据。
  • 是的,你是对的,流中的更多数据不等于从服务器响应中收到了所有数据。也许措辞不正确,我会尽力澄清......谢谢
  • "是的,你是对的,将流中可用的数据读取到最后不等于已经收到来自服务器响应的所有数据。可能措辞不对,我会试着澄清一下……谢谢”
猜你喜欢
  • 1970-01-01
  • 2019-03-22
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多