Want to use C# (FtpWebResponse) to read file list

2019-01-19 23:16发布

问题:

I use below codes to get files from a FTP site. It works in my computer, but it only return HTML codes when I run it on another computer (I can see that the HTML are codes of web page when I access FTP via browser). What's wrong?

public String GetFilesAsString(string folder,string fileExtension)
{
    StringBuilder result = new StringBuilder();
    FtpWebRequest reqFTP;
    try
    {
        String ftpserver = ftp + folder+"/";

        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpserver));
        reqFTP.UsePassive = false;
        reqFTP.UseBinary = true;
        reqFTP.Credentials = new NetworkCredential(username, password);
        reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

        StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);
        string line = "";

        while (reader.Peek()>-1)
        {
            line = reader.ReadLine();
            Console.WriteLine(line);//**********HTML was wrote out here*************
        }

        if (result.ToString().LastIndexOf('\n') >= 0)
            result.Remove(result.ToString().LastIndexOf('\n'), 1);
        reader.Close();
        response.Close();

        return result.ToString();
    }
    catch (Exception ex)
    {
    }
    return null;
}

回答1:

Could it be a web proxy interfering? Try to get around the proxy by using the following:

reqFTP.Proxy = GlobalProxySelection.GetEmptyWebProxy();


回答2:

This is the result of using FtpWebRequest through an HTTP Proxy. The file listing gets pretty printed with HTML tags which have <A> hyperlinks to the individual files in the listing.

If you can't bypass the proxy, in our case it was possible to scrape the section with the file contents out of an enclosing <PRE> element, load it into an XmlDocument, and pull the file list out through .SelectNodes("//A/text()")



回答3:

I found the solution: the default proxy was enabled unexpectedly

I now have to disable it specifically using a config file:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <system.net>
    <defaultProxy enabled="false" useDefaultCredentials="true"/>
  </system.net>
</configuration>

In fact, it is really a .NET issue!



回答4:

FTP Requires PassiveMode to download, upload...

Instead, try to use:

reqFTP.UsePassive = true;