從事古蹟維護的讀者來訊,某個使用 VS2010 維護的舊專案,原本偵錯時 URL 的格式為 ℎttp://localhost:12345/AppName/test.aspx;改用 VS2019 之後,偵錯 URL 變成 ℎttp://localhost:12345/test.aspx。 因為舊專案裡面很多地方在 URL 寫死了 /AppName,部署到 IIS 時掛在 /AppName 下跑起來沒問題,但 VS2019 將網站掛在根目錄下,偵錯時這些 /AppName/xxx URL 便會爆炸!

首先,專案裡寫死 /AppName 是不好的設計,在 ASP.NET 的正確做法應該寫成 ~/,如此不管網站掛在根目錄或將 AppName 換成任何名稱,程式都可正常運行。

不過呢,維護老專案遇到這類問題,就像去客戶家修水管發現磁磚貼歪了,自做主張把磁磚拆下來重貼,通常不是得到感謝,而是被告上法院。在實務上,大幅重整翻修需要討論規劃,對維護人員來說,找到 Workaround 比較實際。

好的,那 Visual Studio 有沒有辦法指定將網站掛在 /AppName 下偵錯呢?查過一些文件,看起來這屬於罕見需求(若用 ~/ 根本不會有這問題),故沒有方便的 GUI 或設定選項可用。

但這也不代表辦不到,既然 Visual Studio 使用 IIS Express 偵錯,IIS 能做到的事,IIS Express 也行。先前在隨手記 - IIS / IIS Express 伺服器 config 檔介紹過,透過修改 applicationhost.config,我們可以控制 IIS Express 的大小行為。這裡就用個實例來示範。

我們建立一個 Web Site Project - DemoWeb,裡面只有一個 default.aspx 跟 web.config,default.aspx 內容如下:

<%@Page Language="C#"%>
<!DOCTYPE html>
<html>
	<head></head>
	<body>
		Hello World! <br />
		ApplicationPath = <%= Request.ApplicationPath %>
	</body>
</html>

將 DemoWeb.sln 存在上一層,按 F5 偵錯的預設路徑會是 ℎttp://localhost:8561:

接著我們找到 DemoWeb.sln 所在目錄有個 .vs 資料夾,在裡面可以找到 applicationhost.config:

在其中找到 application path="/":

<application path="/" applicationPool="Clr4IntegratedAppPool">
    <virtualDirectory path="/" physicalPath="X:\Github\IISExpressWebAppPath\DemoWeb" />
</application>

在下方多加一段:

<application path="/Demo" applicationPool="Clr4IntegratedAppPool">
    <virtualDirectory path="/" physicalPath="X:\Github\IISExpressWebAppPath\DemoWeb" />
</application>	

這樣,除了 ℎttp://localhost:8561,也能用 ℎttp://localhost:8561/Demo 連上網站囉~

Tips of setting IIS Express appliationhost.config to change the URL for Visual Studio debugging.


Comments

# by 異特龍

那麼古蹟級別的ASP .NET網站 (不是MVC),沒有applicationhost.config,那要怎麼處理?

# by Jeffrey

to 異特龍,後來版本的 Visual Studio 用 IIS Express 跑網站,就是用 applicationhost.config 控制,不管 MVC 或老 ASPX。文章的案例是古老 Web Site Project (不是MVC),你可以實測看看,應該會找到。

Post a comment