2

https://msdn.microsoft.com/en-us/library/system.uri(v=vs.110).aspx

根据上面的参考,当指定一个 ftp url 时,uri 类不应该压缩 url。例如,以下 ftp 网址:

Uri uri = new Uri("ftp://myUrl/%2E%2E/%2E%2E");
Console.WriteLine(uri.AbsoluteUri);
Console.WriteLine(uri.PathAndQuery);

应该导致:

绝对Uri:“ ftp://myUrl/%2E%2E/%2E%2E

路径与查询:“ /%2E%2E/%2E%2E

但是,这不是我所看到的。当我使用 .NET framework 4.5.1 执行上述代码时,我看到:

绝对Uri:“ ftp://myUrl/

路径与查询:“ /

此外,添加到我的 app.config 似乎没有效果:

<uri> 
    <schemeSettings>
        <add name="ftp" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
    </schemeSettings>
</uri>

由于有几个人能够重新创建该问题,因此我与 Microsoft 创建了一个错误报告。随意点赞:

https://connect.microsoft.com/VisualStudio/feedback/details/2046491/uri-canonicalization-compacting-ftp-scheme

4

1 回答 1

0

与 Microsoft 创建了错误报告: https ://connect.microsoft.com/VisualStudio/Feedback/Details/2046491

目前,我正在通过(通过反射进行黑客攻击)从 Uri 类中的 UriParser 对象中删除两个标志来解决这个问题:

当我的应用程序实例化时,我调用了下面的方法一次。实例化后,每个 FTP Uri 对象在解析时都会使用新的标志组合。

// CompressPath = 0x800000, // For an authority based Uri remove/compress /./ /../ in the path
// UnEscapeDotsAndSlashes = 0x2000000, // additionally unescape dots and slashes before doing path compression

/// <summary>
/// http://referencesource.microsoft.com/#System/net/System/_UriSyntax.cs
/// </summary>
public static void LeaveDotsAndSlashesEscaped() {
    Uri uri = new Uri("ftp://myUrl/%2E%2E/%2E%2E/");
    if (uri == null) {
        throw new ArgumentNullException("uri");
    }
    FieldInfo fieldInfo = uri.GetType().GetField("m_Syntax", BindingFlags.Instance | BindingFlags.NonPublic);
    if (fieldInfo == null) {
        throw new MissingFieldException("'m_Syntax' field not found");
    }
    object uriParser = fieldInfo.GetValue(uri);
    fieldInfo = typeof(UriParser).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic);
    if (fieldInfo == null) {
        throw new MissingFieldException("'m_Flags' field not found");
    }
    object uriSyntaxFlags = fieldInfo.GetValue(uriParser);
    // Clear the flags that we don't want
    uriSyntaxFlags = (int)uriSyntaxFlags & ~0x2000000 & ~0x800000;
    fieldInfo.SetValue(uriParser, uriSyntaxFlags);
}
于 2015-11-24T16:37:05.383 回答