【问题标题】:Why i'm getting WebException on Stream?为什么我在 Stream 上收到 WebException?
【发布时间】:2014-11-30 08:07:34
【问题描述】:

这是方法:

在这种情况下,我还使用 f.TargetFolder,f.TargetFolder 包含:ftpmytestdir

而变量UploadPath包含:

ftp.newsxpressmedia.com/ftpmytestdir/clean_radar_image.png

然后它将执行此行:

UploadPath = "ftp://" + UploadPath;

之后 UploadPath 将是:

ftp://ftp.newsxpressmedia.com/ftpmytestdir/clean_radar_image.png

文件是字符串[] 类型 例如在 txf 我有 test.png

我看到了文件大小和所有内容,直到 Stream 没有例外。

我使用了一个断点并移动到第 78 行:

using (Stream requestStream = request.GetRequestStream()) 

在这一行它跳转到了捕获区域并显示了异常。

private void StringArrayUploadFiles(object sender, DoWorkEventArgs e)
{
    try
    {
        foreach (string txf in files)
        {
            string fn = txf;
            BackgroundWorker bw = sender as BackgroundWorker;
            f = e.Argument as FtpSettings;
            string UploadPath = String.Format("{0}/{1}{2}", f.Host, f.TargetFolder == "" ? "" : f.TargetFolder + "/", Path.GetFileName(fn));
            if (!UploadPath.ToLower().StartsWith("ftp://"))
                UploadPath = "ftp://" + UploadPath;
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(UploadPath);
            request.UseBinary = true;
            request.UsePassive = f.Passive;
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Timeout = 300000;
            request.Credentials = new NetworkCredential(f.Username, f.Password);
            long FileSize = new FileInfo(fn).Length;).Length;
            string FileSizeDescription = GetFileSize(FileSize);
            int ChunkSize = 4096, NumRetries = 0, MaxRetries = 50;
            long SentBytes = 0;
            byte[] Buffer = new byte[ChunkSize];
            using (Stream requestStream = request.GetRequestStream())
            {
                using (FileStream fs = File.Open(fn, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    int BytesRead = fs.Read(Buffer, 0, ChunkSize);
                    while (BytesRead > 0)
                    {
                        try
                        {
                            if (bw.CancellationPending)
                                return;

                            requestStream.Write(Buffer, 0, BytesRead);

                            SentBytes += BytesRead;

                            string SummaryText = String.Format("Transferred {0} / {1}", GetFileSize(SentBytes), FileSizeDescription);
                            bw.ReportProgress((int)(((decimal)SentBytes / (decimal)FileSize) * 100), SummaryText);
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine("Exception: " + ex.ToString());
                            if (NumRetries++ < MaxRetries)
                            {
                                fs.Position -= BytesRead;
                            }
                            else
                            {
                                throw new Exception(String.Format("Error occurred during upload, too many retries. \n{0}", ex.ToString()));
                            }
                        }
                        BytesRead = fs.Read(Buffer, 0, ChunkSize);
                    }
                }
            }
            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
                System.Diagnostics.Debug.WriteLine(String.Format("Upload File Complete, status {0}", response.StatusDescription));
        }
    }
    catch (WebException ex)
    {
        switch (ex.Status)
        {
            case WebExceptionStatus.NameResolutionFailure:
                ConnectionError = "Error: Please check the ftp address";
                break;
            case WebExceptionStatus.Timeout:
                ConnectionError = "Error: Timout Request";
                break;
        }
    }
}

这是异常消息:远程服务器返回错误:(550) 文件不可用(例如,找不到文件,无法访问)。

System.Net.WebException was caught
  HResult=-2146233079
  Message=The remote server returned an error: (550) File unavailable (e.g., file not found, no access).
  Source=System
  StackTrace:
       at System.Net.FtpWebRequest.CheckError()
       at System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
       at System.IO.Stream.Close()
       at System.Net.ConnectionPool.Destroy(PooledStream pooledStream)
       at System.Net.ConnectionPool.PutConnection(PooledStream pooledStream, Object owningObject, Int32 creationTimeout, Boolean canReuse)
       at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
       at System.Net.FtpWebRequest.GetRequestStream()
       at FTP_ProgressBar.FtpProgress.StringArrayUploadFiles(Object sender, DoWorkEventArgs e) in c:\ftp_progressbar\FTP_ProgressBar\FtpProgress.cs:line 78
  InnerException: 

【问题讨论】:

  • 我发现了问题,但不知道如何解决。你发现如果 f.TargetFolder 包含一个目录来将文件上传到 ftp 上,例如 myftptestdir 那么它会抛出异常。但是如果 f.TargetFolder 是空的,那么它会很好地上传文件,但它们会被上传到 ftp 的根目录。问题是当 f.TargetFolder 里面有目录时如何解决这个问题。
  • 我尝试在方法中添加以下行:request.Method = WebRequestMethods.Ftp.MakeDirectory;但仍然在线使用(Stream....我遇到了异常。不知道为什么。
  • 而且我可以在我的 ftp 服务器上手动创建目录,所以这不是访问权限或其他问题的问题。

标签: c# .net winforms


【解决方案1】:

从异常中似乎很清楚--(550) 文件不可用(例如,找不到文件,无法访问)。

550 是一个 FTP 错误代码,表示文件不可用。 FTP 不够复杂,无法提供更多细节。

由于我无权访问 FTP 服务器或使用的凭据,并且鉴于您尝试上传一个文件,而不是下载,我猜测您的帐户using 在服务器上没有写入权限,因此您无法创建文件。文件名也可能由于某种原因无效。

在这种情况下,一个很好的测试是使用相同的凭据通过第 3 方交互式 FTP 程序执行相同的操作。

【讨论】:

  • 我发现了问题,但不知道如何解决。你发现如果 f.TargetFolder 包含一个目录来将文件上传到 ftp 上,例如 myftptestdir 那么它会抛出异常。但是如果 f.TargetFolder 是空的,那么它会很好地上传文件,但它们会被上传到 ftp 的根目录。问题是当 f.TargetFolder 里面有目录时如何解决这个问题。
  • 他们似乎在这里做同样的事情:stackoverflow.com/questions/330155/… 但他们有它的工作。您确定文件夹名称有 / 而不是 \?您是否尝试同时创建多个子文件夹(不太可能工作)。
  • 现在可以工作了,我必须先创建要上传到的目录,然后才能上传文件。我首先创建了创建目录的新方法。现在一切正常。谢谢。
  • 不客气。将此标记为正确答案将不胜感激。
猜你喜欢
  • 2018-11-12
  • 2018-08-21
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多