1

我们有一个IHttpHandlerfor 样式表并向<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,我们查询字符串参数如下:UrlTokenDecoded

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 有这些例外)
  • 我们(未经证实的)怀疑包括防病毒产品、HTTP 代理、浏览器插件
  • 发现这个远程相关的问题,但它是关于视图状态问题
4

2 回答 2

0

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

我们这样做了,它总是有效的。

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

在接收方,我们只使用

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

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

于 2009-09-08T09:45:51.723 回答
0

UrlTokenDecode并且UrlTokenEncode实际上并不解码/编码base64url,但无论如何都可以通过一些添加来使用它。此外,还有可能更好也可能不会更好的替代方案。

请参阅C#:根据 RFC4648 的 base64url

于 2018-07-12T08:30:27.520 回答