首先,简单介绍一下背景知识...作为与第三方供应商集成的一部分,我有一个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我的问题源于包含特殊字符的查询字符串,如元音(ü)。供应商正在基于RFC2396表示(即%FC )来计算他们的散列。我的C# .Net应用程序正在根据RFC3986表示(即%C3%BC )来计算它的哈希值。不用说,我们的散列不匹配,因此我抛出了错误。
奇怪的是,documentation for the Uri class in .Net说它应该遵循RFC2396,除非另外设置为RFC3986,但是我的web.config文件中没有他们所说的此行为所需的条目。
如何强制Uri构造函数使用RFC2396约定?
如果做不到这一点,有没有简单的方法将RFC 3986二进制八位数对转换为RFC 2396二进制八位数?
发布于 2011-08-13 00:52:13
与你的问题无关,但是为什么你要在这里创建一个新的Uri?你可以只做
string queryFromVendor = Request.Url.Query.Substring(1);- atticae
+1代表atticae!我回去尝试删除我正在创建的外部Uri,突然,字符串将元音编码为UTF-8而不是UTF-16。
一开始,我认为这是行不通的。在此过程中,我曾尝试使用Request.QueryString检索url,但这导致元音变为%ufffd,即�字符。为了有一个新的视角,我尝试了atticae的建议,它起作用了。
我很确定答案一定和something I read here有关。
C#在其所有字符串中使用UTF-16,在处理流和文件时使用工具进行编码,这些流和文件将我们带到...
默认情况下,ASP.NET使用UTF8,很难想象它不是一个好的选择……
我的问题源于这里。
Uri uriFromVendor = new Uri(Request.Url.ToString());通过获取UTF并创建另一个uri,它被编码为C#标准Request.Url -16。通过使用原始uri,它保持在.Net标准UTF-8中。
感谢大家的帮助。
发布于 2011-08-12 08:18:33
我想知道这是不是有点转移视线:
之所以这样说,是因为FC是u的UTF16表示形式,而C2BC是UTF8表示形式。
我想知道将源数据转换为普通.Net字符串的某个System.Text.Encoding方法是否会有所帮助。
这个问题可能也很有趣:Encode and Decode rfc2396 URLs
发布于 2011-08-12 08:34:23
我不知道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 herehttps://stackoverflow.com/questions/7034209
复制相似问题