2008-10-14 8 views
6

Ich versuche, den folgenden Code zum Laufen zu bringen:C# FTP mit CD Disabled

string url = String.Format(@"SOMEURL"); 
    string user = "SOMEUSER"; 
    string password = "SOMEPASSWORD"; 

    FtpWebRequest ftpclientRequest = (FtpWebRequest)WebRequest.Create(new Uri(url)); 
    ftpclientRequest.Method = WebRequestMethods.Ftp.ListDirectory; 
    ftpclientRequest.UsePassive = true; 
    ftpclientRequest.Proxy = null; 
    ftpclientRequest.Credentials = new NetworkCredential(user, password); 
    FtpWebResponse response = ftpclientRequest.GetResponse() as FtpWebResponse; 

Diese Regel funktioniert, aber für 1 bestimmten Server diese Fehler gibt 500: Syntax nicht erkannt. Der Befehl zum Ändern des Verzeichnisses ist auf dem Problemserver deaktiviert, und der Site-Administrator hat mir mitgeteilt, dass .NET standardmäßig einen Change Directory-Befehl für alle FTP-Verbindungen ausgibt. Ist das wahr? Gibt es eine Möglichkeit, das zu deaktivieren?
EDIT: Wenn ich von einer Befehlszeile anmelden bin ich im richtigen Verzeichnis:
ftp> pwd
257 "/" aktuelles Verzeichnis

Antwort

11

ich dies nur getestet auf einem unserer Entwickler-Servern und in der Tat gibt es eine CWD von .NET FtpWebRequest ausgegeben:

 
new connection from 172.16.3.210 on 172.16.3.210:21 (Explicit SSL) 
hostname resolved : devpc 
sending welcome message. 
220 Gene6 FTP Server v3.10.0 (Build 2) ready... 
USER testuser 
testuser, 331 Password required for testuser. 
testuser, PASS **** 
testuser, logged in as "testuser". 
testuser, 230 User testuser logged in. 
testuser, OPTS utf8 on 
testuser, 501 Please CLNT first. 
testuser, PWD 
testuser, 257 "/" is current directory. 
testuser, CWD/
testuser, change directory '/' -> 'D:\testfolder' --> Access allowed. 
testuser, 250 CWD command successful. "/" is current directory. 
testuser, TYPE I 
testuser, 200 Type set to I. 
testuser, PORT 172,16,3,210,4,127 
testuser, 200 Port command successful. 
testuser, NLST 
testuser, 150 Opening data connection for directory list. 
testuser, 226 Transfer ok. 
testuser, 421 Connection closed, timed out. 
testuser, disconnected. (00d00:05:01) 

Das war, ohne auch nur im uri ‚/‘ angeben, wenn die FtpWebRequest Objekt erstellen .

Wenn Sie den Quellcode debuggen oder durchsuchen, kommt eine Klasse mit dem Namen 'FtpControlStream' ins Spiel. Siehe Aufrufliste:

 
System.dll!System.Net.FtpControlStream.BuildCommandsList(System.Net.WebRequest req) Line 555 C# 
System.dll!System.Net.CommandStream.SubmitRequest(System.Net.WebRequest request = 
    {System.Net.FtpWebRequest}, bool async = false, bool readInitalResponseOnConnect = true) Line 143 C# 
System.dll!System.Net.FtpWebRequest.TimedSubmitRequestHelper(bool async) Line 1122 + 0x13 bytes C# 
System.dll!System.Net.FtpWebRequest.SubmitRequest(bool async = false) Line 1042 + 0xc bytes C# 
System.dll!System.Net.FtpWebRequest.GetResponse() Line 649 C# 

Es gibt eine Methode namens BuildCommandsList(), die aufgerufen wird. BuildCommandsList() erstellt eine Liste von Befehlen, die an den FTP-Server gesendet werden. Diese Methode dient die folgende Code-Snippet hat:

if (m_PreviousServerPath != newServerPath) { 
    if (!m_IsRootPath 
     && m_LoginState == FtpLoginState.LoggedIn 
     && m_LoginDirectory != null) 
    { 
     newServerPath = m_LoginDirectory+newServerPath; 
    } 
    m_NewServerPath = newServerPath; 

    commandList.Add(new PipelineEntry(FormatFtpCommand("CWD", newServerPath), PipelineEntryFlags.UserCommand)); 
} 

Bei der ersten Verbindung mit dem Server m_PreviousServerPath ist immer null, wird der Wert von newServerPath „/“ ist und wird durch eine Funktion mit dem Namen GetPathAndFileName() (aufgerufen einige berechnet Zeilen vor diesem Codeblock). GetPathAndFileName() berechnet newServerPath als "/", wenn kein Pfad angegeben ist oder wenn "/" am Ende von "ftp: // ...." uri explizit angeheftet ist.

Das führt natürlich letztlich dazu, dass der CWD-Befehl zur Befehlspipeline hinzugefügt wird, weil null! = "/".

Kurz gesagt, Sie können dieses Verhalten leider nicht überschreiben, weil es in der Quelle gebrannt ist.

0

ist denke ich, dass wir eine Weile zurück, ein ähnliches Problem hatten, I don‘ Aber erinnere dich nicht an die genauen Details.

Um zu verhindern, dass .net den Befehl cd ausgibt, sehen Sie, ob Sie das Standardverzeichnis für den Benutzer festlegen, in dem Sie arbeiten möchten. Sie können einfach eine Befehlszeile mit FTP-Client verwenden check das aus.

0

Hier ist eine Lösung: Verwenden Sie diese kostenlos, Open Source, FTP-Client-Bibliothek für Dan bei C-SharpCorner.com gemacht C#: http://www.c-sharpcorner.com/uploadfile/danglass/ftpclient12062005053849am/ftpclient.aspx

Hier einige Beispiel-Code eine Datei zum Hochladen:

FtpClient ftp = new FtpClient(FtpServer,FtpUserName,FtpPassword); 
ftp.Login(); 
ftp.Upload(@"C:\image.jpg"); 
ftp.Close(); 

Diese Bibliothek funktioniert problemlos, kann aber auch einfach erweitert und modifiziert werden.

1

Obwohl der Beitrag wie vor langer Zeit ist ... egal, ich werde die Antwort hier geben.

Anstatt ftp://server/path als URI zu verwenden, versuchen Sie ftp://server/%2fpath/.

Der zusätzliche %2f "ist nur ein / entkommen und fügte hinzu, dies wird C# behandeln den ganzen Weg als absolute machen. sonst wird C# ftp://server/ mit dem Benutzernamen anmelden, gehen Sie in das Home-Verzeichnis des Benutzers, dann cd zu Ihrer angegebenen Pfad, so dass Ihr Weg user_home_path/path geworden, die nicht wünschenswert sein kann.

Mehr Infos unter Msdn gefunden werden konnte http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx

Hoffnung, das hilft.

0

Mit den obigen Informationen funktionierte das für mich.

Sendet CWD - ftpState.ftpRequest = GetRequest ("ftp://192.168.0.2/tmp/file2download ")

nicht senden CWD - ftpState.ftpRequest = GetRequest (" ftp://192.168.0.2//tmp/file2download") Bekanntmachung der // nach dem Server-IP (oder Name)

DotNET Version 2,0

Private Function GetRequest(ByVal URI As String) As FtpWebRequest 
    'create request 
    Dim result As FtpWebRequest = CType(FtpWebRequest.Create(URI), FtpWebRequest) 
    Return result 
End Function