2016-06-17 13 views
11

Ho riscontrato una situazione interessante in cui ricevo il NRE dal metodo Uri.TryCreate quando deve restituire false.Perché Uri.TryCreate genera NRE quando url contiene caratteri turchi?

è possibile riprodurre il problema come di seguito:

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

Credo che sia mancata durante il parsing, ma quando provo "http:A" per esempio, restituisce true e lo analizza come URL relativo. Anche se fallisce l'analisi dovrebbe restituire solo false come ho capito, quale potrebbe essere il problema qui? Questo sembra un bug nella documentazione della causa di implementazione non menziona alcuna eccezione su questo metodo.

L'errore si verifica in .NET 4.6.1 ma non 4.0

+0

Il tuo esempio funziona per me in LinqPad. Forse usare UriKind.Absolute? Vedi anche http://stackoverflow.com/questions/4161247/uri-trycreate-returns-true-for-any-string-value – Greg

+0

@Greg nel mio caso sebbene lanci una NullReferenceException in Uri.CreateUriInfo. Quale versione .NET hai usato per il test? –

+0

@Greg dimentica di menzionare la versione .net, potrebbe essere correlata –

risposta

6

Si tratta di un bug nel framework .NET. È possibile aprire un ticket su MicrosoftConnect.

L'eccezione sarà sollevata in questo metodo

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

on line 2290 (ispezionare la reference source) eseguendo seguente dichiarazione:

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

In questo momento, l'oggetto m_Syntax sarà null, perché durante l'analisi, verrà scartato.

Metodo

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

Il metodo restituisce PrivateParseMinimal()ParsingError.BadAuthority e uriKind == UriKind.RelativeOrAbsolute dalla vostra specifica.

Il metodo PrivateParseMinimal() cerca una delle seguenti sequenze di caratteri: "//", "\", "/ \", "/". E poiché non ci sono sequenze di questo tipo nella stringa di input, verrà restituito un codice ParsingError.BadAuthority.

Problemi correlati