我写了一个断点续传的下载程序。在大部分机器上运行的时候,没有任何问题。但在部分机器上,报了如下错误:
The underlying connection was closed: An unexpected error occurred on a receive.
由于找不到原因,我写了如下测试程序:程序一:使用WebClient方法进行下载
结论:一切正常
private void btnWebClient_Click(object sender, EventArgs e)
        {
            try
            {
                if (JudgeCanDownload())
                {
                    WebClient client = new WebClient();
                    client.DownloadFile(txtDownLoadUrl.Text.Trim(), txtFileSavePath.Text.Trim() + "\\WebClient_Server.rar");
                    client.Dispose();
                }
            }
            catch (Exception ex)
            {
                txtWebClient.Text = ex.Message;
            }
        }程序二:程序二与三的唯一差别在于,二使用HttpWebRequest进行下载,并且不用AddRange方法
结论:一切正常
private void btnHttpDownload_Click(object sender, EventArgs e)
        {
            try
            {
                if (JudgeCanDownload())
                {
                    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(txtDownLoadUrl.Text.Trim());
                    FileStream FileSaveStream = System.IO.File.OpenWrite(txtFileSavePath.Text.Trim() + "Http_Server.rar");
                    Stream ReadResponseStream = request.GetResponse().GetResponseStream();
                    byte[] nbytes = new byte[512];
                    int nReadSize = ReadResponseStream.Read(nbytes, 0, 512);
                    while (nReadSize > 0)
                    {
                        FileSaveStream.Write(nbytes, 0, nReadSize);
                        nReadSize = ReadResponseStream.Read(nbytes, 0, 512);
                    }                    //下载完毕,关闭所有的流.
                    FileSaveStream.Close();
                    ReadResponseStream.Close();
                    request.GetResponse().Close();
                }
            }
            catch (Exception ex)
            {
                txtHttpDownload.Text = ex.Message;
            }
        }程序三:使用HttpWebRequest进行下载,并且使用了AddRange方法,从1000字节处开始请求。
结论:出现错误 The underlying connection was closed: An unexpected error occurred on a receive.
 private void btnOtherDown_Click(object sender, EventArgs e)
        {
            try
            {
                if (JudgeCanDownload())
                {
                    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(txtDownLoadUrl.Text.Trim());
//使用AddRange后,报错。
                    request.AddRange(1000);                    FileStream FileSaveStream = System.IO.File.OpenWrite(txtFileSavePath.Text.Trim() + "Http1000_Server.rar");
                    Stream ReadResponseStream = request.GetResponse().GetResponseStream();
                    byte[] nbytes = new byte[512];
                    int nReadSize = ReadResponseStream.Read(nbytes, 0, 512);
                    while (nReadSize > 0)
                    {
                        FileSaveStream.Write(nbytes, 0, nReadSize);
                        nReadSize = ReadResponseStream.Read(nbytes, 0, 512);
                    }                    //下载完毕,关闭所有的流.
                    FileSaveStream.Close();
                    ReadResponseStream.Close();
                    request.GetResponse().Close();
                }
            }
            catch (WebException ex)
            {
                txtOtherDownload.Text = ex.Message + ex.Status;
            }
        }结论:程序一与二运行没有问题,说明网络是正常的。服务器上的压缩包有1420KB,程序三的AddRange应该不会越界。并且程序三在大多数机器上的运行是正常的,只在部分机器上出现问题。
请问:为什么使用了AddRange后,程序会报错误?如果您碰到过类似的问题,请告诉我如何解决这个问题?

解决方案 »

  1.   

    我试了一下request.AddRange(),没有发现问题。我连的是网页。
      

  2.   

    你把 request.AddRange(1000)里的1000改为10试试看呢?
    这样的会不会是连接超时了?
    你连接数量太多的话,对方有可能把它列为非法链接而给你强制中断了
      

  3.   

     flyjimi 谢谢你。
    我连接的是一个压缩包。request.AddRange()方法,本身是没有问题的。因为同样的方法,在大多数机器上的运转正常。
    wangping_li
    改成request.AddRange(10)也不行。请大家在帮我参考一下吧。