سؤال

أحاول تشغيل الكود التالي:

  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;

يعمل هذا بشكل طبيعي، ولكن بالنسبة لخادم واحد معين، فإن هذا يعطي الخطأ 500:لم يتم التعرف على بناء الجملة.تم تعطيل أمر تغيير الدليل على الخادم الذي به مشكلة، وأخبرني مسؤول الموقع أن .NET يصدر أمر تغيير الدليل بشكل افتراضي مع كافة اتصالات FTP.هل هذا صحيح؟هل هناك طريقة لتعطيل ذلك؟
يحرر:عندما أقوم بتسجيل الدخول من سطر الأوامر أكون في الدليل الصحيح:
بروتوكول نقل الملفات> الأشخاص ذوي الإعاقة
257 "/" هو الدليل الحالي

هل كانت مفيدة؟

المحلول

واختبرت هذا فقط على أحد الملقمات ديف لدينا، وهناك بالفعل CWD الصادرة عن صافي 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)

وكان هذا حتى دون تحديد '/' في اوري عند إنشاء FtpWebRequest يتم الكائن.

إذا تصحيح أو تصفح شفرة المصدر، فئة تسمى "FtpControlStream" يأتي دور. ترى مكدس الاستدعاءات:

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#

وهناك أسلوب يسمى BuildCommandsList () الذي يتم استدعاؤه. BuildCommandsList () يبني على قائمة من الأوامر لإرسالها إلى خادم FTP. هذا الأسلوب له المقتطف التالي من التعليمات البرمجية:

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)); 
}

وعند أول اتصال لm_PreviousServerPath الخادم هو دائما لاغية، وقيمة newServerPath هو "/" ويتم حسابها بواسطة دالة اسمه GetPathAndFileName () (الاحتجاج بضعة أسطر قبل هذه الكتلة من التعليمات البرمجية). GetPathAndFileName () يحسب newServerPath ب "/" إذا تم توفير أي مسار أو إذا كان "/" وعلق صراحة على نهاية. "بروتوكول نقل الملفات: // .... 'اوري

وحتى هذا بالطبع يؤدي في نهاية المطاف الأمر CWD تضاف إلى خط أنابيب القيادة لاغية! = "/".

في وباختصار يمكن القول للأسف لا يمكنك تجاوز هذا السلوك لأنه أحرق في المصدر.

نصائح أخرى

رغم أن المنشور قديم منذ فترة طويلة..لا يهم، سأقدم الجواب هنا.

بدلا من استخدام ftp://server/path كما أوري، حاول ftp://server/%2fpath/.

المضافة %2f"هو مجرد هارب /, ، فإن إضافة هذا سيجعل C# يتعامل مع المسار بأكمله على أنه مطلق.وإلا فسيتم تسجيل الدخول إلى C# ftp://server/ باستخدام اسم المستخدم، انتقل إلى المجلد الرئيسي للمستخدم، ثم القرص المضغوط إلى المسار المحدد، بحيث يصبح المسار الخاص بك user_home_path/path, ، وهو ما قد لا يكون مرغوبًا فيه.

يمكن العثور على مزيد من المعلومات على msdnhttp://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx

أتمنى أن يساعدك هذا.

وأعتقد كان لدينا مشكلة مشابهة في حين يعود، وأنا لا أتذكر التفاصيل الدقيقة بالرغم من ذلك.

لمنع الصافية من إصدار الأمر cd، معرفة ما إذا كان وضع الدليل الافتراضي للمستخدم كنت الدخول في حيث من المقرر أن الدليل الذي تريد العمل فيه. يمكنك فقط استخدام عميل سطر الأوامر بروتوكول نقل الملفات للتحقق من ذلك.

وهنا هو الحل: استخدم هذا حرة ومفتوحة المصدر، مكتبة عميل FTP لC # التي دان في C-SharpCorner.com: http://www.c-sharpcorner.com/uploadfile/danglass/ ftpclient12062005053849am / ftpclient.aspx

وهنا بعض رمز المثال لتحميل الملف:

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

وهذه المكتبة يعمل بشكل جيد من خارج منطقة الجزاء، ولكن يمكن أيضا أن تمتد بسهولة وتعديلها.

وباستخدام المعلومات أعلاه، هذا العمل بالنسبة لي.

ويرسل CWD - ftpState.ftpRequest = GetRequest ( " ftp://192.168.0.2/tmp/file2download ")

ولا يرسل CWD - ftpState.ftpRequest = GetRequest ( " ftp://192.168.0.2//tmp/file2download ")     تلاحظ // بعد IP الخادم (أو الاسم)

وDOTNET الإصدار 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top