c# - 为什么 Uri.TryCreate 在 url 包含土耳其字符时抛出 NRE?

标签 c# .net .net-4.0 .net-core .net-4.6.1

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

您可以重现问题,如下所示:

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

我猜它在解析过程中失败了,但是当我尝试 "http:A" 时,它返回 true 并将其解析为相对 url。即使解析失败,据我所知,它也应该返回 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)

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

PrivateParseMinimal() 方法根据您的规范返回 ParsingError.BadAuthorityuriKind == UriKind.RelativeOrAbsolute

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

关于c# - 为什么 Uri.TryCreate 在 url 包含土耳其字符时抛出 NRE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37881863/

相关文章:

c# - Automapper 中的 ReverseMap 使用备用命名约定

c# - 如果我在 C# 中重载添加和删除,为什么我不能引发或调用事件

c# - jquery datepicker 没有弹出?

c# - Web API 性能?

c# - 如何从 XML 文档中提取数据

c# - .net 窗口顺序

c# - 更新了 web api 的验证示例

c# - 将 BeginTransaction 与 Dapper.IDbConnection 一起使用的正确方法

c# - TextBox 更新后的 KeyUp 事件

c# - 从 EF 模型生成 DDL 和 POCO 类的工具