【问题标题】:Program hangs on FtpWebResponse程序在 FtpWebResponse 上挂起
【发布时间】:2011-06-01 13:37:56
【问题描述】:

第一次发帖,老读者。我有一个非常烦人的问题,这让我很紧张。我已经设置了一个程序,所以我在 FTP 服务器上监听新文件,如果有新文件我下载它。从那里我处理文件中的一些信息等。当我第二次运行我的序列时,我的问题就出现了。也就是说,在我下载的第一个文件上,一切都很好,但是一旦检测到新文件并且我的程序尝试下载它,我的程序就会挂起。

 private static void DownloadFile(string s)
    {
        try
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://blabla.com/"+s);
            request.Method = WebRequestMethods.Ftp.DownloadFile;
            request.Credentials = new NetworkCredential("xxx" ,"zzz");

            using (FtpWebResponse partResponse = (FtpWebResponse)request.GetResponse())
            {
                Stream partReader = partResponse.GetResponseStream();

                byte[] buffer = new byte[1024];
                FileInfo fi = new FileInfo(path);
                FileStream memStream = fi.Create();
                while (true)
                {
                    int bytesRead = partReader.Read(buffer, 0, buffer.Length - 1);
                    if (bytesRead == 0)
                        break;

                    memStream.Write(buffer, 0, bytesRead);
                }
                partResponse.Close();
                memStream.Close();
            }
            Console.WriteLine(DateTime.Now + " file downloaded");
            MoveFileToInProgress(s);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

它挂在的行是这一行: 使用 (FtpWebResponse partResponse = (FtpWebResponse)request.GetResponse())

我的方法在这里是静态的原因是因为我只是在另一个项目中运行它来测试它。我的问题是,为什么它只在第二个文件上死掉?我已经盯着自己瞎了好几个小时了!

【问题讨论】:

    标签: c# ftpwebresponse


    【解决方案1】:

    我也遇到了这个问题...尝试先完成您的请求,然后在尝试检索响应之前关闭它。这对我有用(实际上是在阅读 MartinNielsen 的评论后尝试过的)。这就是我所做的。

            // connect to the ftp site
            FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(ftpUri);
            ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
            ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
    
            // setting proxy to null so that it does not go through the proxy
            ftpRequest.Proxy = null;
    
            // get file information
            StreamReader fileStream = new StreamReader(filePath);
            byte[] fileBytes = Encoding.UTF8.GetBytes(fileStream.ReadToEnd());
            ftpRequest.ContentLength = fileBytes.Length;
            fileStream.Close();
    
            // open connection to ftp site
            Stream ftpRequestStream = ftpRequest.GetRequestStream();
    
            // write the file to the stream
            ftpRequestStream.Write(fileBytes, 0, fileBytes.Length);
    
            // close the stream
            ftpRequestStream.Close();
    
            // get the response from the server
            FtpWebResponse ftpUploadResponse = (FtpWebResponse)ftpRequest.GetResponse();
            string result = ftpUploadResponse.StatusDescription;
    
            // close response
            ftpUploadResponse.Close();
    
            // return response to calling code
            return result;
    

    这是我在编写此代码时使用的一些资源(不会让我发布超过 2 个,还有更多)

    How to: Upload Files with FTP

    Uploading a file -- "The requested URI is invalid for this FTP command"

    【讨论】:

    • 我不明白为什么这个答案被赞成?!问题是关于下载不上传文件。它不使用任何需要关闭的请求流。那么这怎么能被认为是问题的答案呢?!!
    【解决方案2】:

    我不是 C# 专家,但我使用此代码从我的 ftp 下载文件:

    public void Download(string filename)
        {
            // I try to download five times before crash
            for (int i = 1; i < 5; i++)
            {
                try
                {
                    FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(Global.Path + "/" + filename);
                    ftp.Credentials = new NetworkCredential(User, Pass);
                    ftp.KeepAlive = false;
                    ftp.Method = WebRequestMethods.Ftp.DownloadFile;
                    ftp.UseBinary = true;
                    ftp.Proxy = null;
    
                    int buffLength = 2048;
                    byte[] buff = new byte[buffLength];
                    int contentLen;
    
                    string LocalDirectory = Application.StartupPath.ToString() + "/downloads/" + filename;
                    using (FileStream fs = new FileStream(LocalDirectory, FileMode.Create, FileAccess.Write, FileShare.None))
                    using (Stream strm = ftp.GetResponse().GetResponseStream())
                    {
                        contentLen = strm.Read(buff, 0, buffLength);
                        while (contentLen != 0)
                        {
                            fs.Write(buff, 0, contentLen);
                            contentLen = strm.Read(buff, 0, buffLength);
                        }
                    }
    
                    Process.Start(LocalDirectory);
                    break;
                }
                catch (Exception exc)
                {
                    if (i == 5)
                    {
                        MessageBox.Show("Can't download, try number: " + i + "/5 \n\n Error: " + exc.Message,
                            "Problem downloading the file");
                    }
                }
            }
        }
    

    告诉我它是否适合你:)

    【讨论】:

    • 我的程序仍然挂在同一行,在您的代码中它转换为这一行:使用 (Stream strm = ftp.GetResponse().GetResponseStream()) 我想我将不得不去寻找我没有正确关闭 FTP 连接的地方或者什么的..
    • 您可以尝试在一段时间内设置一个计时器,该计时器会在几秒钟后中断和/或重试(如果过程需要更长的时间,则更长)
    • 你有没有想过这个问题?我的代码也挂在最后几个字节上
    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 2012-11-04
    • 2014-05-06
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多