【问题标题】:HttpUtility.UrlEncode does not encode characters like +HttpUtility.UrlEncode 不编码像 + 这样的字符
【发布时间】:2016-09-09 12:22:16
【问题描述】:

我有一个加密的字符串,看起来像这样

Pfx32q+xLq4R+VocXy4IC8aQNdmFqdA284THap54Bl4=

在加密这个字符串时,我们调用HttpUtility.UrlEncode("Pfx32q+xLq4R+VocXy4IC8aQNdmFqdA284THap54Bl4="),将加密的字符串作为参数传递,这会返回一个值

Pfx32q%2BxLq4R%2BVocXy4IC8aQNdmFqdA284THap54Bl4%3D

+ 中的位置在我的开发系统上被替换为 %2 等等,但是当在生产服务器上运行相同的代码时,加号不会被编码,而是保持为 + 。

我们无法指出真正造成这种情况的原因。是否存在在调用 HttpUtility.UrlEncode 方法时不会对 + 等字符进行编码的情况或情况?

【问题讨论】:

  • + 也是 url 的有效字符,这就是它未在此处编码的原因是 base URI 定义
  • 您是否在开发盒和服务器上运行相同的 .NET 版本?服务器是否可能运行 Mono? .NET 4.0 及更高版本的 Microsoft 源代码肯定会转义 + 字符。请参阅IsUrlSafeChar 此处referencesource.microsoft.com/#System/net/System/Net/… + 在注释中明确提及,尽管有 RFC 规则,但仍被转义。
  • URI pathsdata 以不同的方式编码。您应该将 EscapeDataString 用于数据。您还应该确保在服务器和机器上使用相同的 .NET 版本,升级落后者。

标签: c# asp.net httprequest urlencode url-encoding


【解决方案1】:

遇到了同样的问题。先将加密后的字符串转Base64,然后UrlEncoded。

    string urlOut = HttpUtility.UrlEncode(Base64Encode("Pfx32q+xLq4R+VocXy4IC8aQNdmFqdA284THap54Bl4="));

    string urlIn = Base64Decode(HttpUtility.UrlDecode(urlOut));

    public static string Base64Encode(string plainText)
    {
        var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
        return Convert.ToBase64String(plainTextBytes);
    }

    public static string Base64Decode(string base64EncodedData)
    {
        var base64EncodedBytes = Convert.FromBase64String(base64EncodedData);
        return Encoding.UTF8.GetString(base64EncodedBytes);
    }

【讨论】:

  • 这是一种解决方法,但至少它有效。不应该是必要的,但是嘿。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 2011-04-09
  • 2013-03-09
  • 2021-06-17
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
相关资源
最近更新 更多