【发布时间】:2018-08-07 03:37:01
【问题描述】:
我创建了一个基于System.Net.HttpListener 的WebDav 服务器,通过虚拟文件系统提供对存储在数据库中的(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