2009-07-13 15 views
11

मेरे पास एक तरीका है जो उरी बनाने की कोशिश करता है और फिर इसे साफ़ करता है (टुकड़े हटा देता है, कुछ डोमेन और क्वेरी स्ट्रिंग पैटर्न इत्यादि को छोड़ देता है)। विधि इस तरह दिखती है:Uri.TryCreate UriFormatException फेंकता है?

static public bool TryCreateCleanUri(Uri baseUri, string relstr, out Uri result) 
{ 
    if (!Uri.TryCreate(baseUri, relstr, out result)) 
    { 
     return false; 
    } 
    return CleanupUri(result, out result); 
} 

यह विधि महीनों के लिए ठीक काम कर रही है। लेकिन कल रात यह असफल रहा। Uri.TryCreate() एक अपवाद फेंक दिया! यहाँ स्टैक ट्रेस है: Uri.TryCreate(Uri, String, out Uri) के लिए

ERROR: Unhandled exception caught. Program terminating. 
System.UriFormatException: Invalid URI: The hostname could not be parsed. 
    at System.Uri.CreateHostStringHelper(String str, UInt16 idx, UInt16 end, Flags& flags, String& scopeId) 
    at System.Uri.CreateHostString() 
    at System.Uri.GetComponentsHelper(UriComponents uriComponents, UriFormat uriFormat) 
    at System.Uri.CombineUri(Uri basePart, String relativePart, UriFormat uriFormat) 
    at System.Uri.GetCombinedString(Uri baseUri, String relativeStr, Boolean dontEscape, String& result) 
    at System.Uri.ResolveHelper(Uri baseUri, Uri relativeUri, String& newUriString, Boolean& userEscaped, UriFormatException& e) 
    at System.Uri.TryCreate(Uri baseUri, Uri relativeUri, Uri& result) 
    at System.Uri.TryCreate(Uri baseUri, String relativeUri, Uri& result) 

प्रलेखन का कहना है कि वापसी मान True यदि सफल, False अन्यथा है, लेकिन यह अपवाद के बारे में चुप है। हालांकि, Uri.TryCreate(Uri, Uri, out Uri) के लिए दस्तावेज़ का कहना है:

इस विधि यूआरआई निर्माण करती है, विहित प्रपत्र में डालता है यह, और यह सत्यापित करता है। यदि एक अनचाहे अपवाद होता है, यह विधि इसे पकड़ती है। यदि आप चाहते हैं तो उरी बनाएं और अपवाद प्राप्त करें उरी रचनाकारों में से एक का उपयोग करें।

स्टैक ट्रेस दिखाता है कि अपवाद को Uri.TryCreate(Uri, Uri, out Uri) में फेंक दिया गया था, जो दस्तावेज के अनुसार नहीं होना चाहिए।

यह एक बहुत ही दुर्लभ घटना है। मैं महीनों के लिए उस कोड का उपयोग कर रहा हूं, इसके माध्यम से सचमुच अरबों यूआरएल चला रहा हूं, और अब तक कोई समस्या नहीं आई है। दुर्भाग्यवश मुझे नहीं पता कि चीजों के संयोजन ने समस्या का कारण बना दिया। मैं एक टेस्ट केस बनाने की उम्मीद कर रहा हूं जो त्रुटि दिखाता है।

क्या यह Uri.TryCreate में ज्ञात बग है, या क्या मुझे कुछ याद आ रही है?

+0

क्या आप जानते हैं कि विफलता के कारण यह किस URL को पार्स करने का प्रयास कर रहा है? –

+0

अगर मुझे पता था, तो मैं इसे पोस्ट करता। –

+0

"TryCreate" क्या कर रहा है यह जानने के लिए परावर्तक का उपयोग करें – DevinB

उत्तर

18

मेरे कोड इस स्थिति फिर से सामना करने के लिए के लिए संभावित रूप से कई महीने तक इंतजार करना अनिच्छुक, मैं ILDASM साथ कुछ समय बिताया क्या TryCreate यह पता लगाने की कर रहा है, और फिर त्रुटि को पुन: उत्पन्न करने के तरीके के साथ थोड़ा और समय आ रहा है।

Uri.TryCreate(Uri baseUri, Uri relativeUri, out Uri result) में क्रैश का कारण एक बुरी तरह से स्वरूपित baseUri प्रतीत होता है।

Uri badUri = new Uri("mailto:[email protected]@mischel.com"); 

mailto के लिए आरएफसी के अनुसार:: यूआरआई, कि अनुमति नहीं होनी चाहिए उदाहरण के लिए, Uri निर्माता निम्नलिखित अनुमति देता है। और यद्यपि कन्स्ट्रक्टर Uri ऑब्जेक्ट बनाता है और लौटाता है, इसके गुणों (कुछ) तक पहुंचने का प्रयास करने से UriFormatException फेंकता है। उदाहरण के लिए, ऊपर दिए गए कोड को देखते हुए इस लाइन एक अपवाद फेंक देगा:

string badUriString = badUri.AbsoluteUri; 

मुझे लगता है यह नहीं बल्कि दिलचस्प Uri वर्ग दो अलग पार्स एल्गोरिदम का उपयोग करने के लिए प्रतीत होता है कि: निर्माण के दौरान इस्तेमाल किया, और एक प्राप्त करने के लिए आंतरिक रूप से उपयोग व्यक्तिगत घटक

इस अमान्य Uri से TryCreate को पास करने के परिणामस्वरूप मैंने मूल प्रश्न में वर्णित अपवाद का परिणाम दिया होगा। TryCreate विधि null के लिए baseUri पैरामीटर की जांच करता है, लेकिन यह अन्यथा मान्य नहीं कर सकता (मैं नहीं कर सकता)।यह मानना ​​है कि, यदि पैरामीटर गैर-शून्य है, तो पास ऑब्जेक्ट पूरी तरह से प्रारंभ और वैध Uri उदाहरण है। लेकिन परिणाम बनाने में किसी बिंदु पर, TryCreatebaseUri के घटकों को प्राप्त करने का प्रयास करता है और एक अपवाद फेंक दिया जाता है।

मैं यह नहीं कह सकता कि मेरे प्रोग्राम को वास्तव में एक मेलto: यूआरएल का सामना करना पड़ा जो इस तरह से प्रारूपित था। मैं कुछ निश्चित निश्चितता के साथ कह सकता हूं, हालांकि, एक अवैध Uri ऑब्जेक्ट मेरे प्रोग्राम में क्रैश का कारण था, क्योंकि मेरे प्रोग्राम से अपवाद स्टैक ट्रेस परीक्षण कार्यक्रम से स्टैक ट्रेस से मेल खाता है। सीधे शब्दों में कहें, बग Uri कन्स्ट्रक्टर (और TryCreate विधियों में भी) है जो अमान्य Uri बनाने के लिए अनुमति देता है।

आप माइक्रोसॉफ्ट कनेक्ट पर bug report का पालन कर सकते हैं।

3

अब आप जानते हैं कि यह, असफल हो सकता है की और अधिक जानकारी प्राप्त करते हैं:

static public bool TryCreateCleanUri(Uri baseUri, string relstr, out Uri result) 
{ 
    try { 
     if (!Uri.TryCreate(baseUri, relstr, out result)) 
     { 
      return false; 
     } 
    } 
    catch (UriFormatException ex) { 
     throw new InalidOperationException(
      String.Format("Can create URI for base={0}, rel={1}", baseUri.ToString(), relstr), 
      ex); 
    }   
    return CleanupUri(result, out result); 
} 
+0

मैंने अपने आवेदन में समान कोड जोड़ा है। दुर्भाग्य से, त्रुटि ट्रिप होने से पहले यह कई दिन (सप्ताह या महीने) हो सकती है। मैं एक टेस्ट केस बनाने की कोशिश कर रहा हूं। –

+0

ठीक है। ध्यान दें कि महत्वपूर्ण भाग TryCreate को दो इनपुट पैरामीटर को कैप्चर और प्रदर्शित करना है। मैं शर्त लगाता हूं कि जब आप इसे देखते हैं तो जवाब आपके ऊपर कूद जाएगा, खासकर जब से आपके पास स्टैक ट्रेस भी होगा। –

-1
public static bool CheckUrlValid(string url) 
    { 
     Uri uriResult; 
     bool result = Uri.TryCreate(url, UriKind.Absolute, out uriResult); 
     if(result) 
     { 
      uriResult = new Uri(url); 
      if (uriResult.Scheme == Uri.UriSchemeHttps || uriResult.Scheme == Uri.UriSchemeHttp) 
       return true; 
     } 

     return false; 
    } 
+0

यह मेरे लिए ठीक काम करता प्रतीत होता है। यदि आप इसे शुरू किए बिना यूरी चर का उपयोग करने का प्रयास करते हैं, तो यह एक त्रुटि का कारण बन जाएगा। – Seven

+0

स्टैक ओवरव्लो में आपका स्वागत है! प्रश्नों के उत्तर पोस्ट करते समय, कृपया अपने कोड से अधिक पोस्ट करें। इसे समझाएं, इसका उपयोग दिखाएं, जितना संभव हो उतना स्पष्ट उत्तर देने के लिए कुछ भी करें, लेकिन एक उत्तर हमेशा कोड से अधिक होना चाहिए। धन्यवाद, और शुभकामनाएँ! – MayorMonty

+1

विचार के लिए धन्यवाद, लेकिन यह लगभग सात साल बहुत देर हो चुकी है, और वास्तव में सवाल को संबोधित नहीं करता है। आप देखते हैं, मेरा मुद्दा यह था कि 'उरी। ट्रीक्रेट' एक अपवाद फेंक रहा था कि इसे फेंकना नहीं चाहिए था। आपका प्रस्तावित समाधान मदद नहीं करेगा। आखिरकार मैंने जॉन सॉंडर्स के जवाब में दिए गए कोड के समान कोड का उपयोग करके समस्या की पहचान की। यही है, अपवाद को पकड़ें और त्रुटि को फिसलने वाले यूआरएल को आउटपुट करें। –

संबंधित मुद्दे