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

时间:2011-11-30 11:59:25

标签: c# .net uri

为什么Uri类urldecode我发送给它的构造函数的url以及如何防止这种情况?

示例(查看查询字符串值“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

这是我的问题:)

3 个答案:

答案 0 :(得分:1)

为什么呢? 您可以使用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

答案 1 :(得分:0)

我希望来自Uri班。我很确定如果你使用它,它仍然可以让你在一个好地方WebClient类(即WebClient.OpenRead(Uri uri))。你的案子有什么问题?

答案 2 :(得分:0)

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

围绕它的唯一方法是hackish:通过反射直接访问一些私有方法:

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内部代码时并不理想。