c# - क्यों Uri.TryCreate एनआरओ फेंकता है जब यूआरएल तुर्की चरित्र शामिल है?



.net .net-4.0 (1)

मुझे एक रोचक स्थिति का सामना करना पड़ा है जहां मुझे Uri.TryCreate से NRE Uri.TryCreate

आप नीचे की तरह समस्या पुन: उत्पन्न कर सकते हैं:

Uri url;
if (Uri.TryCreate("http:Ç", UriKind.RelativeOrAbsolute, out url))
{
    Console.WriteLine("success");
}

मुझे लगता है कि यह पार्स के दौरान असफल रहा है, लेकिन जब मैं "http:A" कोशिश करता हूं, उदाहरण के लिए, यह true रिटर्न करता true और इसे सापेक्ष यूआरएल के रूप में पार्स करता है। यहां तक ​​कि अगर पार्स पर असफल हो जाए तो इसे सिर्फ false वापसी करना चाहिए जैसा कि मैं समझता हूं, यहां समस्या क्या हो सकती है? यह कार्यान्वयन के कारण दस्तावेज में एक बग जैसा लगता है, इस पद्धति पर किसी भी अपवाद के बारे में उल्लेख नहीं करता है

त्रुटि .NET 4.6.1 में होती है लेकिन 4.0 नहीं


यह। NET फ्रेमवर्क में एक बग है। आप MicrosoftConnect पर टिकट खोल सकते हैं

अपवाद इस पद्धति में उठाया जाएगा

void Systen.Uri.CreateUriInfo(System.Uri.Flags cF)

निम्नलिखित बयान पर निष्पादित करने के लिए लाइन 2290 ( संदर्भ स्रोत की जांच करें):

// This is NOT an ImplicitFile uri
idx = (ushort)m_Syntax.SchemeName.Length;

इस समय, m_Syntax ऑब्जेक्ट null हो जाएगा, क्योंकि पार्सिंग के दौरान, इसे त्याग दिया जाएगा।

तरीका

void InitializeUri(ParsingError err, UriKind uriKind, out UriFormatException e)

रेखा 121 :

if (m_Syntax.IsSimple)
{
    if ((err = PrivateParseMinimal()) != ParsingError.None)
    {
        if (uriKind != UriKind.Absolute && err <= ParsingError.LastRelativeUriOkErrIndex)
        {
            // RFC 3986 Section 5.4.2 - http:(relativeUri) may be considered a valid relative Uri.
            m_Syntax = null; // convert to relative uri
            e = null;
            m_Flags &= Flags.UserEscaped; // the only flag that makes sense for a relative uri
         }
         // ...
     }
    // ...
 }

PrivateParseMinimal() विधि रिटर्न ParsingError.BadAuthority और uriKind == UriKind.RelativeOrAbsolute आपके विनिर्देश द्वारा।

PrivateParseMinimal() विधि निम्नलिखित वर्ण अनुक्रमों में से किसी एक के लिए देखता है: "//", "\", "/ \", "/" और चूंकि आपके इनपुट स्ट्रिंग में कोई ऐसी अनुक्रम नहीं हैं, इसलिए एक ParsingError.BadAuthorityParsingError.BadAuthority कोड वापस किया जाएगा।





.net-4.6.1