为什么 Uri.TryCreate 在 url 包含土耳其字符时抛出 NRE?
Why Uri.TryCreate throws NRE when url contains Turkish character?
我遇到了一个有趣的情况,当它应该 return false
.
时,我从 Uri.TryCreate
方法中得到了 NRE
您可以重现如下问题:
Uri url;
if (Uri.TryCreate("http:Ç", UriKind.RelativeOrAbsolute, out url))
{
Console.WriteLine("success");
}
我猜它在解析过程中失败了,但是当我尝试 "http:A"
时,它 returns true
并将其解析为相对 url。即使解析失败,据我所知,它也应该只是 return false
,这可能是什么问题?这似乎是实现中的一个错误,因为文档没有提及此方法的任何异常。
错误发生在 .NET 4.6.1 而不是 4.0
这是 .NET 框架中的错误。您可以在 MicrosoftConnect 上开票。
这个方法会抛出异常
void Systen.Uri.CreateUriInfo(System.Uri.Flags cF)
在第 2290 行(检查 reference source)执行以下语句:
// This is NOT an ImplicitFile uri
idx = (ushort)m_Syntax.SchemeName.Length;
此时,m_Syntax
对象会是null
,因为解析的时候,会被丢弃
方法
void InitializeUri(ParsingError err, UriKind uriKind, out UriFormatException e)
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()
方法 returns ParsingError.BadAuthority
和 uriKind == UriKind.RelativeOrAbsolute
由您指定。
PrivateParseMinimal()
方法查找以下任何字符序列:“//”、“\”、“/\”、“/”。由于您的输入字符串中没有这样的序列,因此将返回 ParsingError.BadAuthority
代码。
我遇到了一个有趣的情况,当它应该 return false
.
Uri.TryCreate
方法中得到了 NRE
您可以重现如下问题:
Uri url;
if (Uri.TryCreate("http:Ç", UriKind.RelativeOrAbsolute, out url))
{
Console.WriteLine("success");
}
我猜它在解析过程中失败了,但是当我尝试 "http:A"
时,它 returns true
并将其解析为相对 url。即使解析失败,据我所知,它也应该只是 return false
,这可能是什么问题?这似乎是实现中的一个错误,因为文档没有提及此方法的任何异常。
错误发生在 .NET 4.6.1 而不是 4.0
这是 .NET 框架中的错误。您可以在 MicrosoftConnect 上开票。
这个方法会抛出异常
void Systen.Uri.CreateUriInfo(System.Uri.Flags cF)
在第 2290 行(检查 reference source)执行以下语句:
// This is NOT an ImplicitFile uri
idx = (ushort)m_Syntax.SchemeName.Length;
此时,m_Syntax
对象会是null
,因为解析的时候,会被丢弃
方法
void InitializeUri(ParsingError err, UriKind uriKind, out UriFormatException e)
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()
方法 returns ParsingError.BadAuthority
和 uriKind == UriKind.RelativeOrAbsolute
由您指定。
PrivateParseMinimal()
方法查找以下任何字符序列:“//”、“\”、“/\”、“/”。由于您的输入字符串中没有这样的序列,因此将返回 ParsingError.BadAuthority
代码。