2009-05-18 2 views
9

में FtpWebRequest का उपयोग करते समय पोर्ट नंबर सेट करें जब मैं डीएस 2008 का उपयोग करते हुए सी # कोड से सी # कोड से एफ़टीपी करने का प्रयास करता हूं तो मैं अपवाद प्राप्त करता हूं।सी #

मेरा परीक्षण वर्ग इस तरह दिखता है:

public class FTP 
{ 
    private string ftpServerIP = "192.168.10.35:21"; 
    private string ftpUserID = "Administrator"; 
    private string ftpPassword = "XXXXXXXX"; 
    private string uploadToFolder = "uploadtest"; 

    public void Upload(string filename) 
    { 
     FileInfo fileInf = new FileInfo(filename); 
     string uri = "ftp://" + ftpServerIP + "/" + uploadToFolder + "/" + fileInf.Name; 
     FtpWebRequest reqFTP; 

     reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 
     reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
     reqFTP.KeepAlive = false; 
     reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 
     reqFTP.UseBinary = true; 
     reqFTP.ContentLength = fileInf.Length; 

     int buffLength = 2048; 
     byte[] buff = new byte[buffLength]; 
     int contentLen; 

     FileStream fs = fileInf.OpenRead(); 
     try 
     { 
      Stream strm = reqFTP.GetRequestStream(); 
      contentLen = fs.Read(buff, 0, buffLength); 

      while (contentLen != 0) 
      { 
       strm.Write(buff, 0, contentLen); 
       contentLen = fs.Read(buff, 0, buffLength); 
      } 

      strm.Close(); 
      fs.Close(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message); 
     } 
    } 
} 

जब मैं कोड निष्पादित मैं एक कनेक्शन GetRequestStream() कॉल में एफ़टीपी त्रुटि 227 के साथ विफल मिलता है। अपवाद मैं कनेक्शन देख सकते में विफल रहता है के लिए: 192.168.10.35:52184

मुझे पता नहीं कैसे यह बंदरगाह 52184. मैं ftpServerIP में निर्दिष्ट है कि यह होना चाहिए के साथ आता है बंदरगाह 21.

मुझे Google पर एक ही मुद्दे के साथ कुछ व्यक्ति मिल गए हैं, लेकिन मुझे यह हल करने का अच्छा उदाहरण नहीं मिला है कि यह कैसे हल किया गया है और मुझे अभी भी समझ में नहीं आता कि ऐसा क्यों होता है।

कोई भी इस मुद्दे को संभालने के बारे में जानता है ??

अद्यतन:

मैं एक अलग एफ़टीपी खाते से कनेक्ट करने की कोशिश की है और वहाँ यह सब ठीक काम करता है। इसलिए मैंने अपने 192.168.10.35:21 एफ़टीपी का परीक्षण किया लेकिन यह प्याराएफटीपी प्रो और पसंद में ठीक काम करता है। यह सिर्फ इसे और भी अजीब बनाता है ..

उत्तर

7

मेरा अनुमान विंडोज फ़ायरवॉल के मुद्दे होंगे, एफ़टीपी केवल पोर्ट 21 की तुलना में अन्य बंदरगाहों का उपयोग करता है - कभी-कभी एफ़टीपी मोड को सक्रिय से निष्क्रिय तक बदलना चीजों को काम करने में मदद करता है। एफ़टीपी पर यह अच्छा लेख पर

reqFTP.UsePassive = false; 

देखो: Active FTP vs. Passive FTP, a Definitive Explanation

+0

मुझे लगता है कि मुझे अंतर दिखाई देता है लेकिन मैं निष्क्रिय से सक्रिय में बदलने में विफल रहता हूं, क्या किसी के पास इसके लिए एक अच्छी मार्गदर्शिका है? –

3

थिएस यह अधिकार मिल गया है, यह

कोड में ठीक तो पागलपन की हद तक सरल है निष्क्रिय मोड के साथ करना था :)

reqFTP.UsePassive = false; 

और यह तेजी से और त्रुटियों के बिना काम किया!

1

कमांड पोर्ट और डेटा पोर्ट को अलग करना महत्वपूर्ण है। यदि आप सक्रिय या पासिव मोड में हैं तो कनेक्शन प्रोटोकॉल भी बदल जाएगा।

सक्रिय मोड:

1) ग्राहक डिफ़ॉल्ट सर्वर COMMAND बंदरगाह (21) के लिए एक यादृच्छिक अनिर्दिष्ट COMMAND बंदरगाह (एन> 1023) से एक कनेक्शन आरंभ। ग्राहक अपना डेटा पोर्ट (एन + 1) निर्दिष्ट करेगा और इस बंदरगाह पर सुनना शुरू कर देगा।

2) सर्वर अपने डिफ़ॉल्ट डेटा पोर्ट (20) से निर्दिष्ट क्लाइंट डेटा पोर्ट (एन + 1) से कनेक्शन शुरू करता है।

निष्क्रिय मोड:

1) ग्राहक निष्क्रिय कमांड के साथ डिफ़ॉल्ट सर्वर COMMAND बंदरगाह (21 करने के लिए एक यादृच्छिक अनिर्दिष्ट COMMAND बंदरगाह (एन> 1023) से एक कनेक्शन) आरंभ करें। सर्वर एक यादृच्छिक डेटा पोर्ट (पी> 1023) खोलता है और इसे क्लाइंट को भेजता है।

2) ग्राहक अपने डेटा पोर्ट (एन + 1) से निर्दिष्ट सर्वर डेटा पोर्ट (पी> 1023) से कनेक्शन शुरू करता है।

यदि आप सक्रिय मोड का उपयोग करते हैं, तो आपको सबसे अधिक संभावना है कि आपके क्लाइंट की फ़ायरवॉल सर्वर से कनेक्शन को आपके पोर्ट (एन + 1> 1024) में स्वीकार करे।

आपके उदाहरण में, आप सक्रिय मोड में थे। आपके क्लाइंट ने अपने COMMAND पोर्ट (52183) से सर्वर के डिफ़ॉल्ट COMMAND पोर्ट (21) में एक कनेक्शन शुरू किया और इसके डेटा पोर्ट (52184 = 52183 + 1) निर्दिष्ट किया। तब सर्वर ने अपने डिफ़ॉल्ट डेटा पोर्ट (20) से क्लाइंट के डेटा पोर्ट (52184) से कनेक्शन शुरू किया, जिसे क्लाइंट की फ़ायरवॉल द्वारा अस्वीकार कर दिया गया था।

मुझे आशा है कि इससे आपको आपकी समस्या का समाधान करने में मदद मिलेगी!