如何使 Uri.EscapeDataString 符合 RFC 3986

2024-01-06

Uri 类默认为 RFC 2396。对于 OpenID 和 OAuth,我需要与 RFC 3986 一致的 Uri 转义。

来自System.Uri 类文档 http://msdn.microsoft.com/en-us/library/system.uri.aspx:

默认情况下,URI 中的任何保留字符都会根据 RFC 2396 进行转义。如果启用国际资源标识符或国际域名解析,则此行为会发生变化,在这种情况下,URI 中的保留字符会根据 RFC 3986 和 RFC 3987 进行转义。

该文档还指出,激活此 IRI 模式以及 RFC 3986 行为意味着将 uri 部分元素添加到 machine.config 并将其添加到您的 app/web.config 文件中:

<configuration>
  <uri>
  <idn enabled="All" />
  <iriParsing enabled="true" />
  </uri>
</configuration>

但无论这是否存在于 .config 文件中,我都会在 .NET 3.5 SP1 应用程序中得到相同的(非 3986)转义行为。我还需要做什么才能获得Uri.EscapeDataString使用 RFC 3986 规则?(具体来说,转义 RFC 中定义的保留字符)


由于无法让 Uri.EscapeDataString 采取 RFC 3986 行为,我编写了自己的符合 RFC 3986 的转义方法。它利用 Uri.EscapeDataString,然后将转义“升级”为 RFC 3986 合规性。

/// <summary>
/// The set of characters that are unreserved in RFC 2396 but are NOT unreserved in RFC 3986.
/// </summary>
private static readonly string[] UriRfc3986CharsToEscape = new[] { "!", "*", "'", "(", ")" };

/// <summary>
/// Escapes a string according to the URI data string rules given in RFC 3986.
/// </summary>
/// <param name="value">The value to escape.</param>
/// <returns>The escaped value.</returns>
/// <remarks>
/// The <see cref="Uri.EscapeDataString"/> method is <i>supposed</i> to take on
/// RFC 3986 behavior if certain elements are present in a .config file.  Even if this
/// actually worked (which in my experiments it <i>doesn't</i>), we can't rely on every
/// host actually having this configuration element present.
/// </remarks>
internal static string EscapeUriDataStringRfc3986(string value) {
    // Start with RFC 2396 escaping by calling the .NET method to do the work.
    // This MAY sometimes exhibit RFC 3986 behavior (according to the documentation).
    // If it does, the escaping we do that follows it will be a no-op since the
    // characters we search for to replace can't possibly exist in the string.
    StringBuilder escaped = new StringBuilder(Uri.EscapeDataString(value));

    // Upgrade the escaping to RFC 3986, if necessary.
    for (int i = 0; i < UriRfc3986CharsToEscape.Length; i++) {
        escaped.Replace(UriRfc3986CharsToEscape[i], Uri.HexEscape(UriRfc3986CharsToEscape[i][0]));
    }

    // Return the fully-RFC3986-escaped string.
    return escaped.ToString();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 Uri.EscapeDataString 符合 RFC 3986 的相关文章

随机推荐

  • PackageInfo versionCode 和 versionName 在手机上为 null,但可以在模拟器上使用

    我正在构建一个不会通过市场的私人应用程序 因此 我需要拉取当前版本应用程序 而不是平台 信息并与服务器检查是否有更新 它在模拟器上运行得很好 但是当我在 Droid X 上安装签名的 APK 时 它返回 null 这是代码 PackageI
  • Cocos2D 2.0 - 无数的 OpenGL 错误

    我正在将 Cocos2D 项目转换为 2 0 我使用Cocos2D 2 0模板 没有物理的简单模板 创建了一个空白项目 并将所有文件从旧项目转移到空白项目 我也将其转换为 ARC 我编译并没有看到任何错误 我运行该应用程序 它似乎运行正常
  • Thymeleaf:添加现有值而不是替换它们

    有没有办法告诉Thymeleaf将参数添加到标签而不是覆盖它们 Example div class a 应该导致 div class a b or div class a c Regards 另一种方法是 th attr class a x
  • Pandas to_datetime 不适用于空值

    是的 我会尽可能说清楚 这是我的数据框base varlist2 completion date latest completion date original customer birth date 1 0 07 10 2004 17 0
  • 将我的ApplicationsDbContext 与IdentityDbContext 结合使用MVC 5 没有定义键

    我将现有的 DBContext 与 MVC 5 中的新 IdentityDbContext 组合起来 我设法组合了这两个上下文 但是当我运行应用程序并创建模型时 出现以下错误消息 Context IdentityUserLogin Enti
  • 如何正确处理和保留系统关闭(和 SIGTERM)以完成 Python 中的工作?

    基本需求 我有一个 Python 守护进程 它通过 os system 调用另一个程序 我的愿望是能够正确处理系统关闭或SIGTERM 以便让被调用的程序返回然后退出 我已经尝试过的 我尝试过使用信号的方法 import signal ti
  • 如何调整 NumericVector 的大小?

    如何在 Rcpp 中调整大小NumericVector 当我使用push back为此 程序会变慢 但没有 resize or reserve 功能 当我已经有一个NumericVector有了所需的大小 我可以使用复制构造函数来获取正确的
  • CreateProcess 如何定位可执行文件?

    根据文档 创建进程 http msdn microsoft com en us library ms682425 28v vs 85 29 aspx可以传递可执行文件名称 作为第一个参数 或命令行作为第二个参数 从中 将提取可执行文件名称
  • Python 中的 Perl 兼容正则表达式 (PCRE)

    我必须在 Python 中解析一些基于 PCRE 的字符串 但我不知道该怎么做 我想要解析的字符串如下所示 match mysql m 0 0 0 n 4 w 0 0 s p MySQL i 1 在这个例子中 我必须获得这些不同的项目 m
  • 如何在c#中截断文件?

    我正在使用 Trace Writeln 函数将 C 程序完成的操作写入文件中 但文件变得太大 当这个文件增长到1MB时如何截断它 TextWriterTraceListener traceListener new TextWriterTra
  • 比较:reCaptcha 安全首选项

    比较 reCaptcha 安全首选项 任何人都可以向我指出文档 在其中我可以看到 对用户来说最简单 最安全 和 在 之间 之间的差异吗 谢谢 可用性和安全性之间始终存在斗争 人机交互讲师南江说道 https www wired co uk
  • 如何使用 Go 部分解析 JSON?

    我有以下 json app name name of app version 1 items type type of item inputs input1 value1 The items 0 inputs改变基于items 0 type
  • 使用条件语句从 pandas df 列中减去标量给出 ValueError: The true value of a Series is ambigacy

    我正在尝试执行 if df trades loc CASH 0 df trades loc CASH commission 然后我得到了错误 df trades loc CASH 是一列浮点数 我想减去标量commission从该列中的每个
  • 隐藏 Firefox 附加组件中的位置栏

    在我的附加组件中 我有一个在安装 更新时显示的 HTML 页面 Firefox 显然显示了页面的 chrome URI 我试图找出如何防止这种情况发生 只是出于美观原因 请注意 我知道某些附加组件能够隐藏某些选项卡 页面上的位置栏 它们是如
  • 是否可以在 VSCode 中使编辑器全屏拆分?

    我希望有能力制作多个之一split编辑器窗口全屏 我通常有两个带有代码的垂直分割窗口 这将很有用全屏缩放没有资源管理器终端和所有其他栏 只需代码 最初我有以下内容 但我想配置一个快捷方式使活动窗口全屏显示 如下所示 就像F11一样 关闭资源
  • 如何禁用表单提交按钮“a là Ruby on Rails Way”?

    我正在使用 Ruby on Rails 3 我想disable and 切换 CSS 类 of a form submit 当表单被 AJAX 提交时 直到 AJAX HTTP 请求完成 我正在使用 JavaScript 的默认 jQuer
  • R 从关注者列表中查找对用户推文的所有回复

    我试图找出用户对所有给定推文的回复数量 这不能直接从 Twitter 的 API 获得 我决定只关注用户关注者的回复 以帮助提炼生成的数据并作为一个很好的近似值 我相信对推文的大部分回复将直接来自该用户关注者 我相信我已经取得了很大的进步
  • Python 2.7.9 Mac OS 10.10.3 消息“setCanCycle:已弃用。请改用 setCollectionBehavior”

    这是我的第一条消息 我希望你能帮助我解决我的问题 当我启动 python 脚本时 我收到以下消息 2015 06 10 23 15 44 146 python 1044 19431 setCanCycle 已弃用 请改用 setCollec
  • 需要数据库结构建议

    我目前正在开发一个包含产品目录的网站 我对数据库设计有点陌生 所以我正在寻找有关如何最好地做到这一点的建议 我熟悉关系数据库设计 所以我理解 多对多 或 一对多 等 在大学学过很好的数据库课程 以下是一个项目可能被分类为的示例 Propel
  • 如何使 Uri.EscapeDataString 符合 RFC 3986

    Uri 类默认为 RFC 2396 对于 OpenID 和 OAuth 我需要与 RFC 3986 一致的 Uri 转义 来自System Uri 类文档 http msdn microsoft com en us library syst