首先,一些快速背景...作为与第三方供应商集成的一部分,我有一个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
。毋庸置疑,我们的哈希值不匹配,我抛出错误。
奇怪的是,documentation for the Uri class in .Net表示它应该遵循RFC 2396,除非另有设置为RFC 3986,但我没有在我的web.config
文件中提供他们认为此行为所需的条目。
如何强制Uri构造函数使用RFC 2396约定?
如果失败了,是否有一种简单的方法可以将RFC 3986八位字节对转换为RFC 2396八位字节?
答案 0 :(得分:2)
与您的问题无关,但为什么要在这里创建一个新的Uri?你可以做
string queryFromVendor = Request.Url.Query.Substring(1)
; - atticae
+1 for atticae!我回去尝试删除我正在创建的无关的Uri,突然,字符串将变音符号编码为UTF-8而不是UTF-16。
起初,我认为这不会起作用。在某个地方,我曾尝试使用Request.QueryString
检索网址,但这导致变音符号以%ufffd
的形式出现,这是 字符。为了获得一个全新的视角,我尝试了atticae的建议并且有效。
我很确定答案与something I read here有关。
C#在其所有字符串中使用UTF-16,在处理将我们带入的流和文件时使用工具进行编码...
ASP.NET默认使用UTF-8,很难想象它不是一个好的选择......
我的问题源于此......
Uri uriFromVendor = new Uri(Request.Url.ToString());
通过获取Request.Url
uri并创建另一个uri,它编码为C#标准UTF-16。通过使用原始的uri,它仍然保留在.Net标准UTF-8中。
感谢大家的帮助。
答案 1 :(得分:1)
我想知道这是不是一个红鲱鱼:
我这样说是因为FC是umlaut的u的UTF16表示; C2BC是UTF8的代表。
我想知道将源数据转换为普通.Net字符串的System.Text.Encoding方法之一是否有帮助。
这个问题也可能有趣:Encode and Decode rfc2396 URLs
答案 2 :(得分:1)
我不知道Uri构造函数的标准编码,但是如果其他一切都失败了,你总是可以自己解码URL并用你喜欢的任何编码对它进行编码。
HttpUtility-Class有一个UrlDecode()
和UrlEncode()
方法,可让您将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