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.