Τρόπος λήψης απόλυτης διαδρομής στον εναλλακτικό τρόπο ASP.Net Core για το Server.MapPath

Τρόπος λήψης απόλυτης διαδρομής στον εναλλακτικό τρόπο ASP.Net Core για το Server.MapPath

Από το .Net Core έκδοση 3.0, θα πρέπει να είναι IWebHostEnvironment για πρόσβαση στο WebRootPath η οποία έχει μετακινηθεί στη διεπαφή περιβάλλοντος για τον ιστό.

Εισάγετε IWebHostEnvironment ως εξάρτηση στην εξαρτημένη τάξη. Το πλαίσιο θα το συμπληρώσει για εσάς

public class HomeController : Controller {
    private IWebHostEnvironment _hostEnvironment;

    public HomeController(IWebHostEnvironment environment) {
        _hostEnvironment = environment;
    }

    [HttpGet]
    public IActionResult Get() {
        string path = Path.Combine(_hostEnvironment.WebRootPath, "Sample.PNG");
        return View();
    }
}

Θα μπορούσατε να προχωρήσετε ένα βήμα παραπέρα και να δημιουργήσετε τη δική σας αφαίρεση και υλοποίηση υπηρεσίας παρόχου διαδρομής.

public interface IPathProvider {
    string MapPath(string path);
}

public class PathProvider : IPathProvider {
    private IWebHostEnvironment _hostEnvironment;

    public PathProvider(IWebHostEnvironment environment) {
        _hostEnvironment = environment;
    }

    public string MapPath(string path) {
        string filePath = Path.Combine(_hostEnvironment.WebRootPath, path);
        return filePath;
    }
}

Και εισάγετε IPathProvider σε εξαρτημένες τάξεις.

public class HomeController : Controller {
    private IPathProvider pathProvider;

    public HomeController(IPathProvider pathProvider) {
        this.pathProvider = pathProvider;
    }

    [HttpGet]
    public IActionResult Get() {
        string path = pathProvider.MapPath("Sample.PNG");
        return View();
    }
}

Βεβαιωθείτε ότι έχετε καταχωρίσει την υπηρεσία στο κοντέινερ DI

services.AddSingleton<IPathProvider, PathProvider>();

* Παραβίαση * Δεν συνιστάται, αλλά FYI μπορείτε να πάρετε μια απόλυτη διαδρομή από μια σχετική διαδρομή με var abs = Path.GetFullPath("~/Content/Images/Sample.PNG").Replace("~\\","");

Προτιμήστε τις παραπάνω προσεγγίσεις DI/Service, αλλά εάν βρίσκεστε σε κατάσταση που δεν είναι DI (π.χ. μια τάξη που έχει δημιουργηθεί με Activator ) αυτό θα λειτουργήσει.


.NET Core 3.0

Var 1:

string path = System.IO.Directory.GetCurrentDirectory();

Var 2:

string path = AppDomain.CurrentDomain.BaseDirectory.Substring(0, AppDomain.CurrentDomain.BaseDirectory.IndexOf("\\bin"));