首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.Net Uri编码RFC2396与RFC3986

.Net Uri编码RFC2396与RFC3986
EN

Stack Overflow用户
提问于 2011-08-12 07:44:50
回答 3查看 4K关注 0票数 8

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

我将通过以下方式检索Uri ...

代码语言:javascript
复制
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二进制八位数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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,很难想象它不是一个好的选择……

我的问题源于这里。

代码语言:javascript
复制
Uri uriFromVendor = new Uri(Request.Url.ToString());

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

感谢大家的帮助。

票数 2
EN

Stack Overflow用户

发布于 2011-08-12 08:18:33

我想知道这是不是有点转移视线:

之所以这样说,是因为FC是u的UTF16表示形式,而C2BC是UTF8表示形式。

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

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

票数 1
EN

Stack Overflow用户

发布于 2011-08-12 08:34:23

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

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

例如:

代码语言:javascript
复制
string decodedQueryString = HttpUtility.UrlDecode(Request.Url.Query.Substring(1));
string encodedQueryString = HttpUtility.UrlEncode(decodedQueryString, System.Text.Encoding.GetEncoding("utf-16"));
// calc hash here
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7034209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档