我们有一个IHttpHandler
样式表,并在页面中添加<link/>
标记,如下所示:
HtmlGenericControl link = new HtmlGenericControl("link");
link.Attributes.Add("rel", "stylesheet");
link.Attributes.Add("href", "stylesheet.axd?d=" +
HttpServerUtility.UrlTokenEncode(token));
head.Controls.Add(link);
在stylesheet.axd
处理程序中,我们UrlTokenDecode
d
查询字符串参数如下:
var token = HttpServerUtility.UrlTokenDecode(Request.QueryString["d"]);
这大部分时间都有效,但我们偶尔会在日志中找到以下两个例外之一:
[FormatException: Invalid character in a Base-64 string.]
System.Convert.FromBase64CharArray(Char[] inArray, Int32 offset, Int32 length)
System.Web.HttpServerUtility.UrlTokenDecode(String input)
...
[FormatException: Invalid length for a Base-64 char array.]
System.Convert.FromBase64CharArray(Char[] inArray, Int32 offset, Int32 length)
System.Web.HttpServerUtility.UrlTokenDecode(String input)
System.Web.HttpServerUtilityWrapper.UrlTokenDecode(String input)
...
任何想法会导致这种现象?
说明:
答案 0 :(得分:0)
我们遇到了类似的问题,因此我们避免使用UrlTokenEncode,原因是base64有时会将尾随字符填充为“==”等等,因此它们无法正确传输到url中。我认为.NET中存在一个错误,但我们将其更改为关注并开始工作。
我们这样做了,它始终有效。
url += "&d=" + HttpServerUtility.UrlEncode( Convert.ToBase64String( ... ))
在接收方,我们只使用
data = Convert.FromBase64String( Request.QueryString["d"] )
我们不需要使用UrlDecode,因为查询字符串对象已经以解码格式存储信息。
答案 1 :(得分:0)
UrlTokenDecode
和UrlTokenEncode
实际上并没有对base64url进行解码/编码,但是无论如何都可以使用它进行一些补充。另外,有些替代方案可能会更好,也可能不会更好。