生产

2011-10-27 47 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"));