我试图从Web API项目中删除对System.Web.dll
的依赖,但偶然发现了HttpServerUtility.UrlTokenEncode(byte[] input)
(及其相应的解码方法)的调用,我不会这样做。知道要替换什么以确保向后兼容性。文档说这个方法
使用64位数字将字节数组编码为等效的字符串表示,可用于在URL上传输。
我尝试用Convert.ToBase64String(byte[] input)
(及其相应的解码方法)代替,这在文档中非常类似地描述:
将8位无符号整数数组转换为以64位数编码的等效字符串表示形式。
然而,它们似乎并不完全等同;当使用Convert.FromBase64String(string input)
解码用HttpServerUtility
编码的字符串时,我得到一个异常陈述
输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符或填充字符中的非法字符。
这两个转换实用程序有什么区别?删除对System.Web.HttpServerUtility
的依赖的正确方法是什么?
有些用户认为这是this one的副本,但我不同意。这个问题是关于以网址安全的方式一般对字符串进行base-64编码,但我需要重现HttpServerUtility
的确切行为但没有对System.Web
的依赖。
答案 0 :(得分:14)
我在他们的单词和Used Source上使用了DGibbs。事实证明,HttpServerUtility
方法中发生了以下情况:
使用System.Convert
将输入转换为Base64。
将+
替换为-
,将/
替换为_
。示例:Foo+bar/===
变为Foo-bar_===
。
在字符串末尾替换任意数量的=
,并用一个整数表示它们的数量。示例:Foo-bar_===
变为Foo-bar_3
。
将字符串末尾的数字替换为相同数量的=
符号。示例:Foo-bar_3
变为Foo-bar_===
。
将-
替换为+
,将_
替换为/
。示例:Foo-bar_===
变为Foo+bar/===
。
使用System.Convert
解码来自Base64的预处理输入。
答案 1 :(得分:3)
HttpServerUtility.UrlTokenEncode(byte[] input)
将编码一个URL安全的Base64字符串。在Base64 +中,/和=字符有效,但它们不是URL安全的,此方法将替换这些字符,而Convert.ToBase64String(byte[] input)
则不会。您可以删除引用并自己完成。
通常,'+'替换为' - ','/'替换为'_'padding'='刚刚删除。
此处接受的答案提供了一个代码示例:How to achieve Base64 URL safe encoding in C#?