【问题标题】:Using "~" in a path resolves as C:\在路径中使用“~”解析为 C:\
【发布时间】:2008-10-04 01:10:19
【问题描述】:

我正在尝试实现一个服务器控件,该控件会在 ASP.NET 站点的 web 目录中处理几个文件。我使用 VS Web Dev Express 2008 作为我的 IDE。当我调用HttpContext.Current.Request.ApplicationPath 来获取Web 根目录的路径以便我可以找到这些文件时,它返回C:。什么鬼?

绝对路径工作得很好,但我希望能够为服务器控件提供一个相对目录并让它完成它的事情。我做错了什么?

public String Target
{
    get { return _target; }
    set
    {
        if (value.StartsWith("~"))
        {
            // WTF? Gives me C:\? Why?
            _target = HttpContext.Current.Request.ApplicationPath +
                value.Substring(1);
        }
        else
        {
            _target = value;
        }
    }
}

private String _target;

protected override void Render(HtmlTextWriter writer)
{
    HtmlControl wrapper = new HtmlGenericControl("div");
    int fileCount = 0;

    try
    {
        DirectoryInfo dir = new DirectoryInfo(_target);
        foreach (FileInfo f in dir.GetFiles())
        {
            fileCount++;
            a = new HtmlAnchor();
            a.Attributes.Add("href", f.FullName);
            a.InnerHtml = f.Name;
            wrapper.Controls.Add(a);
        }
    }
    catch (IOException e)
    {
        throw e;
    }

    Controls.Add(wrapper);
    base.Render(writer);
}

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    这可能是因为它使用了开发网络服务器,它可以提供硬盘上任何目录中的文件。它没有任何特定的根。你能在 IIS 下运行你的项目(假设你的 windows 版本支持它),看看你是否得到相同的结果?

    要完全摆脱这个问题,您可以在 web.config 中硬编码您想要查看的路径,并解决 Request.ApplicationPath 返回的任何问题。

    [编辑]

    刚发现可以用

    HTTPContext.Current.Request.ServerVariables("APPL_PHYSICAL_PATH")
    

    返回应用程序在硬盘上的路径。我很确定这就是你要找的。如果这不正确,请查看所有其他 ServerVariables 以查看您是否可以获得所需的内容。

    【讨论】:

    • 不,我现在碰巧对 XP Home 感到束手无策。没有 IIS。我最终可能最终会对该目录进行硬编码,但重点是让控件的用户能够在设计时指定目录。
    • 是的,它一定是 VS 提供的迷你服务器......但你会认为它会知道它从哪里获取文件。
    【解决方案2】:

    这个怎么样:

    Server.MapPath(ResolveUrl("~/filename"))
    

    TLAnews.com 的页面上也有信息,标题为 Understanding Paths in ASP.NET

    【讨论】:

    • 那使用相同的网络根目录,所以我会遇到同样的问题。
    • 服务器必须以某种方式知道真实目录。尝试中断调试器并检查 HttpRequest 对象中每个与路径相关的属性。
    【解决方案3】:

    ADME Developer's Kit 可能是您在设计时尝试获取目录时所需要的。

    【讨论】:

      猜你喜欢
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 2017-04-09
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多