2011-11-30 76 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內部代碼:通過反射的方式直接訪問一些私有方法。