(相关如何强制 C# FtpWebRequest 使用直接 IP 访问 Internet,而不是通过 HTTP 代理? https://stackoverflow.com/questions/28187521/how-can-i-force-a-c-sharp-ftpwebrequest-to-use-a-direct-ip-to-get-onto-the-inter/28189013#28189013)
使用 C# 从 FTP 服务器获取目录列表。输出格式为 HTML。必需的是未格式化的列表(由 Linux ls 命令返回)。 (尝试避免解析 HTML 来获取文件列表。)
观察结果:
FTP服务器是客户端运行的vsftpd。
当列出例如目录时,不会出现此问题。 Filezilla FTP 服务器。
-
Filezilla 客户端连接到 vsftpd 服务器在获取目录列表时超时
Error: Connection timed out
Error: Failed to retrieve directory listing
参考下面的代码,会发生以下行为/错误:
什么时候
代码中设置代理服务器
然后
服务器返回 HTML 格式的列表,而不是简单的 ls 输出。
什么时候
代理服务器设置为 null 或WebRequest.DefaultWebProxy
OR GlobalProxySelection.GetEmptyWebProxy()
OR new WebProxy();
THEN:
The remote server returned an error: (550) File unavailable (e.g., file not found, no access).
什么时候:
代码中未指定代理服务器并且代理未设置为空。
然后The remote server returned an error: (407) Proxy Authentication Required.
问题
- 如何设置 C# 代码来获取 ls 目录列表而不是 HTML?
或者
- 是否可以在 vsftpd(服务器)端执行任何操作来阻止 HTML 目录列表?
Details:
代码摘录
FtpWebRequest request = WebRequest.Create(uri) as FtpWebRequest;
request.Method = WebRequestMethods.Ftp.ListDirectory;
//1. Works but returns HTML
request.Proxy = new WebProxy("http://xxx.xxx.xxx.xxx:8080",true);
request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
//2. Does not work
//request.Proxy = null;// WebRequest.DefaultWebProxy;// GlobalProxySelection.GetEmptyWebProxy(); // null; //new WebProxy();
request.Credentials = server.Credential;
request.KeepAlive = true;
request.UsePassive = true;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
Regex filter = FileUtils.GetRegex(clientSource.FileFilter);
while (!reader.EndOfStream)
{
ProcessFileLine(reader.ReadLine(), filter, files);
}
reader.Close();
response.Close();
HTML 格式的目录列表
<HTML>
<meta http-equiv="Content-Type" content="text-html; charset=UTF-8">
<HEAD>
<TITLE>FTP root at ftp-jhb.saicomvoice.co.za. </TITLE>
</HEAD>
<BODY>
<H1>FTP root at ftp-jhb.saicomvoice.co.za. </H1>
<HR>
<PRE>
12/11/15 04:36PM [GMT] <DIR> <A HREF="/bin/">bin</A>
12/11/15 12:56PM [GMT] <DIR> <A HREF="/boot/">boot</A>
02/22/13 12:00AM [GMT] <DIR> <A HREF="/cgroup/">cgroup</A>
12/11/15 03:36PM [GMT] <DIR> <A HREF="/dev/">dev</A>
01/19/15 01:32PM [GMT] <DIR> <A HREF="/etc/">etc</A>
12/12/15 11:45AM [GMT] <DIR> <A HREF="/home/">home</A>
12/11/15 12:51PM [GMT] <DIR> <A </PRE>
<HR>
</BODY>
</HTML>
从描述来看,您需要使用 HTTP 代理来访问 FTP 服务器。代理不会通过 FTP 协议访问,仅转发命令,而是通过 HTTP 协议访问。然后,代理将为您执行必要的 FTP 命令,并在 HTTP 响应中返回结果。结果如何完全取决于代理。由于大多数用户将使用浏览器访问 HTTP 代理,因此 HTTP 代理通常会返回包含结果的 HTML 页面,以便用户只需单击即可从那里获取相关文件。
总之:由于结果完全取决于代理,因此只要您需要使用此特定代理,就无法以不同的方式获取结果。因此,最好咨询您的管理员是否有其他方法可以使用 FTP,即无需此 HTTP 代理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)