.Net Uri编码RFC 2396与RFC 3986

时间:2011-08-11 23:44:50

标签: asp.net uri url-encoding rfc3986 rfc2396

首先,一些快速背景...作为与第三方供应商集成的一部分,我有一个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八位字节?

3 个答案:

答案 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