`

惊天大Bug?让人呕血的FtpWebRequest

阅读更多

本来以为2.0开始内置了FtpWebRequest,以后不用再受没有更新保障的第三方Ftp类库的限制,结果今天遇到的问题,让我呕血三升不得其解。看来又得自己写FtpClient的类了。言归正传,先说问题

以前用到Ftp上传很多都是一次性的操作,所以如果:

FtpWebRequest req = (FtpWebRequest)FtpWebRequest.Create("url");

之 后的话就可以上传,下载,或者什么的,之后就直接退出了事。结果现在的需求会涉及很多比较具有持续性的操作,比如进入一个根目录,然后list,判断是否 存在一个目录,如果存在就cd进入,不存在就md创建这个目录,之后进入,再上传文件到目录中。这个时候麻烦产生了。一般来说为了安全性的原因,设置 FTP的时候都设置了锁定用户在主目录的选项。比如Serv-U如下:

image

这个时候第一次执行,很好,一点问题都没有,但是第二次执行的时候麻烦就来了。

比如Ftp的根url为 Ftp://xx.xx.xx.xx/ 要进入的目录为test,第一次在FtpWebRequest.Create("Ftp://xx.xx.xx.xx/");的时候,我们list得到的是根目录的内容,但是在上传完成后进行第二次操作,这个时候创建FtpWebRequest对象的url仍然是 Ftp://xx.xx.xx.xx/ 但是再执行list的时候取出的确是test目录下的文件列表!!

之后为了测试我去掉了 image 之后执行就一点问题都没有了。

但 是注意,这里的两次操作是两个不同的FtpWebRequest对象,却保持了同一个操作的Session。且让人郁闷的是,FtpWebRequest 没有提供任何显示关闭连接的方法,也没有任何改变工作目录的方法,即使是新建的FtpWebRequest对象使用了不同的url,仍然不会改变其当初的 工作目录,后来查了一下Serv-U的日志,发现根本就没法送改变工作目录的指令………

为了FtpWebRequest的对象不保持连 接的上下文,我把KeepAlive属性设为false,结果出现了第二个让我呕血的问题。当第二次执行操作的时候,报错了,如果是连本机的FTP则报返 回226 transfercomplete的异常,如果是远程的ftp则报无法访问已经释放的对象……………

不知道如此一个脑残的东西是如何通过层层审核进入.NET的类库的。呕血的FtpWebRequest

如果有兴趣的可以自己实验一下,验证一下结果,测试的case为:

while(true){

创建FtpwebRequest

列表目录

创建FtpWe

上传文件

此处打断点

}

还可以通过Serv-U看看其中的log,看看到底发送了些什么ftp指令

如果有达人发现是我哪里搞错了也请告之,万分感谢。
分享到:
评论

相关推荐

    实现FTP方法FtpWebRequest

    ### 实现FTP方法FtpWebRequest 在现代软件开发过程中,文件传输协议(FTP)仍然是一个常用的技术手段,尤其是在需要在不同系统之间交换文件时。本文将深入探讨如何使用C#中的`FtpWebRequest`类来实现FTP的基本操作...

    利用FtpWebRequest类实现文件传送

    这个类提供了一种方便的方式,让我们能够执行各种FTP操作,如上传、下载、列出目录内容以及删除文件等。下面将详细介绍如何利用`FtpWebRequest`类实现文件的传送。 首先,我们需要创建一个`FtpWebRequest`对象,...

    c#实现FTP方法(一)-FtpWebRequest.pdf

    C# 实现 FTP 方法(一)- FtpWebRequest 本文档主要讲解了使用 C# 语言实现 FTP 方法的第一部分,重点介绍了使用 FtpWebRequest 类实现 FTP 连接、文件上传和下载、文件列表获取等操作。 FTP 连接 在 FTP_Class ...

    vb.net 从FTP空间中下载文件

    Dim request As FtpWebRequest = DirectCast(WebRequest.Create("ftp://your_ftp_server/your_file_path"), FtpWebRequest) request.Credentials = New NetworkCredential("username", "password") request.Method =...

    c# 中上传大文件 类 FTP c# 中上传大文件 类 FTP

    在C#编程环境中,FTP(File Transfer Protocol)类库被广泛用于实现文件的上传功能,尤其是处理大文件。FTP协议是一种标准的网络协议,用于在客户端和服务器之间传输文件。在C#中,我们可以利用System.Net命名空间中...

    获取ftp服务器文件的大小

    Dim ftp As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create(URI), System.Net.FtpWebRequest) ' 设置登录凭证 ftp.Credentials = New System.Net.NetworkCredential(username, password) ...

    vb.net中的FTP操作:创建、删除、查询、下载、上传案例源码

    Dim request As FtpWebRequest = DirectCast(WebRequest.Create("ftp://your_server/your_directory"), FtpWebRequest) request.Credentials = New NetworkCredential("username", "password") ``` **创建FTP目录**...

    FtpUpDownFTP目录操作类

    FtpWebResponse FtpWebRequest

    C#下载ftp指定目录下所有文件

    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl + "/" + remotePath); request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; request.Credentials = new NetworkCredential...

    C# FTP递归下载文件(子目录和子目录中的文件)

    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl); request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; request.Credentials = new NetworkCredential("username", "password"); ...

    FTP 客户端 功能很强大

    这时,我们需要切换到被动模式,让服务器主动连接到客户端。 10. **异步编程**:为了提高用户体验,FTP客户端可以使用异步操作,如`FtpWebRequest.BeginGetResponse`和`FtpWebRequest.EndGetResponse`,这样在等待...

    FTP自动下载

    此外,还可以使用多线程或异步编程来提高性能,特别是在处理大量文件或大文件时。`FtpWebRequest`类提供了异步版本的方法,如`BeginGetResponse`和`EndGetResponse`,可以用于实现非阻塞的FTP操作。 在项目中,你...

    asp.net利用ftp上传文件实现示例代码

    综上所述,ASP.NET通过`FtpWebRequest`类提供的FTP功能可以方便地实现文件上传,同时通过优化和调整参数,可以有效应对大文件上传和超时问题。这个示例代码应该能为你提供一个起点,以便在你的项目中实现FTP文件上传...

    C# FTP类 上传下载

    在.NET框架中,C#提供了一个内置的FTP类——`System.Net.FtpWebRequest`,用于实现FTP(File Transfer Protocol)的客户端功能。本篇将详细讲解如何利用C#的FTP类进行文件的上传、下载、重命名以及删除操作。 ### ...

    C# FTP,GetResponse(),远程服务器返回错误

    在被动模式下,客户端打开一个数据连接端口,而不是让服务器尝试连接。 4. 设置`ContentLength`和`Method`: - `ContentLength`属性用于指示要上传文件的大小。对于下载,虽然`FtpWebRequest`忽略这个属性,但对...

    NET2.0对FTP操作(异步上传,下载等)实现汇总

    FtpWebRequest listRequest = (FtpWebRequest)WebRequest.Create(uri); listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails; string ftpUser = ""; string ftpPassWord = ""; listRequest....

    大量数据的FTP下载

    在ASP.NET中,可以使用System.Net命名空间下的FtpWebRequest和FtpWebResponse类来实现FTP下载。首先,创建一个FtpWebRequest对象,设置其URL、用户名、密码等属性。然后,设置上传或下载方法(FTPWebRequest.Method...

    C# FTP文件上传,下载,删除,目录建立

    using (FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri($"ftp://{remoteHost}/{remotePath}/{remoteFilePath}"))) { request.Method = WebRequestMethods.Ftp.UploadFile; request....

    点net_FTP项目

    在.NET框架中,我们可以利用System.Net命名空间下的FtpWebRequest和FtpWebResponse类来处理FTP通信。以下是对这四个项目可能涵盖的知识点的详细说明: 1. FTP上传: - 使用FtpWebRequest对象创建一个FTP请求,设置...

Global site tag (gtag.js) - Google Analytics