2012-01-02 45 views
1

我有一個WP7項目,我使用下面的代碼。它通常工作正常,但我得到一些奇怪的結果,通過一些特定的字符串。C#URL QueryString問題

Service = "3q%23L3t41tGfXQDTaZMbn%23w%3D%3D?f" 

NavigationService.Navigate(new Uri("/Details.xaml?service=" + Service, UriKind.Relative)); 

下一頁:

NavigationContext.QueryString.TryGetValue("service", out Service1); 

服務1現在= 3Q#L3t41tGfXQDTaZMbn#w^==˚F

爲什麼字符串改變了嗎?

回答

2

字符串沒有改變,但是你正在用兩種不同的方式查看它。

作爲URI內容編碼3q#L3t41tGfXQDTaZMbn#w==?f的方式爲3q%23L3t41tGfXQDTaZMbn%23w%3D%3D?f。 (實際上,這是3q%23L3t41tGfXQDTaZMbn%23w%3D%3D%3Ff,但在這種情況下,您在?附近未能正確逃脫到%3F)。

你寫字符串的方法,期望收到它逃脫。

你的手段閱讀字符串,返回它未轉義。

事情是非常完美的工作,真的。

當你需要再次寫入字符串,然後只需再次逃避它:

Service = Uri.EscapeDataString(Service1); 
+0

完美的謝謝。 – 2012-01-03 19:33:07

2

在你的第一個代碼片段中,字符串是URL Encoded。

在第二個代碼片段中,字符串是URL Decoded。

它們本質上是相同的字符串,只是應用/刪除了編碼。

例如:URL編碼#%23

進一步的閱讀看看這個wikipedia article on encoding

由於HttpUtility不是WP7 Silverlight堆棧的一部分,我建議使用Uri.EscapeUriString來轉義任何尚未轉義的URI。

+1

'Uri.EscapeUriString'是不恰當的,他們會想'Uri.EscapeDataString'這一點。前者只是逃避了不能出現在URI中的字符,後者逃脫了URI中具有特殊含義的字符,所以這就是他們想要的。 (公平地說,MSDN文檔並不清楚它的區別)。 – 2012-01-02 22:15:55

2

如果你想讓它穿過未受攻擊的位置,你應該對URL進行編碼。

+0

除非他這樣做,否則他的代碼將無法按預期工作。 – Alan 2012-01-02 22:01:02

+0

很難知道他期望什麼。他只是注意到它改變了,不是他想要的版本。 – 2012-01-02 22:05:50