溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

解除.NET中虛擬路徑的疑惑

發(fā)布時(shí)間:2020-07-19 21:19:19 來(lái)源:網(wǎng)絡(luò) 閱讀:296 作者:hamu01 欄目:編程語(yǔ)言

今天部署產(chǎn)品時(shí),發(fā)現(xiàn)一個(gè)涉及到路徑錯(cuò)誤的bug,在開(kāi)發(fā)環(huán)境下都OK,但是到了測(cè)試環(huán)境中卻一直報(bào)錯(cuò),經(jīng)過(guò)一番排查,原來(lái)錯(cuò)誤出在了HttpContext.Current.Server.MapPath這個(gè)方法上,之前就一直對(duì)這個(gè)方法怎樣將虛擬路徑轉(zhuǎn)化為物理路徑不甚了了,今天我忍無(wú)可忍,在網(wǎng)上仔細(xì)查找了資料,還親自做了實(shí)驗(yàn),終于弄明白了。在此分享出來(lái),希望能幫助到同樣有困惑的人,少走彎路。

虛擬路徑中的那些特殊字符的含義

  • Server.MapPath(".")返回當(dāng)前執(zhí)行文件所在路徑
  • Server.MapPath("..")返回當(dāng)前執(zhí)行文件所在路徑的父路徑
  • Server.MapPath("~") 返回應(yīng)用程序的所在路徑
  • Server.MapPath("/"),Server.MapPath("\\"),Server.MapPath(@"\") 返回網(wǎng)站所在路徑
  • Server.MapPath("")Server.MapPath(null) 返回文件所在路徑,和Server.MapPath(".")是一樣的

眾所周知我們?cè)赨RL中的路徑都是虛擬路徑,最后都要被轉(zhuǎn)化為網(wǎng)站所在服務(wù)器的物理路徑,一般的路徑都很好理解,對(duì)大家造成困擾的多是包含這些特殊字符的路徑,他們?cè)谔摂M路徑到物理路徑的轉(zhuǎn)化過(guò)程中有著特殊的含義。

 

舉例說(shuō)明

先在IIS中創(chuàng)建一個(gè)網(wǎng)站,網(wǎng)站域名為www.test.com,修改hosts文件將這個(gè)域名指向本機(jī),網(wǎng)站目錄為C:\inetpub\wwwroot\Test。在這個(gè)網(wǎng)站下添加應(yīng)用程序Shop,目錄為D:\Shop。在這個(gè)網(wǎng)站和應(yīng)用程序中同時(shí)添加一個(gè)目錄,取名main。

解除.NET中虛擬路徑的疑惑

創(chuàng)建一個(gè)WebForm,這個(gè)WebForm輸出上述所有特殊字符在運(yùn)行時(shí)對(duì)應(yīng)的路徑,代碼如下:

<% Output(".", "點(diǎn)號(hào)"); Output("..", "雙點(diǎn)號(hào)"); Output("~","波浪號(hào)"); Output("/","正斜杠"); Output("\\", "反斜杠"); Output(@"\","反斜杠"); Output(null,"null"); Output(string.Empty, "string.Empty");

Output(@"\main", @"\main"); %> <script runat="server"> private void Output(string token, string tokenDisplayName) { try { string path = tokenDisplayName + " : " + HttpContext.Current.Server.MapPath(token); Response.Write(path + "<br/>"); } catch (Exception) { Response.Write(tokenDisplayName + " : 非法路徑" + "<br/>"); } } </script>

 

我們把這個(gè)頁(yè)面分別放到網(wǎng)站和應(yīng)用程序的根目錄以及main目錄下,然后訪問(wèn)每個(gè)頁(yè)面,輸出如下:

解除.NET中虛擬路徑的疑惑 解除.NET中虛擬路徑的疑惑 解除.NET中虛擬路徑的疑惑 解除.NET中虛擬路徑的疑惑

結(jié)論

從上面的頁(yè)面輸出可以很好的驗(yàn)證文章開(kāi)始處的說(shuō)明,這里需要特別說(shuō)明的幾點(diǎn)是:

  • 在網(wǎng)站根目錄下,訪問(wèn)Server.MapPath("..")會(huì)拋出異常,這說(shuō)明網(wǎng)站中的所有訪問(wèn)不能超出網(wǎng)站所在的目錄范圍,這樣的設(shè)計(jì)合情合理
  • 在URI中訪問(wèn)的路徑都是虛擬路徑,而不是物理路徑,Shop這個(gè)應(yīng)用程序的上一級(jí)目錄不是其物理環(huán)境中的上一級(jí)目錄,而是在IIS中其上級(jí)所在的目錄,也就是網(wǎng)站所在的目錄,因此在Shop這個(gè)應(yīng)用程序中訪問(wèn)Server.MapPath("..")返回的C:\inetpub\wwwroot\Test
  • 不管是正斜杠還是反斜杠映射的都是網(wǎng)站根目錄,之所以強(qiáng)調(diào)這一點(diǎn)是因?yàn)樵诰W(wǎng)上查看資料的時(shí)候,見(jiàn)到如下的說(shuō)法:在Shop應(yīng)用程序的根目錄下訪問(wèn)Server.MapPath(@"\main")返回的是D:\Shop\main目錄,這個(gè)說(shuō)法是絕對(duì)不正確的,特此提醒
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI