C# 引用库中的ASP.NET相对路径

C# 引用库中的ASP.NET相对路径,c#,asp.net,path,C#,Asp.net,Path,我有一个ASP.NET网站,其中我正在从xml文件加载一些验证规则。这个xml文件名没有路径信息,是在库中硬编码的。(我知道硬编码的名称不太好,但让我们在本例中使用它) 当我运行该网站时,ASP.NET尝试在源路径中查找xml文件,其中包含硬编码名称的C#文件。这对我来说是完全令人难以置信的,因为我无法理解,在运行时,我们甚至可以考虑使用源路径来解析不合格的文件名 // the config class, in C:\temp\Project.Core\Config.cs public stat

我有一个ASP.NET网站,其中我正在从xml文件加载一些验证规则。这个xml文件名没有路径信息,是在库中硬编码的。(我知道硬编码的名称不太好,但让我们在本例中使用它)

当我运行该网站时,ASP.NET尝试在源路径中查找xml文件,其中包含硬编码名称的C#文件。这对我来说是完全令人难以置信的,因为我无法理解,在运行时,我们甚至可以考虑使用源路径来解析不合格的文件名

// the config class, in C:\temp\Project.Core\Config.cs
public static string ValidationRulesFile {
   get { return m_validationRulesFile; }
} private static string m_validationRulesFile = "validation_rules.xml";

// using the file name
m_validationRules.LoadRulesFromXml( Config.ValidationRulesFile, "Call" );
下面是一个例外,显示我们正在查找的路径与Config.cs相同:

  Exception Details: System.IO.FileNotFoundException: 
Could not find file 'C:\temp\Project.Core\validation_rules.xml'.
谁能给我解释一下吗?我已经知道在ASP.NET中通常应该如何处理路径,所以请不要给出解决方案。我真的很想理解这一点,因为这真的让我很惊讶,而且它会让我烦恼不已

更新 以下是LoadRulesFromXml的相关代码

public void LoadRulesFromXml( string in_xmlFileName, string in_type ) 
{       
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load( in_xmlFileName );
... 
更新2
看起来Cassini web服务器的当前目录是由VS设置的,实际上它被设置为我的库项目的路径。我不确定VS是如何确定路径使用哪个项目的,但这至少解释了正在发生的事情。谢谢Joe。

完全猜一猜,我会说方法
LoadRulesFromXml()
正在查看站点所在位置的应用程序根URL路径。。。这是C:\temp\Project.Core\ 可能通过执行
Server.MapPath(“~”


您可以发布XML中加载规则的代码吗?或者您是否有该代码?

如果您不提供路径,则文件访问通常将使用当前工作目录作为默认目录。在ASP.NET中,这可能是您的web应用程序目录

依赖当前工作目录通常不是一个好主意,因此您可以使用Path.Combine来指定不同的默认目录,例如相对于AppDomain.CurrentDomain.BaseDirectory的目录,AppDomain.CurrentDomain.BaseDirectory也是ASP.NET应用程序的web应用程序目录

应该将路径显式添加到要打开的文件名中。您还可以尝试跟踪当前工作目录

从VisualStudio运行Cassini时,当前目录继承自VisualStudio的工作目录:这似乎是您的情况

即:


当前目录是我感到困惑的原因。如果我们按照当前的目录逻辑,我们将在某个地方的站点下,而不是在我们引用的某个库的代码中,该库甚至不在站点根目录下。我正在使用Cassini运行该站点,因此可能会像您提到的那样从VS继承某些路径。在这种情况下,站点根目录类似于C:\temp\Project.UI.Web。这就是为什么我不能理解为什么我们会在一个甚至不在web根目录下的位置上向外看。顺便说一句,为网站提供服务的是ASP.NET开发web服务器,网站和库位于同一解决方案下,但位于并行目录中。Visual Studio(至少2005年)将在其自己的默认目录中启动,位于%ProgramFiles%下的某个位置。但我相信每次使用文件打开对话框打开文件时,都会更改工作目录。底线是:最好不要依赖工作目录。
public void LoadRulesFromXml( string in_xmlFileName, string in_type ) 
{   
    // To see what's going on
    Debug.WriteLine("Current directory is " +
              System.Environment.CurrentDirectory);    

    XmlDocument xmlDoc = new XmlDocument();    

    // Use an explicit path
    xmlDoc.Load( 
       System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
       in_xmlFileName) 
    );
...