Что эквивалентно Server.MapPath в ASP.NET Core?

У меня есть эта строка в некотором коде, который я хочу скопировать в мой контроллер, но компилятор жалуется, что

Имя "Сервер" не существует в текущем контексте

var UploadPath = Server.MapPath("~/App_Data/uploads")

Как я могу получить эквивалент в ядре ASP.NET?

Ответ 1

В Asp.NET Core среда хостинга была абстрагирована с использованием интерфейса IHostingEnvironment

Свойство ContentRootPath предоставит вам доступ к абсолютному пути к файлам содержимого приложения.

Вы также можете использовать свойство WebRootPath, если хотите получить доступ к корневому пути, обслуживаемому через Интернет (по умолчанию папка www)

Вы можете внедрить эту зависимость в свой контроллер и получить к ней доступ следующим образом:

public class HomeController : Controller
    {
        private readonly IHostingEnvironment _hostingEnvironment;

        public HomeController(IHostingEnvironment hostingEnvironment)
        {
            _hostingEnvironment = hostingEnvironment;
        }

        public ActionResult Index()
        {
            string webRootPath = _hostingEnvironment.WebRootPath;
            string contentRootPath = _hostingEnvironment.ContentRootPath;

            return Content(webRootPath + "\n" + contentRootPath);
        }
    }

ОБНОВИТЬ

IHostingEnvironment помечен как устаревший в .NET Core 3.0, на что указывает @amir133. Пожалуйста, используйте IWebHostEnvironment, как показано ниже, если целевой платформой является .NET Core 3.0:

public class HomeController : Controller
    {
        private readonly IWebHostEnvironment _hostingEnvironment;

        public HomeController(IWebHostEnvironment hostingEnvironment)
        {
            _hostingEnvironment = hostingEnvironment;
        }

        public ActionResult Index()
        {
            string webRootPath = _hostingEnvironment.WebRootPath;
            string contentRootPath = _hostingEnvironment.ContentRootPath;

            return Content(webRootPath + "\n" + contentRootPath);
        }
    }

Ответ 2

Спасибо @ashin за его ответ, но IHostingEnvironment устарел в .Net core 3 !!

в соответствии с этим:

Устаревшие типы (предупреждение):

Microsoft.Extensions.Hosting.IHostingEnvironment
Microsoft.AspNetCore.Hosting.IHostingEnvironment
Microsoft.Extensions.Hosting.IApplicationLifetime
Microsoft.AspNetCore.Hosting.IApplicationLifetime
Microsoft.Extensions.Hosting.EnvironmentName
Microsoft.AspNetCore.Hosting.EnvironmentName

Новые типы:

Microsoft.Extensions.Hosting.IHostEnvironment
Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment
Microsoft.Extensions.Hosting.IHostApplicationLifetime
Microsoft.Extensions.Hosting.Environments 

Поэтому вы должны использовать IWebHostEnvironment вместо IHostingEnvironment.

public class HomeController : Controller
{
    private readonly IWebHostEnvironment _webHostEnvironment;

    public HomeController(IWebHostEnvironment webHostEnvironment)
    {
        _webHostEnvironment= webHostEnvironment;
    }

    public IActionResult Index()
    {
        string webRootPath = _webHostEnvironment.WebRootPath;
        string contentRootPath = _webHostEnvironment.ContentRootPath;

        return Content(webRootPath + "\n" + contentRootPath);
    }
}