底层连接关闭:在接收过程中发生了意外错误。

4
当我在我的win2k8机器上运行程序时,它运行良好,但在win 2k3上会出现这个错误信息。以下是生成错误的代码。
WebClient wc = new WebClient(); 
wc.DownloadFile("ftp://ftp.website.com/sample.zip");

有一个奇怪的问题。如果我完全禁用服务器上的防火墙,错误就消失了。但是如果我将程序添加到例外列表并打开防火墙,它仍然会出错。

我已经搜索了几天的网络,找不到任何解决方案。

3个回答

6

你应该尝试使用FTP的被动模式。WebClient类不允许这样做,但FtpWebRequest可以。

FtpWebRequest request = WebRequest.Create("ftp://ftp.website.com/sample.zip") as FtpWebRequest;
request.UsePassive = true;
FtpWebResponse response = request.GetResponse() as FtpWebResponse;
Stream ftpStream = response.GetResponse();
int bufferSize = 8192;
byte[] buffer = new byte[bufferSize];
using (FileStream fileStream = new FileStream("localfile.zip", FileMode.Create, FileAccess.Write))
{
    int nBytes;
    while((nBytes = ftpStream.Read(buffer, 0, bufferSize) > 0)
    {
        fileStream.Write(buffer, 0, nBytes);
    }
}

如何使用FtpWebRequest下载文件并将其保存到本地驱动器?我找到的示例只显示如何显示服务器响应。 - chat
这是一个错误,我想说的是nBytes...现在已经修复了。 - Thomas Levesque
请参阅 .NET 4.0 中的 Stream.CopyTo() 方法:http://msdn.microsoft.com/zh-cn/library/system.io.stream.copyto.aspx - Hans
即使使用被动模式的FtpWebRequest,我仍然遇到了这个错误。 - Hans
这对我有用。我已经在使用FtpWebRequest,而不是WebClient,但是当我下载的文件实际上是完整和完好无损时,在Stream.CopyTo()操作的最后我仍然遇到了异常。与其只编写代码来忽略异常,这种被动模式修复方法完全消除了它。 - Jordan Rieger

1
请发布完整的异常信息,包括任何 InnerException:
try
{
    WebClient wc = new WebClient(); 
    wc.DownloadFile("ftp://ftp.website.com/sample.zip");
}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString()); // Or Debug.Trace, or whatever
    throw;    // As if the catch were not present
}

无论如何都要发布整个信息,包括堆栈跟踪。 - John Saunders

1

我曾遇到过类似的问题(没有FTP),但是我有一个不同的解决方案

生产服务器环境被设置得非常安全,以至于服务器无法访问URL。

快速测试方法是在服务器上使用浏览器,看看能否导航到该URL。

希望这对某人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接