ASP.net 路徑問題 詳解
更新時間:2010年05月14日 17:11:12 作者:
各位有沒有碰到在日常工作中經(jīng)常在路徑設置的時候把 "~/ 、./ 、../ 、 / 、"這些符號搞混搞亂了?
偶爾還會因路徑的問題郁悶了半天 還以為是程序上出了問題了。以下我是轉(zhuǎn)自--腳本之家 里的一篇技文,略作修改,以備不時只需,各位有需要的也可參考參考,有錯的也請各位指出。
比如你的工程是Webapplication1(url是:http://localhost/webapplication1/webform1.aspx)
Request.ApplicationPath 就是/Webapplication1
如果是站點就直接返回"/";
------------------------------------------------------
~/ 可以用在需要設置路徑的控件比如:imagebutton,image等 以及鏈接ascx文件,配置文件.
../ 的好處是可以不知道文件夾的名字知道層次結構就可以了
/ 的好處是針對根路徑,如果本地目錄和服務器目錄一致,那直接用/就可以保證路徑正確,這種情況很少.
Request.ApplicationPath 注意如果沒有虛擬目錄就直接返回/,那你程序里面就不要設置/
比如
Request.ApplicationPath+"/images/a.gif" 如果是站點 就是等于 "http://images/a.gif",錯誤的
如果有虛擬目錄就是 "Webapplication1/images/a.gif"
沒有/的
Request.ApplicationPath 發(fā)揮虛擬目錄名稱,如果是站點就返回/
~/ 類似,不過只用服務端的空間可以識別;
/ 針對目錄
./ 當前目錄
../ 相對當前目錄的上層目錄
比如你的工程是Webapplication1(url是:http://localhost/webapplication1/webform1.aspx)
Request.ApplicationPath 就是Webapplication1/
~/ 也是 Webapplication1/
/就是http://localhost/
如果webform1.aspx 下有個文件webform2.aspx
你可以在webform1.aspx里這樣使用
<a href=webform2.aspx>ddd</a>
或者
<a href=/webapplication1/webform2.aspx></a>
或者
<a href=../webform2.aspx></a>
ASP.NET 網(wǎng)站路徑
使用網(wǎng)站中的資源時,通常必須指定資源的路徑。例如,您可以使用 URL 路徑引用頁面中的圖像文件或網(wǎng)站中其他位置處的頁面的 URL。同樣,Web 應用程序中的代碼可以使用基于服務器的文件的物理文件路徑對文件進行讀寫操作。ASP.NET 提供用于引用資源并確定應用程序中的頁面或其他資源的路徑的方法。
指定資源的路徑
許多情況下,頁面中的元素或控件必須引用外部資源,如文件。ASP.NET 支持引用外部資源的各種方法。根據(jù)您使用的是客戶端元素還是 Web 服務器控件,選擇的引用方法將有所不同。
客戶端元素
客戶端元素是頁面上的非 Web 服務器控件元素,它們將按原樣被傳遞給瀏覽器。因此,從客戶端元素中引用資源時,應根據(jù) HTML 中 URL 的標準規(guī)則構造路徑??梢允褂猛耆薅ǖ?URL 路徑(又稱為絕對 URL 路徑),也可以使用各種類型的相對路徑。例如,如果頁面包含 img 元素,則可以使用以下路徑之一設置其 src 屬性:
絕對 URL 路徑。如果引用其他位置(例如外部網(wǎng)站)中的資源,則絕對 URL 路徑非常有用。
<img src="http://www.contoso.com/MyApplication/Images/SampleImage.jpg" />網(wǎng)站根目錄相對路徑,此路徑將根據(jù)網(wǎng)站根目錄(而非應用程序根目錄)進行解析。如果將跨應用程序的資源(例如圖像或客戶端腳本文件)保留在網(wǎng)站根目錄下的文件夾中,則網(wǎng)站根目錄相對路徑非常有用。
此示例路徑假定 Images 文件夾位于網(wǎng)站根目錄下。
<img src="/Images/SampleImage.jpg" />如果您的網(wǎng)站為 http://www.contoso.com,則此路徑將解析為以下形式。
http://www.contoso.com/Images/SampleImage.jpg下面是一個根據(jù)當前頁面路徑解析的相對路徑。
<img src="Images/SampleImage.jpg" />解析為當前頁面路徑對等的相對路徑。
<img src="../Images/SampleImage.jpg" />注意
默認情況下,瀏覽器使用當前頁面的 URL 作為解析相對路徑的基準。但是,您可以在頁面中包含 HTML base 元素,以指定替代基路徑。
服務器控件
在引用資源的 ASP.NET 服務器控件中,可以使用絕對路徑或相對路徑,這一點與客戶端元素一樣。如果使用相對路徑,則相對于頁面、用戶控件或包含該控件的主題的路徑進行解析。例如,假設 Controls 文件夾中包含一個用戶控件。該用戶控件包含一個 Image Web 服務器控件,此服務器控件的 ImageUrl 屬性被設置為以下路徑:Images/SampleImage.jpg。
當該用戶控件運行時,上述路徑將解析為以下形式:/Controls/Images/SampleImage.jpg。無論承載該用戶控件的頁面位于何處,結果都是如此。
注意
在主控頁中,資源的路徑基于內(nèi)容頁的路徑進行解析。有關更多信息,請參見 ASP.NET 母版頁概述。
服務器控件中的絕對和相對路徑引用具有以下缺點:
絕對路徑在應用程序之間是不可移植的。如果移動絕對路徑指向的應用程序,則鏈接將會中斷。
如果將資源或頁面移動到不同的文件夾,可能很難維護采用客戶端元素樣式的相對路徑。
為克服這些缺點,ASP.NET 包括了 Web 應用程序根目錄運算符 (~),當您在服務器控件中指定路徑時可以使用該運算符。ASP.NET 會將 ~ 運算符解析為當前應用程序的根目錄??梢越Y合使用 ~ 運算符和文件夾來指定基于當前根目錄的路徑。
下面的示例演示了使用 Image 服務器控件時用于為圖像指定根目錄相對路徑的 ~ 運算符。在此示例中,無論頁面位于網(wǎng)站中的什么位置,都將從位于 Web 應用程序根目錄下的 Images 文件夾中直接讀取圖像文件。
<asp:image runat="server" id="Image1"
ImageUrl="~/Images/SampleImage.jpg" />可以在服務器控件中的任何與路徑有關的屬性中使用 ~ 運算符。~ 運算符只能為服務器控件識別,并且位于服務器代碼中。不能將 ~ 運算符用于客戶端元素。
注意
僅限于移動頁,如果您的應用程序依賴于無 Cookie 會話或者可能收到來自移動設備的需要無 Cookie 會話的請求,則在路徑中使用波形符(“~”)會導致意外創(chuàng)建新會話,并可能丟失會話數(shù)據(jù)。若要使用包含波形符(例如“~/路徑”)的路徑來設置移動控件的屬性,請先使用 ResolveUrl 方法解析該路徑,再將其分配給該屬性。
確定當前網(wǎng)站的物理文件路徑
在應用程序中,您可能需要確定服務器上的文件或其他資源的路徑。例如,如果應用程序以編程方式對文本文件進行讀寫操作,則必須為用于讀取和寫入的方法提供該文件的完整物理路徑。
將物理文件路徑(例如 C:\Website\MyApplication)硬編碼到應用程序中并不是很好的做法,因為如果移動或部署應用程序,將會更改這些路徑。但是,ASP.NET 為您提供了以編程方式獲取應用程序中的任何物理文件路徑的方法。然后,您可以使用基文件路徑創(chuàng)建所需資源的完整路徑。用于確定文件路徑的兩種最常用的 ASP.NET 功能是返回路徑信息的 HttpRequest 對象的屬性,以及 MapPath 方法。
注意
不應將物理文件路徑發(fā)送到客戶端,因為它們可能會被惡意用戶用來獲取有關您的應用程序的信息。
根據(jù)請求屬性確定路徑
下表列出了 HttpRequest 對象的屬性,這些屬性幫助您確定應用程序中的資源的路徑。
表中列出的示例基于下面的假設:
已使用以下 URL 發(fā)出瀏覽器請求:http://www.contoso.com/MyApplication/MyPages/Default.aspx。
術語“虛擬路徑”是指請求 URL 中跟在服務器標識符后面的部分;在此示例中,虛擬路徑是指以下路徑:/MyApplication/MyPages/Default.aspx。
網(wǎng)站根目錄的物理路徑為:C:\inetpub\wwwroot\MyApplication\。
該物理路徑中包含一個名為 MyPages 的文件夾。
屬性 說明
ApplicationPath
獲取當前應用程序的根目錄路徑,無論在該應用程序中的什么位置請求該路徑。在此示例中,該屬性將返回以下內(nèi)容:/
CurrentExecutionFilePath
獲取當前請求的虛擬路徑。它與 FilePath 屬性的不同之處在于,如果請求已在服務器代碼中被重定向,則 CurrentExecutionFilePath 就是正確的。在此示例中,該屬性將返回以下內(nèi)容:/MyApplication/MyPages/Default.aspx
如果作為對 Transfer 或 Execute 進行調(diào)用的結果,您獲取正在運行的代碼中的屬性,則路徑將反映該代碼的位置。
FilePath
獲取當前請求的虛擬路徑。在此示例中,該屬性將返回以下內(nèi)容:/MyApplication/MyPages/Default.aspx
與 CurrentExecutionFilePath 屬性不同的是,F(xiàn)ilePath 不反映服務器端的傳輸。
Path
獲取當前請求的虛擬路徑。在此示例中,該屬性將返回以下內(nèi)容:/MyApplication/MyPages/default.aspx
PhysicalApplicationPath
獲取當前正在執(zhí)行的應用程序的根目錄的物理文件系統(tǒng)路徑。在此示例中,該屬性將返回以下內(nèi)容:C:\inetpub\wwwroot\
PhysicalPath
獲取與請求的 URL 相對應的物理文件系統(tǒng)路徑。在此示例中,該屬性將返回以下內(nèi)容:C:\inetpub\wwwroot\MyApplication\MyPages\default.aspx
使用 MapPath 方法
MapPath 方法返回傳遞給該方法的虛擬路徑的完整物理路徑。例如,以下代碼返回網(wǎng)站根目錄的文件路徑:
Visual Basic
Dim rootPath As String = Server.MapPath("~")
C#
String rootPath = Server.MapPath("~");
注意
傳遞給 MapPath 方法的路徑必須為應用程序相對路徑,而不是絕對路徑。
Control.ResolveUrl 方法 [C#]請參見
Control 類 | Control 成員 | System.Web.UI 命名空間 | TemplateSourceDirectory | Control 成員(Visual J# 語法) | C++ 托管擴展編程
要求
平臺: Windows 2000, Windows XP Professional, Windows Server 2003 系列
語言
C#
C++
JScript
Visual Basic
全部顯示
將 URL 轉(zhuǎn)換為在請求客戶端可用的 URL。
[Visual Basic]
Public Function ResolveUrl( _
ByVal relativeUrl As String _
) As String
[C#]
public string ResolveUrl(
string relativeUrl
);
[C++]
public: String* ResolveUrl(
String* relativeUrl
);
[JScript]
public function ResolveUrl(
relativeUrl : String
) : String;
參數(shù)
relativeUrl
與 TemplateSourceDirectory 屬性相關聯(lián)的 URL。
返回值
轉(zhuǎn)換后的 URL。
比如你的工程是Webapplication1(url是:http://localhost/webapplication1/webform1.aspx)
Request.ApplicationPath 就是/Webapplication1
如果是站點就直接返回"/";
------------------------------------------------------
~/ 可以用在需要設置路徑的控件比如:imagebutton,image等 以及鏈接ascx文件,配置文件.
../ 的好處是可以不知道文件夾的名字知道層次結構就可以了
/ 的好處是針對根路徑,如果本地目錄和服務器目錄一致,那直接用/就可以保證路徑正確,這種情況很少.
Request.ApplicationPath 注意如果沒有虛擬目錄就直接返回/,那你程序里面就不要設置/
比如
Request.ApplicationPath+"/images/a.gif" 如果是站點 就是等于 "http://images/a.gif",錯誤的
如果有虛擬目錄就是 "Webapplication1/images/a.gif"
沒有/的
Request.ApplicationPath 發(fā)揮虛擬目錄名稱,如果是站點就返回/
~/ 類似,不過只用服務端的空間可以識別;
/ 針對目錄
./ 當前目錄
../ 相對當前目錄的上層目錄
比如你的工程是Webapplication1(url是:http://localhost/webapplication1/webform1.aspx)
Request.ApplicationPath 就是Webapplication1/
~/ 也是 Webapplication1/
/就是http://localhost/
如果webform1.aspx 下有個文件webform2.aspx
你可以在webform1.aspx里這樣使用
<a href=webform2.aspx>ddd</a>
或者
<a href=/webapplication1/webform2.aspx></a>
或者
<a href=../webform2.aspx></a>
ASP.NET 網(wǎng)站路徑
使用網(wǎng)站中的資源時,通常必須指定資源的路徑。例如,您可以使用 URL 路徑引用頁面中的圖像文件或網(wǎng)站中其他位置處的頁面的 URL。同樣,Web 應用程序中的代碼可以使用基于服務器的文件的物理文件路徑對文件進行讀寫操作。ASP.NET 提供用于引用資源并確定應用程序中的頁面或其他資源的路徑的方法。
指定資源的路徑
許多情況下,頁面中的元素或控件必須引用外部資源,如文件。ASP.NET 支持引用外部資源的各種方法。根據(jù)您使用的是客戶端元素還是 Web 服務器控件,選擇的引用方法將有所不同。
客戶端元素
客戶端元素是頁面上的非 Web 服務器控件元素,它們將按原樣被傳遞給瀏覽器。因此,從客戶端元素中引用資源時,應根據(jù) HTML 中 URL 的標準規(guī)則構造路徑??梢允褂猛耆薅ǖ?URL 路徑(又稱為絕對 URL 路徑),也可以使用各種類型的相對路徑。例如,如果頁面包含 img 元素,則可以使用以下路徑之一設置其 src 屬性:
絕對 URL 路徑。如果引用其他位置(例如外部網(wǎng)站)中的資源,則絕對 URL 路徑非常有用。
<img src="http://www.contoso.com/MyApplication/Images/SampleImage.jpg" />網(wǎng)站根目錄相對路徑,此路徑將根據(jù)網(wǎng)站根目錄(而非應用程序根目錄)進行解析。如果將跨應用程序的資源(例如圖像或客戶端腳本文件)保留在網(wǎng)站根目錄下的文件夾中,則網(wǎng)站根目錄相對路徑非常有用。
此示例路徑假定 Images 文件夾位于網(wǎng)站根目錄下。
<img src="/Images/SampleImage.jpg" />如果您的網(wǎng)站為 http://www.contoso.com,則此路徑將解析為以下形式。
http://www.contoso.com/Images/SampleImage.jpg下面是一個根據(jù)當前頁面路徑解析的相對路徑。
<img src="Images/SampleImage.jpg" />解析為當前頁面路徑對等的相對路徑。
<img src="../Images/SampleImage.jpg" />注意
默認情況下,瀏覽器使用當前頁面的 URL 作為解析相對路徑的基準。但是,您可以在頁面中包含 HTML base 元素,以指定替代基路徑。
服務器控件
在引用資源的 ASP.NET 服務器控件中,可以使用絕對路徑或相對路徑,這一點與客戶端元素一樣。如果使用相對路徑,則相對于頁面、用戶控件或包含該控件的主題的路徑進行解析。例如,假設 Controls 文件夾中包含一個用戶控件。該用戶控件包含一個 Image Web 服務器控件,此服務器控件的 ImageUrl 屬性被設置為以下路徑:Images/SampleImage.jpg。
當該用戶控件運行時,上述路徑將解析為以下形式:/Controls/Images/SampleImage.jpg。無論承載該用戶控件的頁面位于何處,結果都是如此。
注意
在主控頁中,資源的路徑基于內(nèi)容頁的路徑進行解析。有關更多信息,請參見 ASP.NET 母版頁概述。
服務器控件中的絕對和相對路徑引用具有以下缺點:
絕對路徑在應用程序之間是不可移植的。如果移動絕對路徑指向的應用程序,則鏈接將會中斷。
如果將資源或頁面移動到不同的文件夾,可能很難維護采用客戶端元素樣式的相對路徑。
為克服這些缺點,ASP.NET 包括了 Web 應用程序根目錄運算符 (~),當您在服務器控件中指定路徑時可以使用該運算符。ASP.NET 會將 ~ 運算符解析為當前應用程序的根目錄??梢越Y合使用 ~ 運算符和文件夾來指定基于當前根目錄的路徑。
下面的示例演示了使用 Image 服務器控件時用于為圖像指定根目錄相對路徑的 ~ 運算符。在此示例中,無論頁面位于網(wǎng)站中的什么位置,都將從位于 Web 應用程序根目錄下的 Images 文件夾中直接讀取圖像文件。
<asp:image runat="server" id="Image1"
ImageUrl="~/Images/SampleImage.jpg" />可以在服務器控件中的任何與路徑有關的屬性中使用 ~ 運算符。~ 運算符只能為服務器控件識別,并且位于服務器代碼中。不能將 ~ 運算符用于客戶端元素。
注意
僅限于移動頁,如果您的應用程序依賴于無 Cookie 會話或者可能收到來自移動設備的需要無 Cookie 會話的請求,則在路徑中使用波形符(“~”)會導致意外創(chuàng)建新會話,并可能丟失會話數(shù)據(jù)。若要使用包含波形符(例如“~/路徑”)的路徑來設置移動控件的屬性,請先使用 ResolveUrl 方法解析該路徑,再將其分配給該屬性。
確定當前網(wǎng)站的物理文件路徑
在應用程序中,您可能需要確定服務器上的文件或其他資源的路徑。例如,如果應用程序以編程方式對文本文件進行讀寫操作,則必須為用于讀取和寫入的方法提供該文件的完整物理路徑。
將物理文件路徑(例如 C:\Website\MyApplication)硬編碼到應用程序中并不是很好的做法,因為如果移動或部署應用程序,將會更改這些路徑。但是,ASP.NET 為您提供了以編程方式獲取應用程序中的任何物理文件路徑的方法。然后,您可以使用基文件路徑創(chuàng)建所需資源的完整路徑。用于確定文件路徑的兩種最常用的 ASP.NET 功能是返回路徑信息的 HttpRequest 對象的屬性,以及 MapPath 方法。
注意
不應將物理文件路徑發(fā)送到客戶端,因為它們可能會被惡意用戶用來獲取有關您的應用程序的信息。
根據(jù)請求屬性確定路徑
下表列出了 HttpRequest 對象的屬性,這些屬性幫助您確定應用程序中的資源的路徑。
表中列出的示例基于下面的假設:
已使用以下 URL 發(fā)出瀏覽器請求:http://www.contoso.com/MyApplication/MyPages/Default.aspx。
術語“虛擬路徑”是指請求 URL 中跟在服務器標識符后面的部分;在此示例中,虛擬路徑是指以下路徑:/MyApplication/MyPages/Default.aspx。
網(wǎng)站根目錄的物理路徑為:C:\inetpub\wwwroot\MyApplication\。
該物理路徑中包含一個名為 MyPages 的文件夾。
屬性 說明
ApplicationPath
獲取當前應用程序的根目錄路徑,無論在該應用程序中的什么位置請求該路徑。在此示例中,該屬性將返回以下內(nèi)容:/
CurrentExecutionFilePath
獲取當前請求的虛擬路徑。它與 FilePath 屬性的不同之處在于,如果請求已在服務器代碼中被重定向,則 CurrentExecutionFilePath 就是正確的。在此示例中,該屬性將返回以下內(nèi)容:/MyApplication/MyPages/Default.aspx
如果作為對 Transfer 或 Execute 進行調(diào)用的結果,您獲取正在運行的代碼中的屬性,則路徑將反映該代碼的位置。
FilePath
獲取當前請求的虛擬路徑。在此示例中,該屬性將返回以下內(nèi)容:/MyApplication/MyPages/Default.aspx
與 CurrentExecutionFilePath 屬性不同的是,F(xiàn)ilePath 不反映服務器端的傳輸。
Path
獲取當前請求的虛擬路徑。在此示例中,該屬性將返回以下內(nèi)容:/MyApplication/MyPages/default.aspx
PhysicalApplicationPath
獲取當前正在執(zhí)行的應用程序的根目錄的物理文件系統(tǒng)路徑。在此示例中,該屬性將返回以下內(nèi)容:C:\inetpub\wwwroot\
PhysicalPath
獲取與請求的 URL 相對應的物理文件系統(tǒng)路徑。在此示例中,該屬性將返回以下內(nèi)容:C:\inetpub\wwwroot\MyApplication\MyPages\default.aspx
使用 MapPath 方法
MapPath 方法返回傳遞給該方法的虛擬路徑的完整物理路徑。例如,以下代碼返回網(wǎng)站根目錄的文件路徑:
Visual Basic
Dim rootPath As String = Server.MapPath("~")
C#
String rootPath = Server.MapPath("~");
注意
傳遞給 MapPath 方法的路徑必須為應用程序相對路徑,而不是絕對路徑。
Control.ResolveUrl 方法 [C#]請參見
Control 類 | Control 成員 | System.Web.UI 命名空間 | TemplateSourceDirectory | Control 成員(Visual J# 語法) | C++ 托管擴展編程
要求
平臺: Windows 2000, Windows XP Professional, Windows Server 2003 系列
語言
C#
C++
JScript
Visual Basic
全部顯示
將 URL 轉(zhuǎn)換為在請求客戶端可用的 URL。
[Visual Basic]
Public Function ResolveUrl( _
ByVal relativeUrl As String _
) As String
[C#]
public string ResolveUrl(
string relativeUrl
);
[C++]
public: String* ResolveUrl(
String* relativeUrl
);
[JScript]
public function ResolveUrl(
relativeUrl : String
) : String;
參數(shù)
relativeUrl
與 TemplateSourceDirectory 屬性相關聯(lián)的 URL。
返回值
轉(zhuǎn)換后的 URL。
相關文章
asp.net實現(xiàn)調(diào)用帶有輸出參數(shù)的存儲過程實例
這篇文章主要介紹了asp.net實現(xiàn)調(diào)用帶有輸出參數(shù)的存儲過程,結合實例形式分析了前端基于jQuery的ajax調(diào)用及后臺存儲過程調(diào)用的相關技巧,需要的朋友可以參考下2016-03-03.NET?API?接口數(shù)據(jù)傳輸加密最佳實踐記錄
這篇文章主要介紹了.NET?API?接口數(shù)據(jù)傳輸加密最佳實踐記錄,我們在做?Api?接口時,相信一定會有接觸到要給傳輸?shù)恼埱?body?的內(nèi)容進行加密傳輸。其目的就是為了防止一些敏感的內(nèi)容直接被?UI?層查看或篡改,需要的朋友可以參考下2022-10-10詳解可跨域的單點登錄(SSO)實現(xiàn)方案【附.net代碼】
本篇文章主要介紹了可跨域的單點登錄(SSO)實現(xiàn)方案,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11.NET中可空值類型【Nullable<T>】實現(xiàn)原理
本文主要介紹了.NET中可空值類型的實現(xiàn)原理,具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03ASP.NET與MySQL數(shù)據(jù)庫簡明圖示入門教程
ASP.NET與MySQL數(shù)據(jù)庫簡明圖示入門教程...2006-09-09Win2008 server + IIS7 設置身份模擬(ASP.NET impersonation)
IIS7 與 IIS 6 相比有了很大的改動,原來在 IIS 6 下可以的設置到了 IIS 7 下有的會發(fā)生變化。身份模擬的配置上,IIS7 和 IIS6有很大不同,網(wǎng)上IIS6的身份模擬的文章比較多,但介紹IIS7的比較少,我把的一些折騰的經(jīng)驗在這篇博客中寫下來,以供參考2011-10-10