URL 尾随句点被 HttpListener 吞没

URL trailing period is swallowed by HttpListener

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

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

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

例如变成

https://www.something.com/xyz

它本身就够糟糕的了,但它可以通过同时检查时间延长的文件夹名称来解决。但是问题比这更糟糕,因为 System.Uri class 不仅会破坏路径的最后一段,还会破坏所有路径,所以

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

我没有办法处理。

到目前为止我尝试了什么...

在类似 2008 年的帖子中,我发现了以下引用

This is a known bug. This was actually discussed on these forums not too long ago. An MSFT employee acknowledged the problem and stated that it will be considered for a future release.

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

您使用的是哪个版本的 .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());
    }
}