【问题标题】:Resolving relative URI references with fragments in C#在 C# 中使用片段解析相对 URI 引用
【发布时间】:2020-11-16 02:51:43
【问题描述】:

我正在尝试处理包含片段的相对引用。根据RFC 3986,这似乎是有效的:

relative-ref  = relative-part [ "?" query ] [ "#" fragment ]

但是,每次我尝试在 C# 中创建一个包含片段的 URI 时,片段字符都会被转义并包含在路径组件中:

using System;

namespace UriResolution
{
    public class Program
    {
        public static void Main()
        {
            var baseURI = new Uri(
                "/home/user/project-root/Base.item",
                UriKind.Absolute);
            var relative = new Uri("Relative.item#Fragment", UriKind.Relative);
            var directResolved = new Uri(baseURI, "Relative.item#Fragment");
            var joined = new Uri(baseURI, relative);
            Console.WriteLine($"Base: {baseURI}, Relative: {relative}");
            Console.WriteLine($"DirectResolved: {directResolved}, Fragment: {directResolved.Fragment}");
            Console.WriteLine($"Joined: {joined}, Fragment: {joined.Fragment}");
        }
    }
}

产量

Base: file:///home/user/project-root/Base.item, Relative: Relative.item#Fragment
DirectResolved: file:///home/user/project-root/Relative.item%23Fragment, Fragment: 
Joined: file:///home/user/project-root/Relative.item%23Fragment, Fragment: 

我应该使用其他一些标准库功能吗?是否有一些第三方库被认为是事实上的大炮?

【问题讨论】:

    标签: c# uri


    【解决方案1】:

    这似乎是从非 URI 文件路径构造的 URI 的限制。将 file:// 添加到基本 URI 使用的路径将允许按预期解析内容:

    using System;
    
    namespace UriResolution
    {
        public class Program
        {
            public static void Main()
            {
                var baseURI = new Uri(
                    "file:///home/user/project-root/Base.item",
                    UriKind.Absolute);
                var relative = new Uri("Relative.item#Fragment", UriKind.Relative);
                var directResolved = new Uri(baseURI, "Relative.item#Fragment");
                var joined = new Uri(baseURI, relative);
                Console.WriteLine($"Base: {baseURI}, Relative: {relative}");
                Console.WriteLine($"DirectResolved: {directResolved}, Fragment: {directResolved.Fragment}");
                Console.WriteLine($"Joined: {joined}, Fragment: {joined.Fragment}");
            }
        }
    }
    

    产量

    Base: file:///home/user/project-root/Base.item, Relative: Relative.item#Fragment
    DirectResolved: file:///home/user/project-root/Relative.item#Fragment, Fragment: #Fragment
    Joined: file:///home/user/project-root/Relative.item#Fragment, Fragment: #Fragment
    

    【讨论】:

      猜你喜欢
      • 2020-09-24
      • 1970-01-01
      • 2021-12-19
      • 2012-09-13
      • 2023-03-09
      • 1970-01-01
      • 2014-10-16
      • 2012-01-20
      • 2013-01-16
      相关资源
      最近更新 更多