9

首先,一些快速的背景知识...作为与第三方供应商集成的一部分,我有一个 C# .Net Web 应用程序,它接收一个 URL,其中包含查询字符串中的一堆信息。该 URL 使用 MD5 哈希和共享密钥进行签名。基本上,我拉入查询字符串,删除它们的哈希,对剩余的查询字符串执行我自己的哈希,并确保我的与提供的匹配。

我正在通过以下方式检索 Uri ......

Uri uriFromVendor = new Uri(Request.Url.ToString());
string queryFromVendor = uriFromVendor.Query.Substring(1); //Substring to remove question mark

我的问题源于包含特殊字符(如变音符号(ü))的查询字符串。供应商正在计算基于 RFC 2396 表示的哈希值,即%FC. 我的 C# .Net 应用程序正在根据 RFC 3986 表示计算它的哈希值,即%C3%BC. 不用说,我们的哈希值不匹配,我抛出了我的错误。

奇怪的是,.Net 中 Uri 类的文档说它应该遵循 RFC 2396,除非另外设置为 RFC 3986,但我的web.config文件中没有他们说这种行为所需的条目。

如何强制 Uri 构造函数使用 RFC 2396 约定?

如果做不到这一点,是否有一种简单的方法可以将 RFC 3986 八位字节对转换为 RFC 2396 八位字节?

4

3 回答 3

3

与您的问题无关,但是您为什么要在这里创建一个新的 Uri ?你可以这样做string queryFromVendor = Request.Url.Query.Substring(1);– 阁楼

+1 阁楼!我回去尝试删除我正在创建的无关 Uri,突然间,字符串的变音符号编码为 UTF-8 而不是 UTF-16。

起初,我认为这行不通。在某个地方,我曾尝试使用 检索 url Request.QueryString,但这导致变音符号作为%ufffd� 字符出现。为了换个角度,我尝试了 atticae 的建议,它奏效了。

我很确定答案与我在这里阅读的内容有关。

C# 在其所有字符串中使用 UTF-16,并在处理流和文件时使用工具进行编码,这些流和文件将我们带到...

ASP.NET 默认使用 UTF-8,很难想到它不是一个好选择的时候......

我的问题源于这里...

Uri uriFromVendor = new Uri(Request.Url.ToString());

通过获取Request.Urluri 并创建另一个 uri,它被编码为 C# 标准 UTF-16。通过使用原始 uri,它保留在 .Net 标准 UTF-8 中。

感谢大家的帮助。

于 2011-08-12T16:52:12.843 回答
1

我想知道这是否有点像红鲱鱼:

我这样说是因为 FC 是带有变音符号的 u 的 UTF16 表示;C2BC 是 UTF8 表示。

我想知道将源数据转换为普通 .Net 字符串的 System.Text.Encoding 方法之一是否有帮助。

这个问题也可能很有趣: Encode and Decode rfc2396 URLs

于 2011-08-12T00:18:33.387 回答
1

我不知道 Uri 构造函数的标准编码,但如果其他一切都失败了,你总是可以自己解码 URL 并以你喜欢的任何编码对其进行编码。

HttpUtility -Class有一个UrlDecode()andUrlEncode()方法,它允许您将System.Text.Encoding指定为第二个参数。

例如:

string decodedQueryString = HttpUtility.UrlDecode(Request.Url.Query.Substring(1));
string encodedQueryString = HttpUtility.UrlEncode(decodedQueryString, System.Text.Encoding.GetEncoding("utf-16"));
// calc hash here
于 2011-08-12T00:34:23.057 回答