在引用的库中使用ASP.NET相对路径

5
我有一个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。


Visual Studio(至少2005版)将在其自己的默认目录下启动,该目录位于%ProgramFiles%的某个位置。但是我认为,每次使用文件打开对话框打开文件时,这都可能会更改工作目录。底线是:最好不要依赖于工作目录。 - Joe
2个回答

14
如果不提供路径,则文件访问通常会使用当前工作目录作为默认路径。在ASP.NET中,这可能是您的Web应用程序目录。
通常不建议依赖于当前工作目录,因此您可以使用Path.Combine指定不同的默认目录,例如相对于AppDomain.CurrentDomain.BaseDirectory的目录,这也是ASP.NET应用程序的Web应用程序目录。
应该显式添加路径到要打开的文件名。您还可以尝试跟踪当前工作目录。
从Visual Studio运行Cassini时,当前目录继承自Visual Studio的工作目录:这似乎是您的情况。
即:
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) 
    );
...

当前目录是我感到困惑的原因。如果我们按照当前目录的逻辑,我们应该在站点的某个地方,而不是在引用的某个甚至不在站点根目录下的库的代码中。 - dnewcome
我正在使用 Cassini 运行网站,所以可能会继承自 VS 中的某些路径,正如您所提到的。 - dnewcome

2
完全猜测的话,我会说方法 LoadRulesFromXml() 正在查看应用程序根URL的路径,即站点托管的位置...可能是通过执行 Server.MapPath("~") 来实现的,该路径为 C:\temp\Project.Core\。
你能发布 LoadRulesFromXML 的代码吗?或者你有这个代码吗?

在这种情况下,站点根目录类似于C:\temp\Project.UI.Web。这就是为什么我无法理解为什么我们会看向一个甚至不在Web根目录下的位置。顺便说一句,它是由ASP.NET开发Web服务器提供网站服务,网站和库位于同一解决方案中,但在平行目录中。 - dnewcome

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接