带有FtpWebRequest

时间:2018-07-24 10:33:45

标签: c# proxy ftp ftpwebrequest

我尝试连接到FTP服务器(可通过Internet访问)。我的公司网络位于代理服务器的后面,所以我必须以某种方式进行检查。

我尝试了很多事情:

我发现,FtpWebRequest-Class不支持代理后面的FTP上载(我想解决是要尝试TCP客户端,但首先要解决),但是它应该支持Direcotry-清单等。

似乎没有任何效果。根据我的网络管理员的说法,代理服务器地址为httpname.gr.ch,端口为8080,但是在我签出FileZilla-Settings之后,还有另一个代理服务器:ftpname.gr.ch:2121,因此我认为这个是一个我没有正常运行的东西。

我只能使带有代理的WebRequest能够无例外地运行(没有FTP)。这是与http-proxy配合使用的代码段:

        WebProxy a = new WebProxy("httpname.gr.ch:8080", true);
        a.Credentials = CredentialCache.DefaultNetworkCredentials;

        WebRequest b = WebRequest.Create("https://www.heise.de/ct/hotline/Proxy-mit-Name-und-Passwort-316900.html");
        b.Proxy = a;

        WebResponse c = b.GetResponse();

        StreamReader d = new StreamReader(c.GetResponseStream());

        d.ReadToEnd();

但是,在能够退出网络后,我尝试读取FTP目录(应该与Proxy一起使用)。这是我的代码片段,用于检查连接:

    public void CheckConnection()
    {
        try
        {
            WebProxy a = new WebProxy("ftpname.gr.ch:2121", true);
            a.Credentials = CredentialCache.DefaultNetworkCredentials;

            FtpWebRequest.DefaultWebProxy = null;
            FtpWebRequest ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + this.Adress));
            ftpWebRequest.Credentials = new NetworkCredential(this.User, this.Password);
            ftpWebRequest.UsePassive = true;
            ftpWebRequest.Proxy = a;

            //Als Methode muss ListDirectory gewählt werden!
            ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectory;

            WebResponse webResponse = ftpWebRequest.GetResponse();
        }
        catch (WebException ex)
        {
            var ftpResponse = (FtpWebResponse)ex.Response;
        }
    }

当我尝试运行该错误时,出现以下错误:“ 服务器已运行协议冲突。Section = ResponseStatusLine ”。

如果我尝试不使用代理(ftpWebRequest.Proxy = null;),则会出现此错误:“ 基础连接已关闭。无法与远程服务器建立信任关系。”。

如果我尝试使用http-Proxy,这是错误:“ 远程服务器返回错误:(400)错误的请求”。

我尝试的所有操作都在“ ftpWebRequest.GetResponse(); ”处停止。

有人对这个问题有什么想法或暗示吗?我完全错了吗?请帮我。谢谢。

编辑:

这是Filezilla日志(德语):

2018-07-24 13:34:35 580 1 Status: Verbinde mit gvg.gr.ch über FTP-Proxy
2018-07-24 13:34:35 580 1 Status: Auflösen der IP-Adresse für ftpname.gr.ch
2018-07-24 13:34:35 580 1 Status: Verbinde mit 193.247.16.24:2121...
2018-07-24 13:34:35 580 1 Status: Verbindung hergestellt, warte auf Willkommensnachricht...
2018-07-24 13:34:35 580 1 Antwort: 220 Frox transparent ftp proxy. Login with username[@host[:port]]
2018-07-24 13:34:35 580 1 Befehl: AUTH TLS
2018-07-24 13:34:35 580 1 Antwort: 530 Please login with USER first
2018-07-24 13:34:35 580 1 Befehl: AUTH SSL
2018-07-24 13:34:35 580 1 Antwort: 530 Please login with USER first
2018-07-24 13:34:35 580 1 Status: Unsicherer Server; er unterstützt kein FTP über TLS.
2018-07-24 13:34:35 580 1 Befehl: USER kuzu_test@gvg.gr.ch@gvg.gr.ch
2018-07-24 13:34:35 580 1 Antwort: 331 User kuzu_test@gvg.gr.ch OK. Password required
2018-07-24 13:34:35 580 1 Befehl: PASS ************
2018-07-24 13:34:35 580 1 Antwort: 230 OK. Current restricted directory is /
2018-07-24 13:34:35 580 1 Befehl: SYST
2018-07-24 13:34:35 580 1 Antwort: 215 UNIX Type: L8
2018-07-24 13:34:35 580 1 Befehl: FEAT
2018-07-24 13:34:35 580 1 Antwort: 502 Command not implemented.
2018-07-24 13:34:35 580 1 Status: Der Server unterstützt keine Nicht-ASCII-Zeichen.
2018-07-24 13:34:35 580 1 Status: Angemeldet
2018-07-24 13:34:35 580 1 Status: Empfange Verzeichnisinhalt...
2018-07-24 13:34:35 580 1 Befehl: PWD
2018-07-24 13:34:35 580 1 Antwort: 257 "/" is your current location
2018-07-24 13:34:35 580 1 Befehl: TYPE I
2018-07-24 13:34:36 580 1 Antwort: 200 TYPE is now 8-bit binary
2018-07-24 13:34:36 580 1 Befehl: PASV
2018-07-24 13:34:36 580 1 Antwort: 227 Entering Passive Mode (193,247,16,24,103,35)
2018-07-24 13:34:36 580 1 Befehl: LIST
2018-07-24 13:34:36 580 1 Antwort: 150 Accepted data connection
2018-07-24 13:34:36 580 1 Antwort: 226-Options: -a -l 
2018-07-24 13:34:36 580 1 Antwort: 226 48 matches total
2018-07-24 13:34:36 580 1 Status: Anzeigen des Verzeichnisinhalts für "/" abgeschlossen

这是程序日志(以ftpname.gr.ch作为代理,如Filezilla):

System.Net Information: 0 : [7264] FtpWebRequest#7746814::.ctor(ftp://gvg.gr.ch/)
System.Net Information: 0 : [7264] Der aktuelle Betriebssysteminstallationstyp ist "Client".
System.Net Information: 0 : [7264] FtpWebRequest#7746814::GetResponse(Methode = NLST.)
System.Net Information: 0 : [7264] Associating HttpWebRequest#54246671 with ServicePoint#63840421
System.Net Information: 0 : [7264] Associating FtpWebRequest#7746814 with HttpWebRequest#54246671
System.Net Information: 0 : [7264] Associating Connection#59408853 with HttpWebRequest#54246671
System.Net Information: 0 : [7264] Connection#59408853 - Die Verbindung von 10.48.11.25:55271 mit 193.247.16.24:2121 wurde hergestellt.
System.Net Information: 0 : [7264] Associating HttpWebRequest#54246671 with ConnectStream#56152722
System.Net Information: 0 : [7264] HttpWebRequest#54246671 - Request: GET ftp://kuzu_test:**********!@gvg.gr.ch/ HTTP/1.1

System.Net Information: 0 : [7264] ConnectStream#56152722 - Header 
{
Host: gvg.gr.ch
Proxy-Connection: Keep-Alive
} werden gesendet.
System.Net Error: 0 : [7264] Exception in HttpWebRequest#54246671:: - Der Server hat eine Protokollverletzung ausgeführt.. Section=ResponseStatusLine.
System.Net Error: 0 : [7264] Exception in HttpWebRequest#54246671::GetResponse - Der Server hat eine Protokollverletzung ausgeführt.. Section=ResponseStatusLine.
System.Net Error: 0 : [7264] Exception in FtpWebRequest#7746814::GetResponse - Der Server hat eine Protokollverletzung ausgeführt.. Section=ResponseStatusLine.
   bei System.Net.FtpWebRequest.GetResponse()

解决方案

我尝试了多种可能性(感谢Martin Prikryl的帮助),最后使它通过FTP服务器的代理:)

诀窍是拥有一个FTP代理(我所拥有的,正如我在问题中所写的)。您可以检查它是否适用于命令行和ftp.exe(Windows):

ftp.exe
open proxyadress port <- if it is not an FTP-Proxy, nothing happens <- crtl+c
ftpusername@host <- Because special domain and stuff I had to do: ftpusername@host@webhost
ftppassword <- It will not be displayed 
230 OK. <- Success!

在我可以从命令行访问代理后面的FTP服务器之后,我可以尝试使用FtpWebRequest-Class来做到这一点,并且可以正常工作:

    FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftpproxy:proxyport");
    request.Credentials = new NetworkCredential("ftpuser@ftphost@webhost", "ftppassword");
    request.Method = WebRequestMethods.Ftp.MakeDirectory;
    request.Proxy = null;
    request.EnableSsl = false;
    request.UsePassive = true;

    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
    Console.WriteLine("The content length is {0}", response.ContentLength);

0 个答案:

没有答案