当url包含土耳其字符时,为什么Uri.TryCreate会抛出NRE?

Sel*_*enç 11 .net c# .net-4.0 .net-core .net-4.6.1

我遇到了一个有趣的情况,我NREUri.TryCreate方法中得到它应该返回false.

您可以重现以下问题:

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

我猜它在解析期间失败了,但是当我尝试"http:A"例子时,它返回true并将其解析为相对url.即使解析失败也应该false按照我的理解返回,这可能是什么问题?这似乎是实现中的错误原因文档没有提到有关此方法的任何异常.

该错误发生在.NET 4.6.1中,但不是4.0

dym*_*oid 6

这是.NET框架中的一个错误.您可以在MicrosoftConnect上打开票证.

此方法将引发异常

void Systen.Uri.CreateUriInfo(System.Uri.Flags cF)
Run Code Online (Sandbox Code Playgroud)

在第2290行(检查参考源)执行以下声明:

// This is NOT an ImplicitFile uri
idx = (ushort)m_Syntax.SchemeName.Length;
Run Code Online (Sandbox Code Playgroud)

此时,m_Syntax对象将是null,因为在解析期间,它将被丢弃.

方法

void InitializeUri(ParsingError err, UriKind uriKind, out UriFormatException e)
Run Code Online (Sandbox Code Playgroud)

第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
         }
         // ...
     }
    // ...
 }
Run Code Online (Sandbox Code Playgroud)

PrivateParseMinimal()方法返回ParsingError.BadAuthority并按uriKind == UriKind.RelativeOrAbsolute您的规范.

PrivateParseMinimal()方法查找以下任何字符序列:"//","\","/ \","/".由于输入字符串中没有这样的序列,ParsingError.BadAuthority因此将返回代码.