I'm trying to get the following code working:
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;
This normally works, but for 1 particular server this gives an Error 500: Syntax not recognized. The Change Directory command is disabled on the problem server, and the site administrator told me that .NET issues a Change Directory command by default with all FTP connections. Is that true? Is there a way to disable that?
EDIT: When I login from a command line I am in the correct directory:
ftp> pwd
257 "/" is current directory
Meskipun C dibuat untuk memprogram sistem dan jaringan komputer namun bahasa ini juga sering digunakan dalam mengembangkan software aplikasi. C juga banyak dipakai oleh berbagai jenis platform sistem operasi dan arsitektur komputer, bahkan terdapat beberepa compiler yang sangat populer telah tersedia.
C adalah huruf ketiga dalam alfabet Latin. Dalam bahasa Indonesia, huruf ini disebut ce (dibaca [tʃe]).
Bahasa pemrograman C ini dikembangkan antara tahun 1969 – 1972 oleh Dennis Ritchie. Yang kemudian dipakai untuk menulis ulang sistem operasi UNIX. Selain untuk mengembangkan UNIX, bahasa C juga dirilis sebagai bahasa pemrograman umum.
I just tested this on one of our dev servers and indeed there is a CWD issued by the .NET FtpWebRequest:
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)
This was without even specifying '/' in the uri when creating the FtpWebRequest object.
If you debug or browse the source code, a class called 'FtpControlStream' comes into play. See call stack:
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#
There's a method named BuildCommandsList() which is invoked. BuildCommandsList() builds a list of commands to send to the FTP server. This method has the following snippet of code:
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));
}
Upon the first connection to the server m_PreviousServerPath is always null, the value of newServerPath is "/" and is computed by a function named GetPathAndFileName() (invoked a few lines prior to this block of code). GetPathAndFileName() computes newServerPath as "/" if no path is supplied or if "/" is explicitly tacked on the end of the 'ftp://....' uri.
So this of course ultimately causes the CWD command to be added to the command pipeline because null != "/".
In a nutshell unfortunately you can't override this behaviour because it's burned in the source.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With