生產

2011-10-27 46 views
0

「找不到路徑的一部分」 C#IIS部署我加載從我applicatin的XML文件:生產

XDocument.Load(HttpContext.Current.Server.MapPath("/") + "XMLMetadata\\Actions.1.xml"); 

在它工作正常的開發環境。

但是,我部署應用程序後,系統找不到它。
這是錯誤:
Exception Details: System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\inetpub\wwwroot\XMLMetadata\Actions.1.xml'.

文件部署到
C:\inetpub\wwwroot\MyApp\XMLMetadata\Actions.1.xml
,而不是:
C:\inetpub\wwwroot\XMLMetadata\Actions.1.xml

ASP .NET 4 MVC應用程序 我缺少什麼?

回答

0

很難說你在這裏工作的確切的框架和基類,但我猜ASP.NET。如果是這樣,你可能想看看Control.ResolveUrl()

然後,你應該得到像下面這樣的東西,而不是你的Load()調用。

XDocument.Load(this.ResolveUrl("~/XMLMetadata\\Actions.1.xml")); 
0

我用這樣的事情在過去的:

var appPath = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpContext.Current.Request.ApplicationPath; 
    if (appPath.Substring(appPath.Length - 1, 1) != "/") appPath = appPath + "/"; 
    var filePath = appPath + "XMLMetaData//Actions.1.xml"; 
+0

雖然當我重讀你的文章時,這可能不會有用。 – Chuck

0

嗯 - 你的意思是問,爲什麼它部署到C:\inetpub\wwwroot\MyApp\XMLMetadata\而非C:\inetpub\wwwroot\XMLMetadata\

因爲你已經回答了你錯誤的原因。

正是出於這個原因,您嘗試使用引用URL,即~\XMLMetadata\而不是硬編碼的位置。

還要確保您在本地使用IIS進行開發系統測試。

0

我很確定你正在尋找在這種情況下使用「〜」。與Server.MapPath一起使用的「〜」將爲您提供應用程序根目錄的物理路徑。作爲「/」將爲您提供域名根目錄的物理路徑。根據您的IIS設置,這些路徑可能會有所不同。

XDocument.Load(HttpContext.Current.Server.MapPath("~") + "XMLMetadata\\Actions.1.xml"); 
+0

這不起作用,它仍然會解析爲根目錄的物理路徑,而不是「MyApp」的虛擬目錄。 –

+0

只要他的網站被標記爲IIS中的應用程序,我認爲這仍然是正確的。我認爲這是發生了什麼,因爲它似乎是他的代碼運行的地方,並且在開發和生產中路徑不同。 – ptfaulkner

0

這是因爲你的web應用程序是坐在一個虛擬目錄,所以你將需要解決這一水平:

var applicationRoot = 
    HttpContext.Current.Server.MapPath(
     HttpRequest.ApplicationPath); 

發表談話ApplicationPath from MSDN

Use this property to construct a URL relative to the application root from a page or Web user control that is not in the root directory. This allows pages and shared controls that exist at different levels of a directory structure to use the same code to link to resources at fixed locations in the application.

0
XDocument.Load(HttpContext.Current.Server.MapPath("XMLMetadata/Actions.1.xml"));