System.Uri 类截断尾随“.”人物

发布于 2024-11-13 22:46:19 字数 262 浏览 0 评论 0原文

如果我从具有尾随句号 - '.' 的字符串创建一个 Uri 类实例,它们将从生成的 Uri 对象中被截断。

例如,在 C# 中:

Uri test = new Uri("http://server/folder.../");
test.PathAndQuery;

返回“/folder/”而不是“/folder.../”。

逃脱“。”与“%2E”没有帮助。

如何使 Uri 类保留尾随句点字符?

If I create a Uri class instance from string that has trailing full stops - '.', they are truncated from the resulting Uri object.

For example in C#:

Uri test = new Uri("http://server/folder.../");
test.PathAndQuery;

returns "/folder/" instead of "/folder.../".

Escaping "." with "%2E" did not help.

How do I make the Uri class to keep trailing period characters?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清醇 2024-11-20 22:46:19

您可以在调用代码之前使用反射。

MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (getSyntax != null && flagsField != null)
{
      foreach (string scheme in new[] { "http", "https" })
      {
          UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme });
          if (parser != null)
          {
              int flagsValue = (int)flagsField.GetValue(parser);
              // Clear the CanonicalizeAsFilePath attribute
              if ((flagsValue & 0x1000000) != 0)
                 flagsField.SetValue(parser, flagsValue & ~0x1000000);
           }
       }
}

Uri test = new Uri("http://server/folder.../");
Console.WriteLine(test.PathAndQuery);

此问题已提交至 Connect 和上面的解决方法被张贴在那里。

You can use reflection before your calling code.

MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (getSyntax != null && flagsField != null)
{
      foreach (string scheme in new[] { "http", "https" })
      {
          UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme });
          if (parser != null)
          {
              int flagsValue = (int)flagsField.GetValue(parser);
              // Clear the CanonicalizeAsFilePath attribute
              if ((flagsValue & 0x1000000) != 0)
                 flagsField.SetValue(parser, flagsValue & ~0x1000000);
           }
       }
}

Uri test = new Uri("http://server/folder.../");
Console.WriteLine(test.PathAndQuery);

This has been submitted to Connect and the workaround above was posted there.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文