2010-03-08 3 views
6

निम्नलिखित कोड फेंकता System.UriFormatException:System.Uri पार्स नहीं कर सकता जब पासवर्ड या उपयोगकर्ता नाम क्षेत्र विशेष वर्ण शामिल

var uri = new UriBuilder("ftp://user:pass#[email protected]:21/fu/bar.zip"); 

System.UriFormatException: अमान्य यूआरआई: एक बंदरगाह उम्मीद थी है की वजह से वहाँ एक कोलन (':') मौजूद है लेकिन बंदरगाह को पार्स नहीं किया जा सका।

# पासवर्ड फ़ील्ड से प्रतीक को हल करने से समस्या हल हो जाती है।

  1. एक # प्रतीक पासवर्ड फील्ड में है करने के लिए एक वैध चरित्र है?
  2. क्या इससे बचने का कोई तरीका है?
  3. क्या यह उरी कक्षा के पार्सिंग दिनचर्या में एक ज्ञात बग है?
  4. कोई इस बारे में कैसे मिलता है - मानते हुए कि आप पासवर्ड नहीं बदल सकते हैं? ;-)

धन्यवाद, एंड्रयू

उत्तर

10

आपको इसके बजाय% 23 का उपयोग करने में सक्षम होना चाहिए।

दो अंकों के हेक्स संख्या के बाद प्रतिशत प्रतीक यह है कि URL में वर्ण कैसे बच निकले हैं। 23 ASCII तालिका में हैश/पाउंड प्रतीक के लिए हेक्साडेसिमल मान है।

इस विशेष समस्या को हल करने के बजाय, आपको आम तौर पर पूरे उपयोगकर्ता नाम और पासवर्ड फ़ील्ड को एन्कोड करके इस समस्या को हल करना चाहिए। आप System.Web.HttpUtility.UrlEncode (संदर्भ System.Web विधानसभा) के साथ ऐसा करने में सक्षम होना चाहिए:

string username = ... 
string password = ... 
string url = string.Format("ftp://{0}:{1}@ftp.example.com:21/fu/bar.zip", HttpUtility.UrlEncode(username), 
                      HttpUtility.UrlEncode(password)); 
एक थोड़ा लाल चेहरा साथ
+0

धन्यवाद क्रिस, जैसा कि क्रिस को टिप्पणी में बताया गया है, मुझे वास्तव में मानों को एन्कोड करना चाहिए था * ब्लश * मैंने उस उत्तर को बदल दिया है जिसे मैं सही मानता हूं क्योंकि मेरा मानना ​​है कि यह सवाल का अधिक सटीक उत्तर देता है। – Andrew

+0

बिल्कुल सही! धन्यवाद.. –

1

# के बाद से यह विशेष वर्ण माना जाता है, एन्कोड करने की आवश्यकता होगी। फिर भी, सुनिश्चित नहीं है कि यह काम करेगा। कभी कोशिश नहीं की।

+0

(मैं वास्तव में उन क्षेत्रों एन्कोडिंग के बारे में सोचा जाना चाहिए था) ... बस पुष्टि करने के लिए, यह काम जब एन्कोड करता है । – Andrew