Frage

Ich versuche, das folgenden Code zum Laufen zu bringen:

  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 dies gibt einen Fehler 500: Syntax nicht erkannt. Das Change Directory-Befehl wird auf dem Problemserver deaktiviert, und der Administrator hat mir gesagt, dass .NET einen Change Directory-Befehl standardmäßig mit allen FTP-Verbindungen gibt. Ist das wahr? Gibt es eine Möglichkeit, dass zu deaktivieren?
EDIT: Wenn ich von einer Befehlszeile anmelden bin ich im richtigen Verzeichnis:
ftp> pwd
257 "/" ist aktuelles Verzeichnis

War es hilfreich?

Lösung

ich dies nur auf einem unserer Entwickler-Servern getestet 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)

Dies war ohne auch nur '/' in der uri angeben, wenn das FtpWebRequest Objekt zu erzeugen.

Wenn Sie debuggen oder den Quellcode finden, eine Klasse namens ‚FtpControlStream‘ ins Spiel kommt. 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 der Befehle an den FTP-Server zu senden. Dieses Verfahren hat den folgenden Code-Snippet:

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 immer null ist, wird der Wert von newServerPath ist „/“ und wird durch eine Funktion mit dem Namen GetPathAndFileName () berechnet (aufgerufen ein paar Zeilen vor diesem Code-Block). GetPathAndFileName () berechnet newServerPath als „/“, wenn kein Pfad zugeführt wird oder wenn „/“ wird ausdrücklich auf das Ende des gehefteten. ‚Ftp: // ....‘ uri

Also das natürlich letztlich den CWD Befehl bewirkt, dass die Befehlspipeline hinzugefügt werden, weil null! = „/".

Auf den Punkt gebracht leider kann man dieses Verhalten nicht außer Kraft setzen, weil es in der Quelle verbrannt wird.

Andere Tipps

Obwohl die Post wie lange Zeit vor ... geschweige denn, ich werde hier die Antwort.

Statt ftp://server/path als uri zu verwenden, versuchen ftp://server/%2fpath/.

Der zusätzliche %2f“ist nur ein entflohener /, diese Zugabe wird C # behandeln den ganzen Weg als absolute machen. Oder aber C # wird melden Sie sich mit dem Benutzernamen ftp://server/, gehen Sie auf die Home-Ordner des Benutzers, dann CD auf den angegebenen Pfad, so dass Ihr Weg werden user_home_path/path, was nicht wünschenswert sein kann.

Weitere Informationen können bei Msdn finden http://msdn.microsoft.com/en-us/library /system.net.ftpwebrequest.aspx

Hope, das hilft.

Ich denke, wir vor einiger Zeit ein ähnliches Problem hatte, ich jedoch die genauen Details nicht erinnern.

.net Um zu verhindern, von der CD-Befehls, ob das Standardverzeichnis für die Benutzereinstellung sind Sie melden Sie sich als auf das Verzeichnis gesetzt wird Sie in arbeiten wollen. Sie haben soeben einen Befehlszeile FTP-Client verwenden können, um zu überprüfen dies.

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

Hier finden Sie 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 aus der Box in Ordnung, aber auch leicht erweitert und modifiziert werden kann.

Mit den Informationen über diese für mich gearbeitet.

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

Hat CWD nicht senden - ftpState.ftpRequest = GetRequest ( " ftp://192.168.0.2//tmp/file2download ")     Beachten Sie die // nach dem Server-IP (oder Namen)

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top