HttpServerUtility.UrlTokenDecode“有时”失败(Base-64 char数组的长度无效。)

我们有一个样式表的IHttpHandler ,并为页面添加一个标签,如下所示:

 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) ... 

什么会导致这种现象?

备注:

  • 生成的URL <1500,因此低于任何已知的URL限制(例如IE:2083)
  • 似乎独立于用户代理(我们对IE6,7,8,FF和Chrome有这些例外)
  • 我们(未经证实的)怀疑包括AntiVirus产品,HTTP代理,浏览器插件
  • 发现这个与远程相关的问题,但它是关于一个viewstate问题

我们有类似的问题,所以我们避免使用UrlTokenEncode,原因是base64有时将尾随字符填充为’==’等等,所以它们不能正确地在url中传输。 我认为.NET中存在一个错误,但我们将其更改为关注并开始工作。

我们这样做了,它始终有效。

 url += "&d=" + HttpServerUtility.UrlEncode( Convert.ToBase64String( ... )) 

在接收方,我们只使用

 data = Convert.FromBase64String( Request.QueryString["d"] ) 

我们不需要使用UrlDecode,因为查询字符串对象已经以解码格式存储信息。

UrlTokenDecodeUrlTokenEncode实际上并不对UrlTokenEncode进行解码/编码,但无论如何都可以使用它来添加一些内容。 此外,还有一些替代方案可能会或可能不会更好。

根据RFC4648,请参阅C#:base64url