3 Stimmen

Die Verwendung von "~" in einem Pfad führt zur Auflösung als C:\

Ich versuche, ein Server-Steuerelement zu implementieren, das ein paar Dateien innerhalb des Web-Verzeichnisses einer ASP.NET-Website frobs. Ich verwende VS Web Dev Express 2008 als meine IDE. Wenn ich aufrufe HttpContext.Current.Request.ApplicationPath um einen Pfad zum Web Root zu erhalten, damit ich diese Dateien finden kann, gibt er C: zurück. Was zum Teufel?

Absolute Pfade funktionieren ganz gut, aber ich möchte in der Lage sein, die Serversteuerung mit einem relativen Verzeichnis zu füttern und sie einfach ihr Ding machen zu lassen. Was habe ich falsch gemacht?

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);
}

3voto

Kibbee Punkte 64039

Das könnte daran liegen, dass er den Entwicklungs-Webserver verwendet, der Dateien aus jedem beliebigen Verzeichnis auf Ihrer Festplatte bereitstellen kann. Er hat keinen speziellen Root. Können Sie Ihr Projekt unter IIS ausführen (vorausgesetzt, Ihre Windows-Version unterstützt dies) und sehen, ob Sie die gleichen Ergebnisse erhalten?

Um das Problem vollständig zu beseitigen, können Sie den Pfad, den Sie in Ihrer web.config betrachten möchten, hart kodieren und alle Probleme mit dem Request.ApplicationPath umgehen, der zurückgegeben wird.

[EDIT]

Ich habe gerade herausgefunden, dass man die

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

um den Pfad Ihrer Anwendung auf der Festplatte zurückzugeben. Ich bin mir ziemlich sicher, dass Sie genau danach suchen. Wenn das nicht der Fall ist, sehen Sie sich alle anderen ServerVariablen um zu sehen, ob Sie bekommen können, was Sie suchen.

2voto

Mark Cidade Punkte 95914

Wie wäre es damit:

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

Es gibt auch Informationen auf einer Seite mit dem Titel TLAnews.com, Verstehen von Pfaden in ASP.NET .

-1voto

El ADME-Entwickler-Kit ist vielleicht genau das, was Sie brauchen, wenn Sie versuchen, das Verzeichnis zur Entwurfszeit zu erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X