2011-04-13 79 views
1

Request.Url.Segments[3]返回頁面名稱。在我的演示服務器有IIS6和它的工作正常,但在我的現場服務器已安裝IIS7Request.Url.Segments[3]不返回頁面名稱它會給出錯誤。Request.Url.Segments [3]不適用於IIS 7

請幫幫我。在此先感謝

+1

什麼錯誤。告訴我們。 – 2011-04-13 09:57:26

回答

11

這與IIS的版本無關。最有可能的是,您對該網站有不同的設置。

例如,在開發,在默認情況下的Visual Studio F5調試,該網站運行時間爲:

http://localhost:1234/sitename/folder/page.aspx 
        |\_______/\_____/\_______/ 
        0 1  2  3 

在試/生產,你可能沒有第一個文件夾:

http://sitename.corpo.com/folder/page.aspx 
         |\_____/\_______/ 
         0 1  2  

有更好的方式動態獲取數組的最後一個元素,即使不知道它的長度。嘗試使用:

Request.Url.Segments.Last() 

或者沒有LINQ,

Request.Url.Segments[Request.Url.Segments.Length - 1] 

如果你是不是在找最後一個元素,你可能要拿出指定你需要什麼更好的辦法。

1

.Segments中每個項目的值完全取決於Url,這由網站在IIS中設置的方式決定。

例如,將您的網站放置在網絡服務器的根目錄下會給出將網站置於虛擬根目錄下的不同重試。

在URL http://myserver/mypage.aspx,頁面是在項目索引1 在URL http://myserver/myvirtualroot/mypage.aspx,頁面是在項目索引2

您可以爲自己如下demostrate這樣的:

var uri = new Uri("http://myserver/mypage.aspx"); 
for (var i = 0; i < uri.Segments.Length; i++) 
{ 
    Console.WriteLine("Segments[{0}]: {1}",i, uri.Segments[i]); 
} 

這給:

Segments[0]:/
Segments[1]: mypage.aspx 

現在又嘗試了

var uri2 = new Uri("http://myserver/myvirtualroot/mypage.aspx"); 

這個時候你會得到:

Segments[0]:/
Segments[1]: myvirtualroot/ 
Segments[2]: mypage.aspx 

的一點是,你不能肯定地說「項指數3頁」,除非你知道實際的網站的網址(因此它的配置在IIS中)在不同的環境中是相同的。 (即使那樣,它不是一個特別好的方式,因爲它變得如此脆弱)

正如Kobi指出的那樣,只需使用uri.Segments.Last()就可以得到最後一個段(不含查詢字符串如果有的話),這正是你想要的。

+0

這裏有點太過分了 - 'Segments'數組不會包含查詢,您不必搜索它。這正是「Uri」類非常有用的原因 - 它成功處理真正的URI。請參閱http://msdn.microsoft.com/en-us/library/system.uri.segments.aspx上的示例。 – Kobi 2011-04-13 10:23:27

+0

您是對的 - 根本不需要提供擴展方法。我從.PathAndQuery開始,做了一個拆分,它確實需要這個。然後我切換到。部分,並沒有重新運行代碼。我的壞 - 謝謝你的位置 - 我會編輯。 – 2011-04-13 10:35:38

相關問題