2009-02-10 9 views
8

मुझे .NET के उरी कार्यान्वयन में कोई समस्या है। ऐसा लगता है कि यदि योजना "ftp" है, तो क्वेरी भाग को क्वेरी के रूप में पार्स नहीं किया गया है, बल्कि इसके बजाय पथ के हिस्से के रूप में।.NET के उरी कार्यान्वयन के लिए वैकल्पिक?

उदाहरण के लिए निम्नलिखित कोड डालें:

Uri testuri = new Uri("ftp://user:[email protected]/?passive=true"); 
Console.WriteLine(testuri.Query); // Outputs an empty string 
Console.WriteLine(testuri.AbsolutePath); // Outputs "/%3Fpassive=true" 

मुझे ऐसा लगता है कि उरी वर्ग गलत पथ के एक भाग के रूप में क्वेरी भाग पार्स करता है। हालांकि इस योजना के बारे में http के लिए बदल रहा है, परिणाम की उम्मीद के रूप में किया जाता है:

Uri testuri = new Uri("http://user:[email protected]/?passive=true"); 
Console.WriteLine(testuri.Query); // Outputs "?passive=true" 
Console.WriteLine(testuri.AbsolutePath); // Outputs "/" 

है किसी को भी इस के लिए एक समाधान है, या एक विकल्प के उरी वर्ग की उम्मीद रूप में काम करता है कि पता है?

उत्तर

4

ठीक है, समस्या नहीं है कि मैं एक FTP कनेक्शन बनाने में असमर्थ हूँ, लेकिन है कि यूआरआई के आरएफसी 2396.

मैं वास्तव में क्या करने का इरादा क्या करने के लिए पार्स accoding नहीं कर रहे हैं एक कारखाना बनाना था जो किसी दिए गए कनेक्शन यूआरआई के आधार पर एक सामान्य फ़ाइल स्थानांतरण इंटरफ़ेस (प्राप्त करने और रखरखाव विधियों) के कार्यान्वयन प्रदान करता है। यूआरआई प्रोटोकॉल, उपयोगकर्ता जानकारी, होस्ट और पथ, और (जैसे FTP कनेक्शन के लिए निष्क्रिय मोड विकल्प के रूप में) किसी भी गुण प्रदान किया जाने वाला यूआरआई की क्वेरी भाग के माध्यम से पारित किया जाना चाहिए की जरूरत को परिभाषित करता है।

हालांकि यह .NET उरी कार्यान्वयन का उपयोग करके मुश्किल साबित हुआ, क्योंकि ऐसा लगता है कि यह स्कीमा के आधार पर यूआरआई के अलग-अलग प्रश्नों का विश्लेषण करता है।

तो मैं उम्मीद कर रहा था कि किसी को इसके लिए एक कामकाज, या प्रतीत होता है कि टूटने वाले .NET उरी कार्यान्वयन के विकल्प के बारे में पता था। अपने आप को लागू करने के घंटों खर्च करने से पहले जानना अच्छा लगेगा।

1

आपको FTP प्रोटोकॉल के लिए एक विशिष्ट वर्ग का उपयोग करना है जैसे FtpWebRequest जिसमें UU प्रॉपर्टी जैसे RequestUri है।

मुझे लगता है कि आपको उरी पार्सर के लिए कक्षाओं में खोना चाहिए।

2

आपको FtpWebRequest और FtpWebResponse कक्षाओं का उपयोग करना चाहिए जब तक कि आपके पास कोई विशिष्ट कारण न हो।

FtpWebRequest.fwr = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://uri")); 
fwr.ftpRequest.Method = WebRequestMethods.Ftp.UploadFile; 
fwr.ftpRequest.Credentials = new NetworkCredential("user", "pass"); 


FileInfo ff = new FileInfo("localpath"); 
byte[] fileContents = new byte[ff.Length]; 

using (FileStream fr = ff.OpenRead()) 
{ 
    fr.Read(fileContents, 0, Convert.ToInt32(ff.Length)); 
} 

using (Stream writer = fwr.GetRequestStream()) 
{ 
    writer.Write(fileContents, 0, fileContents.Length); 
} 

FtpWebResponse frp = (FtpWebResponse)fwr.GetResponse(); 
Response.Write(frp.ftpResponse.StatusDescription); 

Ref1Ref2

2

मैं थोड़ी देर के लिए एक ही मुद्दे के साथ संघर्ष कर रहा है। UriParser.Register का उपयोग कर "एफ़टीपी" योजना के लिए मौजूदा UriParser को बदलने के लिए प्रयास कर रहा है एक InvalidOperationException फेंकता है क्योंकि योजना पहले से पंजीकृत है।

जिस समाधान के साथ मैं आया हूं, मौजूदा एफटीपी पार्सर को संशोधित करने के लिए प्रतिबिंब का उपयोग करना शामिल है ताकि यह क्वेरी स्ट्रिंग को अनुमति दे सके। यह another UriParser bug पर कामकाज पर आधारित है।

MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static 
                   | System.Reflection.BindingFlags.NonPublic); 
FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance 
                  | System.Reflection.BindingFlags.NonPublic); 
if (getSyntax != null && flagsField != null) 
{ 
    UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { "ftp"}); 
    if (parser != null) 
    { 
     int flagsValue = (int)flagsField.GetValue(parser); 

     // Set the MayHaveQuery attribute 
     int MayHaveQuery = 0x20; 
     if ((flagsValue & MayHaveQuery) == 0) flagsField.SetValue(parser, flagsValue | MayHaveQuery); 
    } 
} 

भागो अपने प्रारंभ, और अपने एफ़टीपी में कहीं Uris होगा कि क्वेरी स्ट्रिंग Query पैरामीटर में जाते हैं, जैसा कि आप उम्मीद करेंगे, Path के बजाय।