【问题标题】:ASP.NET Relative Paths in Referenced Libraries引用库中的 ASP.NET 相对路径
【发布时间】:2009-04-28 16:36:10
【问题描述】:

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

当我运行网站时,ASP.NET 尝试在 source 路径中查找 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 网络服务器获取了 VS 设置的当前目录,实际上它设置为我的库项目的路径。我不确定 VS 究竟是如何确定将哪个项目用于路径的,但这至少可以解释正在发生的事情。谢谢乔。

【问题讨论】:

  • Visual Studio(至少 2005 年)将从它自己的默认目录开始,位于 %ProgramFiles% 下的某个位置。但我相信每次使用文件打开对话框打开文件时,都会更改工作目录。底线是:最好不要依赖工作目录。

标签: c# asp.net path


【解决方案1】:

如果您不提供路径,则文件访问通常会使用当前工作目录作为默认目录。在 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) 
    );
...

【讨论】:

  • 当前目录是我困惑的原因。如果我们按照当前目录逻辑,我们将在站点的某个地方,而不是在我们引用的某些库的代码中,这些库甚至不在站点根目录下。
  • 我正在使用 Cassini 运行该站点,因此如您所述,可能从 VS 继承了某些路径。
【解决方案2】:

完全猜测,我会说方法 LoadRulesFromXml() 正在查看托管站点的应用程序根 URL 的路径...即 C:\temp\Project.Core\ 可能是通过Server.MapPath("~")

你能贴出LoadRulesFromXML 的代码吗?或者你有那个代码吗?

【讨论】:

  • 在这种情况下,站点根目录类似于 C:\temp\Project.UI.Web。这就是为什么我不明白为什么我们会在一个甚至不在网络根目录下的位置看向一边。顺便说一句,它是为站点提供服务的 ASP.NET 开发 Web 服务器,并且站点和库位于相同的解决方案下,但在并行目录中。
猜你喜欢
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 2010-09-12
相关资源
最近更新 更多