&引用;找不到路径的一部分“;在生产环境中部署c#IIS

&引用;找不到路径的一部分“;在生产环境中部署c#IIS,c#,iis,file-io,iis-7.5,C#,Iis,File Io,Iis 7.5,我正在从我的应用程序加载xml文件: XDocument.Load(HttpContext.Current.Server.MapPath("/") + "XMLMetadata\\Actions.1.xml"); 在开发环境中,它运行良好 但部署应用程序后,系统无法找到它。 这就是错误: 异常详细信息:System.IO.DirectoryNotFoundException:找不到路径“C:\inetpub\wwwroot\XMLMetadata\Actions.1.xml”的一部分。 该文

我正在从我的应用程序加载xml文件:

XDocument.Load(HttpContext.Current.Server.MapPath("/") + "XMLMetadata\\Actions.1.xml"); 
在开发环境中,它运行良好

但部署应用程序后,系统无法找到它。
这就是错误:
异常详细信息:System.IO.DirectoryNotFoundException:找不到路径“C:\inetpub\wwwroot\XMLMetadata\Actions.1.xml”的一部分。

该文件已部署到
C:\inetpub\wwwroot\MyApp\XMLMetadata\Actions.1.xml

而不是:
C:\inetpub\wwwroot\XMLMetadata\Actions.1.xml

ASP.NET4MVC应用程序
我遗漏了什么?

很难说您在这里使用的确切框架和基类,但我猜是ASP.NET。如果是这样,您可能想看看
Control.ResolveUrl()

然后,您应该得到如下内容,而不是
Load()
调用

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

我过去也用过类似的方法:

    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";

嗯-你是想问为什么它部署到
C:\inetpub\wwwroot\MyApp\XMLMetadata\
而不是
C:\inetpub\wwwroot\XMLMetadata\

事实上,您已经回答了出现错误的原因

正是出于这个原因,您尝试使用参考URL,即
~\XMLMetadata\
,而不是硬编码的位置


另外,请确保您在本地使用IIS在开发系统上进行测试。

我很确定您希望在本例中使用“~”。与Server.MapPath一起使用的“~”将为您提供应用程序根目录的物理路径。其中“/”将为您提供域名根目录的物理路径。这些路径可以根据IIS设置的方式而有所不同

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

这是因为您的web应用程序位于虚拟目录中,因此您需要解析到该级别:

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

使用此属性构造相对于应用程序根的URL 来自不在根目录中的页面或Web用户控件。 这允许在不同级别上存在页面和共享控件 使用相同的代码链接到 应用程序中的固定位置


虽然当我重新阅读你的文章时,这可能不会有用。这不会起作用,它仍然会解析为根目录的物理路径,而不是“MyApp”的虚拟目录。我认为只要他的网站在IIS中标记为应用程序,这仍然是正确的。我假设这就是正在发生的事情,因为这似乎是他的代码运行的地方,开发和生产的路径不同。
XDocument.Load(HttpContext.Current.Server.MapPath("XMLMetadata/Actions.1.xml"));