Verwenden von Server.MapPath in externen C # -Klassen in ASP.NET

132

Ich versuche, den absoluten Pfad bestimmter Dateien in einer C # -Klasse zu ermitteln. Server.MapPathfunktioniert natürlich hervorragend für ASPX und ihre Code-Behind-Seiten, aber das existiert nicht in einer anderen Klassendatei. Ich habe es versucht HostingEnvironment.MapPath(), aber das beschwert sich, dass der relative virtuelle Pfad nicht erlaubt ist. Irgendwelche Gedanken?

System.Web ist bereits importiert.

Chet
quelle

Antworten:

302

Die ServerUtilityKlasse ist als Instanz in Ihrem verfügbar HttpContext. Wenn Sie sich in einer Umgebung befinden, in der Sie wissen, dass sie in der ASP.Net-Pipeline ausgeführt wird, können Sie sie verwenden

HttpContext.Current.Server.MapPath()

Sie müssen jedoch importieren System.Web.

womp
quelle
1
Obwohl dieser Beitrag älter als 2 Jahre ist, haben Sie mir enorm geholfen. Vielen Dank.
iarwain01
6
Was ist, wenn es nicht in dieser Pipeline ausgeführt wird?
Zaitsman
Wenn Sie nicht innerhalb von ASP.Net ausführen, ist es unwahrscheinlich, dass Ihr HttpContext festgelegt wird, es sei denn, Sie haben Ihre eigene Pipeline geschrieben :) Sie müssen sich auf die Methoden verlassen, die Ihr Ausführungskontext (Router?) Bereitstellt. Wenn Ihr Prozess Einblick in die Grundlagen Ihres Pfadroutings hat, können Sie sich die System.IO.Path-Methoden ansehen.
Womp
Dieser kompilierte aber Kontext ist außerhalb der Controller null, daher sind meine Codefehler. Ich denke, Womp sagt dort dasselbe. Wenn dies der Fall ist, können Sie außerhalb der Router auf MapPath zugreifen?
Edencorbin
34

Sie können auch verwenden:

var path = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/myfile.txt")

wenn

var path = Server.MapPath("~/App_Data");
var fullpath = Path.Combine(path , "myfile.txt");

ist nicht zugänglich

Yakir Manor
quelle
8

Können Sie nicht einfach einen Verweis auf hinzufügen System.Webund dann verwenden Server.MapPath?

Bearbeiten: Heutzutage würde ich empfehlen, die HostingEnvironment.MapPathMethode zu verwenden :

Es ist eine statische Methode in System.WebAssembly, die einen virtuellen Pfad einem physischen Pfad auf dem Server zuordnet. Es ist kein Verweis auf erforderlich HttpContext.

Dan Diplo
quelle
Nicht in externen Klassen.
Funwhilelost
Natürlich können Sie den Verweis auf eine externe Klasse hinzufügen. Aber natürlich müssen Sie es im Kontext einer Serveranforderung verwenden, damit HttpContext nicht null ist.
Dan Diplo
4
System.Reflection.Assembly.GetAssembly(type).Location

WENN die Datei, die Sie abrufen möchten, der Assembly-Speicherort für einen Typ ist. Wenn sich die Dateien jedoch relativ zum Assembly-Speicherort befinden, können Sie diesen mit dem System.IONamespace verwenden, um den genauen Pfad der Datei abzurufen.

David McEwing
quelle
-1: Was hat Sie zu der Annahme gebracht, dass er den Ort einer Versammlung haben wollte?
John Saunders
1
Er sagte, "bestimmte Dateien", er habe weder den Speicherort noch die Art der Dateien angegeben, daher könne es hilfreich sein, den Speicherort der Baugruppe zu kennen und in der Lage zu sein, relativ zu diesem Pfad zu arbeiten. Wenn er tatsächlich angegeben hätte, dass er sich noch in einem HttpContext befindet, hätte ich mir natürlich nicht die Mühe gemacht zu antworten.
David McEwing
David McEwing, was Sie vorschlagen, funktioniert nicht, da IIS die Assemblys nicht von dem Speicherort auf der Website lädt, an dem Sie sie installieren. Sie werden von einem temporären asp.net-Cache-Speicherort kopiert und geladen. Wenn Sie also eine GetAssembly oder GetExecutingAssembly ausführen, werden Sie auf den Speicherort der Assembly verweisen, dies hat jedoch nichts mit dem Speicherort der Website zu tun, auf die MapPath verweist.
Zumalifeguard
4

Ich benutze das auch:

System.Web.HTTPContext.Current.Server.MapPath
so erstaunlich
quelle
3
class test
{
public static void useServerPath(string path)
{
   if (File.Exists(path)
{
 \\...... do whatever you wabt
}
else
{
\\.....
}
}

Nun, wenn Sie die Methode aus dem Codebehind aufrufen

zum Beispiel :

protected void BtAtualizacao_Click(object sender, EventArgs e)
        {
             string path = Server.MapPath("Folder") + "\\anifile.txt";

            test.useServerPath(path);
}

Auf diese Weise ist Ihr Code zu einfach und mit einer Methode können Sie für jeden Aufruf mehrere Pfade verwenden :)

Ahmad
quelle
3

Dieser hat mir geholfen

//System.Web.HttpContext.Current.Server.MapPath //        
FileStream fileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/File.txt"),
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
Internetbenutzer
quelle
Willkommen bei stackoverflow. Wenig mehr Erklärung würde den Programmierkollegen helfen, zu verstehen, warum die Lösung funktioniert hat.
NJInamdar
1

Unabhängig davon, ob Sie im Kontext von ASP.NET ausgeführt werden oder nicht, sollten Sie HostingEnvironment.ApplicationPhysicalPath verwenden können

daudihus
quelle
0

Die Datei server.mappath ("") funktioniert auf der aspx-Seite. Wenn Sie den absoluten Pfad aus einer Klassendatei abrufen möchten, müssen Sie Folgendes verwenden:

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
Debendra Dash
quelle