2011-11-30 61 views
2

为什么Uri类urldecode我发送给它的构造函数的url,我该如何防止这种情况?Uri类中的奇怪行为(NET)

示例(看看查询字符串值 “选项”):

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 

这是我的问题:)

+0

什么是'QueryString'?现在'request'来自哪里?下来1! – esskar

+1

对不起,请求来自HttpContext对象(使用WebForms的aspx.cs中的Page_Load)。认为这是obvius :)我用它来说明,当你访问一个asp.net页面与不同的url:s,那么你会得到两个不同的值。 – Andreas

回答

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 
+0

由于Uri将“选项”值从“one%3d1%26two%3d2%26three%3d3”改变为“one = 1&two = 2&three = 3”。我不应该使用ToString来获取原始地址的任何其他函数? – Andreas

+0

你是在整个uri中使用的,还是只想使用查询? – esskar

+0

更新了问题。问题是两个url:s在Request.Querystring中给出了不同的值 - 这不能是一个正确的行为? – Andreas

0

我会期望从Uri类。我相当肯定,如果你使用它,它仍能让你处在一个好的地方。 WebClient类(即WebClient.OpenRead(Uri uri))。你的情况有什么问题?

+0

为什么你会期待Uri改变你的网址?看看我更新的问题 - 它改变查询字符串返回其他东西(或留下一些) – Andreas

+0

它不会改变它。你提供的URL是urlencoded,所以它解码它,得到一个Uri :)。即使在更新之后,我仍然无法解决问题... –

+0

但是,url不是urlencoded,查询字符串中的参数是urlencoded。当完整的url被urldecoded时,它会改变url的含义。但我已经接受.NET的人认为这是合乎逻辑的(尽管我不同意这种行为)。 – Andreas

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内部代码:通过反射的方式直接访问一些私有方法。