【问题标题】:URL trailing period is swallowed by HttpListenerURL 尾随句点被 HttpListener 吞下
【发布时间】:2018-08-07 03:37:01
【问题描述】:

我创建了一个基于System.Net.HttpListenerWebDav 服务器,通过虚拟文件系统提供对存储在数据库中的(n 个现有)文档库的访问。该组件的目的是提供对存储文档的文件级访问,这些文档可以在 Windows 下作为网络驱动器附加,因此使用不同的客户端是不可能的。

数据库将文档存储在类似文件系统的层次结构中,因此我将容器映射为 WebDav 集合(在客户端显示为文件夹),一切似乎都很好,直到我发现我的用户使用带有尾随句点的集合以他们的名义。请注意,这是一个已经生产了十多年的产品,所以引入新的命名约定是不可能的。由于 HttpListener 使用标准 C# System.Uri 类来提供请求 URL,并且该类会吞下 URL 的尾随句点。

https://www.something.com/xyz.

例如变成

https://www.something.com/xyz

这本身就够糟糕了,但也可以通过检查句点扩展文件夹名称来解决。但问题远不止于此,因为System.Uri 类不仅会破坏路径的最后一段,而且会破坏所有这些,所以

https://www.something.com/xyz./knm/xxx.doc

变成

https://www.something.com/xyz/knm/xxx.doc

https://www.something.com/xyz./knm/./qwe./xyz.doc

变成

https://www.something.com/xyz/knm/qwe/xyz.doc

我没有办法处理。

到目前为止我尝试过的...

  • 通过将句点替换为“%2E”来转义该句点不起作用,因为它不会在 Windows Explorer 和 Total Commander 等客户端中进行转义。
  • 在 PROPFIND href 节点中返回转义版本并在 dislpayname 节点中返回文字版本不起作用,因为大多数客户端都会忽略“显示名称”。
  • this answer 中描述的解决方法似乎不起作用。 (它什么也没做。同一个线程中的另一个答案提供了一种破解 System.Uri 类的某个实例的方法,但是由于该实例是由 HttpListener 创建的 - 或其底层机制之一 - 这确实没有帮帮我。)

在 2008 年的一个帖子中,我发现了以下引述

这是一个已知的错误。这实际上是不久前在这些论坛上讨论过的。一位 MSFT 员工承认了该问题,并表示将考虑在未来发布该问题。

任何人都可以为这个问题提供解决方法或实际解决方案吗?

【问题讨论】:

    标签: c# windows webdav explorer httplistener


    【解决方案1】:

    您使用的是哪个版本的 .NET Framework? 我创建了一个示例应用程序并使用包含点的字符串初始化了一个 System.URI。 .NET 4.0 删除了这些点,但任何更新的东西都将它们留在了里面。

    您可以使用更新版本的 .NET 吗?

    class Program
    {
        static void Main(string[] args)
        {
            var uri = new Uri("http://localhost:8080/one./two./three./my.doc");
    
            Console.WriteLine(uri.ToString());
        }
    }
    

    【讨论】:

    • 是的,我的目标框架是 .NET 4.0。遗憾的是,我还不能使用更新的,但我们计划在不久的将来更进一步。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多