2016-06-17 24 views
11

Ich bin auf eine interessante Situation gestoßen, in der ich NRE von Uri.TryCreate Methode bekomme, wenn es false zurückgeben soll.Warum wirft Uri.TryCreate NRE, wenn die URL türkisches Zeichen enthält?

können Sie das Problem wie unten reproduzieren:

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

Ich denke, es während des Parse ist versagt, aber wenn ich "http:A" zum Beispiel versuchen, es gibt true und parst sie als relative URL. Auch wenn es bei der Analyse fehlschlägt, sollte es einfach false zurückgeben, wie ich verstehe, was könnte das Problem hier sein? Dies scheint ein Fehler in der Implementierung zu sein, da in der Dokumentation keine Ausnahme für diese Methode erwähnt wird.

Der Fehler tritt in .NET 4.6.1 aber nicht 4.0

+0

Ihr Beispiel funktioniert für mich in LinqPad. Vielleicht UriKind.Absolute verwenden? Siehe auch http://stackoverflow.com/questions/4161247/uri-trycreate-returns-true-for-any-string-value – Greg

+0

@Greg in meinem Fall, obwohl es eine NullReferenceException in Uri.CreateUriInfo auslöst. Welche .NET Version hast du für den Test verwendet? –

+0

@Greg vergessen zu erwähnen .net Version, könnte verwandt sein –

Antwort

6

Dies ist ein Fehler in dem .NET-Framework. Sie können ein Ticket auf MicrosoftConnect öffnen.

Die Ausnahme wird bei dieser Methode

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

auf Linie 2290 (überprüfen Sie die reference source) Ausführung folgende Anweisung angehoben werden:

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

Zu diesem Zeitpunkt wird das m_Syntax Objekt null sein, denn Während des Parsens wird es verworfen.

Methode

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

Die PrivateParseMinimal() Methode gibt ParsingError.BadAuthority und uriKind == UriKind.RelativeOrAbsolute nach Ihren Vorgaben. Die Methode PrivateParseMinimal() sucht nach einer der folgenden Zeichenfolgen: "//", "\", "/ \", "/". Und da in Ihrer Eingabe keine solchen Sequenzen enthalten sind, wird ein ParsingError.BadAuthority Code zurückgegeben.