C# URI编码奇异性

C# URI编码奇异性,c#,C#,这与另一个有关。虽然并没有任何实际的答案,但这让我走上了这条道路,所以如果它有结果,我会接受他的答案 我正在用一些(相当复杂的)C#代码为BitTorrent跟踪器生成一个公告url 最终的结果是: http://208.106.250.207:8192/announce?info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C&peer_id=01234567890123456789&port=6881&uploaded=0&downloaded

这与另一个有关。虽然并没有任何实际的答案,但这让我走上了这条道路,所以如果它有结果,我会接受他的答案

我正在用一些(相当复杂的)C#代码为BitTorrent跟踪器生成一个公告url

最终的结果是:

http://208.106.250.207:8192/announce?info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C&peer_id=01234567890123456789&port=6881&uploaded=0&downloaded=0&left=0&compact=0&no_peer_id=0&event=started 如果我调试并取出req.RequestUri的字符串版本,我会得到:

http://208.106.250.207:8192/announce?info_hash=-Ê8ÁÉrDb­Lí´*iZ¸%25F%25C&peer_id=01234567890123456789&port=6881&uploaded=0&downloaded=0&left=0&compact=0&no_peer_id=0&event=started http://208.106.250.207:8192/announce?info_hash=-Ê8ÁrDbèLèiZ¸%25F%25C&peerèid=01234567890123456789&port=6881&upload=0&download=0&left=0&compact=0&noèpeerèid=0&event=started
我实际上无法告诉跟踪程序“在线”发送了什么,但看起来我在做一些关于URI的蠢事。有人知道什么吗?

你的评论是,你无法说出“在线”发送的内容,这让我想起了一个名为“”的实用程序,你可以使用它

它是一个web调试代理,因此它将充当所有web请求的中间人

通过这种方式,您可以将浏览器请求和基于代码的请求并排进行比较,并查看它们之间的差异


这是一个很棒的实用程序,在类似的事情上帮助了我很多次。

你评论说无法分辨“在线”发送的内容,这让我想起了一个名为“”的实用程序,你可以使用它

它是一个web调试代理,因此它将充当所有web请求的中间人

通过这种方式,您可以将浏览器请求和基于代码的请求并排进行比较,并查看它们之间的差异


这是一个非常棒的实用程序,在类似的事情上帮助了我很多次。

使用System.Uri中的.AbsoluteUri(作为Request.RequestUri的类型)来获取您的原始url,而不被“屏蔽”

这里的“问题”是.Net System.Uri类的工作方式(我在引号中称为“问题”,因为它实际上运行正常)

您的原始信息散列查询字符串是url编码字节的负载。当您使用Uri.ToString()检索Uri实例时,它会对这些字节进行有益的解码(通过执行url解码),并将这些字节(例如%CA)转换为各自的字符(在您的例子中为Ê,但这可能取决于您的本地代码页设置,因为这是一个“上半部分”ANSI字符,并且会根据代码页的不同而变化)

在内部,查询字符串实际上被正确存储;Uri类只是试图提供帮助

这段代码应该能更好地说明这一点:

 string myUrl = "http://208.106.250.207:8192/announce?info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C&peer_id=01234567890123456789&port=6881&uploaded=0&downloaded=0&left=0&compact=0&no_peer_id=0&event=started";

            Uri myUri = new Uri(myUrl);
            Console.WriteLine("ToString: " + myUri.ToString());
            Console.WriteLine("Query: " + myUri.Query);
            Console.WriteLine("AbsoluteUri: " + myUri.AbsoluteUri);

我猜,在网络上,一切都很好,这只是您如何从System.Uri检索url的一个工件。

使用System.Uri中的.AbsoluteUri(作为Request.RequestUri的类型)来获取您的原始url,而无需“munged”

这里的“问题”是.Net System.Uri类的工作方式(我在引号中称为“问题”,因为它实际上运行正常)

您的原始信息散列查询字符串是url编码字节的负载。当您使用Uri.ToString()检索Uri实例时,它会对这些字节进行有益的解码(通过执行url解码),并将这些字节(例如%CA)转换为各自的字符(在您的例子中为Ê,但这可能取决于您的本地代码页设置,因为这是一个“上半部分”ANSI字符,并且会根据代码页的不同而变化)

在内部,查询字符串实际上被正确存储;Uri类只是试图提供帮助

这段代码应该能更好地说明这一点:

 string myUrl = "http://208.106.250.207:8192/announce?info_hash=-%CA8%C1%C9rDb%ADL%ED%B4%2A%15i%80Z%B8%F%C&peer_id=01234567890123456789&port=6881&uploaded=0&downloaded=0&left=0&compact=0&no_peer_id=0&event=started";

            Uri myUri = new Uri(myUrl);
            Console.WriteLine("ToString: " + myUri.ToString());
            Console.WriteLine("Query: " + myUri.Query);
            Console.WriteLine("AbsoluteUri: " + myUri.AbsoluteUri);

我猜,在网络上,一切都很好,这只是你如何从System.Uri检索url的一个产物。

我相当肯定我正在粉碎信息散列基于证据,真正的问题是我是如何搞砸Uri处理的。Fiddler是一个有用的工具。是的,这似乎是原因,但我想我应该提到Fiddler,因为它非常有用。我现在只是想看看我是否能找到uri被乱码的原因。我相当确定我正在粉碎基于证据的信息散列,真正的问题是我是如何把uri处理搞砸的。Fiddler是一个有用的工具。是的,这似乎是原因,但我想我应该提到Fiddler,因为它非常有用。我现在只是想看看我是否能找到uri被篡改的原因。你需要展示你如何创建URIMy bad,上面的uri是一个与我发布的uri相对应的字符串。你需要展示你如何创建URIMy bad,上面的uri是一个与我发布的uri相对应的字符串。解决了这个问题,但不是原版对我来说很不幸。解决了这个问题,但不是原版对我来说很不幸。