2010-04-05 577 views
3

我有一個用C#編寫的.NET 3.5 Web應用程序,它執行一些包含文件路徑的URL重寫,並且遇到了問題。當我打電話給string.Split('/')時,它匹配'/'和'\'字符。那是......應該發生的嗎?我認爲它會注意到ASCII值不同並跳過它,但看起來我錯了。C#string.Split()匹配兩個斜線?

// url = 'someserver.com/user/token/files\subdir\file.jpg 
string[] buffer = url.Split('/'); 

上面的代碼給出了在它一個string[] 6個元素...這似乎計數器直觀。有沒有辦法強制Split()只匹配正斜槓?現在我很幸運,因爲URL的末尾出現了違規的斜槓,我可以將string[]中的其他元素連接起來,但對於我們正在做的事情而言,這是很多工作,而不是一個好的解決方案到底層的問題。

以前有誰碰到過這個?有一個簡單的答案?我很感激!

更多的代碼:

url = HttpContext.Current.Request.Path.Replace("http://", ""); 
string[] buffer = url.Split('/'); 

原來,Request的和Request.RawUrl都改變了我的斜線,這是荒謬的。所以,有時間再研究一下,弄清楚如何從不會破壞我的格式的函數獲取URL。感謝大家一起玩我的瘋狂,對不起,這是一個誤導性的問題!

+0

url是一個字符串,一個uri還是一個路徑?因爲在窗口中,在一條路徑中,我認爲'/'和'\'字符可以互換使用,但有時只能使用。 – mmr 2010-04-05 18:22:17

+0

我試圖重現你的問題,我一直無法。你能創建一個簡短但完整的程序來證明問題嗎? – 2010-04-05 18:30:13

回答

7

當我嘗試以下方法:

string url = @"someserver.com/user/token/files\subdir\file.jpg"; 
string[] buffer = url.Split('/'); 
Console.WriteLine(buffer.Length); 

...我得到4.郵政更多的代碼。

+1

我同意。我認爲這個url不是一個字符串。 – mmr 2010-04-05 18:28:20

+1

我也一樣。我懷疑url不是OP說的。 – 2010-04-05 18:30:29

0

您可以使用正則表達式將所有\斜線轉換爲臨時字符,然後將其分割爲/,然後將臨時字符正則表達爲\。在屁股疼痛,但一個選擇。

-1

更新:
如何:

Regex.Split(url, "/"); 
+0

但他只想分割一個角色,而不是兩個角色。 – mmr 2010-04-05 18:27:24

+0

這個問題表明它不應該被分割爲\。 – bdukes 2010-04-05 18:28:04

1

別的東西正在發生的事情,貼更多的代碼。

string str = "a\\b/c\\d"; 
string[] ts = str.Split('/'); 
foreach (string t in ts) 
{ 
    Console.WriteLine(t); 
} 

輸出

a\b 
c\d 

就像它應該。 我的猜測是你正在轉換/進入\某處。

0

我懷疑(沒有看到你的整個應用程序)問題在於URL中路徑定界符的語義。這聽起來像是你試圖在你的應用程序中附加一個語義值到反斜槓,這與HTTP協議定義和使用反斜槓的方式相反。

這當然只是猜測。

解決此問題的最佳方法可能是修改應用程序以某種其他方式對路徑進行編碼(例如反斜槓的「%5C」,也許?)。

0

這兩個函數可能將\轉換爲/因爲\不是URL中的有效字符(請參閱Which characters make a URL invalid?)。瀏覽器(不是C#,正如你推斷的那樣)假定當你使用那個無效字符時,你的意思是/,所以它正在爲你「修復」它。如果你想在你的網址中輸入\,你需要先對它進行編碼。

瀏覽器本身實際上是在請求中進行更改的瀏覽器,即使它在幕後。要驗證這一點,只需打開fiddler並查看實際發送到這樣的URL時發送的URL。 IE和Chrome實際上將瀏覽器本身的URL字段中的\改爲/,FireFox不會,但請求會通過這種方式反正。

+0

即使將其編碼爲%5C(這是我的第一本能),問題仍然存在。然後觀看頭文件被髮送,斜槓沒有被轉換成URL(至少在Firefox中)。所以再次,不知道即使編碼時它們是如何轉換的,但現在它不是問題。 – 2010-04-06 19:26:10

+0

這對Firefox來說很奇怪,因爲它在我嘗試時發生了。而且因爲其他瀏覽器肯定會轉換爲/,所以您不希望將該字符分開。至於使用編碼字符時仍然出現的錯誤,當你這樣做的時候肯定會有一些東西,因爲我運行了一個測試並且工作正常。 – 2010-04-08 15:51:38