2016-06-17 12 views
11

Znalazłem interesującą sytuację, w której otrzymuję NRE z metody Uri.TryCreate, kiedy ma powrócić false.Dlaczego funkcja Uri.TryCreate zgłasza NRE, gdy adres URL zawiera znaki tureckie?

można odtworzyć problem jak poniżej:

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

Myślę, że w przypadku braku podczas parsowania, ale gdy próbuję "http:A" na przykład, zwraca true i przetwarza je jako względny adres URL. Nawet jeśli nie powiedzie się, to po prostu powinien wrócić false jak rozumiem, jaki może być problem? Wygląda to na błąd w implementacji, ponieważ dokumentacja nie wspomina o żadnym wyjątku w tej metodzie.

Błąd występuje w .NET 4.6.1 ale nie 4,0

+0

Twój przykład działa dla mnie w LinqPad. Może użyć UriKind.Absolute? Zobacz także http://stackoverflow.com/questions/4161247/uri-trycreate-returns-true-for-any-string-value – Greg

+0

@Greg w moim przypadku, chociaż generuje wyjątek NullReferenceException w Uri.CreateUriInfo. Którą wersję .NET użyłeś do testu? –

+0

@Greg zapomnij wspomnieć o wersji .net, może być powiązany –

Odpowiedz

6

Jest to błąd w .NET Framework. Możesz otworzyć bilet na MicrosoftConnect.

Wyjątek zostanie podniesiony w tej metodzie

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

na linii 2290 (wglądu do reference source) wykonywanie następującą informację:

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

W tym czasie, celem m_Syntax będzie null, ponieważ podczas parsowania zostanie odrzucony.

Metoda

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

line 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 
     } 
     // ... 
    } 
    // ... 
} 

Sposób PrivateParseMinimal() zwraca ParsingError.BadAuthority i uriKind == UriKind.RelativeOrAbsolute według specyfikacji. Metoda

szuka dowolnej z następujących sekwencji znaków: "//", "\", "/ \", "/". A ponieważ nie ma takich sekwencji w twoim łańcuchu wejściowym, zostanie zwrócony kod ParsingError.BadAuthority.

Powiązane problemy