2016-09-09 27 views
0

我有加密一个字符串,它看起来像这样HttpUtility.UrlEncode不编码的字符,如+

Pfx32q+xLq4R+VocXy4IC8aQNdmFqdA284THap54Bl4= 

在加密这个字符串我们称之为HttpUtility.UrlEncode("Pfx32q+xLq4R+VocXy4IC8aQNdmFqdA284THap54Bl4=")经过加密的字符串作为参数,它返回一个值

Pfx32q%2BxLq4R%2BVocXy4IC8aQNdmFqdA284THap54Bl4%3D 

其中+是2%等替代等我开发的系统,但是当同样的代码是一个生产服务器加上没有得到编码上运行,而不是它仍然是+。

我们无法指出究竟是什么导致了这一点。有没有一个场景或一个案例,在调用HttpUtility.UrlEncode方法时,+这样的字符不会被编码?

+0

'+'也是URL的有效字符是它不被这里所编码的原因是[基础URI](https://tools.ietf.org/html/rfc3986)定义 – Webruster

+0

是你在开发盒和服务器上运行相同的.NET版本?服务器可能运行单声道? .NET 4.0及以上版本的Microsoft源代码肯定会转义'+'字符。这里请参阅'IsUrlSafeChar' http://referencesource.microsoft.com/#System/net/System/Net/WebUtility.cs尽管有RFC规则,注释中明确提到了“+”作为转义。 – Baldrick

+2

URI *路径*和*数据*以不同的方式编码。您应该使用EscapeDataString作为数据。您还应该确保在服务器和计算机上使用相同的.NET版本,并将其升级。 –

回答

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); 
    } 
+0

这是一种解决方法,但至少可以工作。应该没有必要,但是,嘿。 – Baldrick