c# - Uri规范化压缩FTP方案

标签 c# .net ftp uri canonicalization

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);

应该导致:

AbsoluteUri: "ftp://myUrl/%2E%2E/%2E%2E"

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

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

AbsoluteUri: "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

最佳答案

与 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);
}

关于c# - Uri规范化压缩FTP方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33877535/

相关文章:

c# - Entity Framework 加载导航属性而不要求它们

javascript - 无法在 JavaScript 中访问模型的属性

.net - 为什么 F# 的 printfn 可以处理文字字符串,但不能处理字符串类型的值?

ftp - Solaris 10 上 ftp rstatus 的等效 ftp 命令?

Groovy 与 Grape 和 AntBuilder 类加载器问题

c# - 每次请求都会增加 ASP.NET Core 内存,而 GC 不会释放它

c# - DispatcherTimer 在控制台中不起作用

c# - 需要代理身份验证(Forefront TMG 需要授权才能完成请求。拒绝访问 Web 代理筛选器。)

.net - YAML 中的单个感叹号有什么作用?

git - GIT 是否支持推送到 ftp 服务器?