2010-08-23 66 views
10

我有一些在ASP.NET MVC Web應用程序中運行時沒有HttpContext的進程。該過程需要能夠確定用於讀取/寫入數據的應用程序的目錄目錄的物理路徑。但是,由於它沒有HttpContext,所以我不會使用像Server.MapPath等花哨的東西。建議?如何確定沒有HttpContext的文件的物理路徑?

+1

即使'HttpContext.Current'可以爲空,「Server.MapPath」仍然可以工作。如果你不「擁有」它,也許你的意思是你錯過了對「System.Web」的引用? – Abel 2010-08-23 16:50:00

+0

@Abel:由於「Server」是HttpContext.Current(也是HttpApplication的一個屬性)的屬性,因此您不會「引用」「服務器」來在例如靜態構造函數中使用.MapPath,既不其中的這些在靜態環境下將可靠地提供。 「服務器」的類型是「HttpServerUtility」,其構造函數是內部的,所以你不能使用它,除非你可以從Global.asax中的HttpContext.Current或HttpApplication中獲取它。因此,HttpRuntime.AppDomainAppPath是您應該使用的內容,正如您在下面的答案中發佈的那樣。 – Triynko 2013-08-01 00:54:57

回答

12

在網站上,最好是使用HttpRuntime.AppDomainAppPath,因爲在執行路徑的某些時刻(即,當網站啓動時),沒有HttpContext.Current可用。

另請參閱this post

+3

爲什麼HttpRuntime.AppDomainPath比AppDomain.BaseDirectory好?' – Matt 2010-08-23 16:46:44

+4

由於它的語義。當你進入HttpRuntime時,最好是向運行時詢問正確的路徑,而不是自己動手。此外,它使您的代碼更具可讀性,您的意圖更清晰。最後,實現可能會改變,但即使在這種情況下,HttpRuntime仍然會返回正確的路徑,並且AppDomain不會(同樣可能適用於您已經啓動分離的AppDomain的罕見情況)。 – Abel 2010-08-23 16:51:17

+0

謝謝。我編輯上面,因爲它實際上是AppDomainAppPath而不是AppDomainPath(至少在.NET4上) – Matt 2010-08-23 17:48:20

4

最好的辦法是使用AppDomain.BaseDirectory屬性。只要你不擺弄自定義應用程序域,它就會指向你的根應用程序目錄。換一種說法;這兩個字符串是相同的:

string mapUsingAppDomain = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Contents"); 
string mapUsingServer = HttpContext.Current.Server.MapPath("~/Contents"); 
+0

謝謝你親愛的先生 – Matt 2010-08-23 16:46:27

+2

在一個網站中,最好使用'HttpRuntime.AppDomainPath',它保證返回正確的路徑。但driis是對的,我可以想到很少的情況下,這些方法可能會返回不同的東西。 – Abel 2010-08-23 16:47:56

相關問題