Uri-class (. net)中的奇怪行为

本文关键字:net Uri-class | 更新日期: 2023-09-27 18:16:07

为什么Uri类urldecode我的url,我发送给它的构造函数,我怎么能防止这种情况?

示例(查看querystring值"options"):

    string url = "http://www.example.com/default.aspx?id=1&name=andreas&options=one%3d1%26two%3d2%26three%3d3";
    Uri uri = new Uri(url); // http://www.example.com/default.aspx?id=1&name=andreas&options=one=1&two=2&three=3
更新:

// ?id=1&name=andreas&options=one%3d1%26two%3d2%26three%3d3
Request.QueryString["options"] = one=1&two=2&three=3
// ?id=1&name=andreas&options=one=1&two=2&three=3
Request.QueryString["options"] = one=1

这是我的问题

Uri-class (. net)中的奇怪行为

为什么?您可以使用url.AbsoluteUri

获得编码版本。

编辑

Console.WriteLine("1) " + uri.AbsoluteUri);
Console.WriteLine("2) " + uri.Query);
OUT:
1) http://www.example.com/default.aspx?id=1&name=andreas&options=one%3d1%26two%3d2%26three%3d3
2) ?id=1&name=andreas&options=one%3d1%26two%3d2%26three%3d3

我希望Uri类能做到这一点。我很肯定,如果你使用它,例如WebClient类(即WebClient),它仍然会让你在一个好地方。OpenRead (Uri Uri))。你的案子有什么问题?

这是。net内部代码的行为-在以前的版本中,您可以使用Uri的另一个构造函数接受布尔值来告诉是否转义,但它已被弃用。

唯一的解决方法是:通过反射直接访问私有方法:

string url = "http://www.example.com/default.aspx?id=1&name=andreas&options=one%3d1%26two%3d2%26three%3d3";
Uri uri = new Uri(url);
MethodInfo mi = uri.GetType().GetMethod("CreateThis", BindingFlags.NonPublic | BindingFlags.Instance);
if (mi != null)
    mi.Invoke(uri, new object[] { url, true, UriKind.RelativeOrAbsolute  });

这在我的快速测试中工作,但不理想,因为你"入侵"到。net内部代码