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

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

The name 'Server' does not exist in the current context

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

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

Используйте IHostingEnvironment.WebRootPath, а затем используйте Path.Combine со вторым аргументом, назначенным целевому каталогу. См. Эквивалент Server.MapPath в ASP.NET Core для получения дополнительной информации.

Tetsuya Yamamoto 21.03.2018 06:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
62
1
54 347
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

ОБНОВЛЕНИЕ: IHostingEnvironment устарел. См. Обновление ниже.

В Asp.NET Core 2.2 и ниже среда размещения была абстрагирована с помощью интерфейса 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);
        }
    }

ОБНОВЛЕНИЕ - .NET CORE 3.0 и выше

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

Microsoft аккуратно разделила свойства среды хоста между этими интерфейсами. См. Определение интерфейса ниже:

namespace Microsoft.Extensions.Hosting
{
  public interface IHostEnvironment
  {
    string EnvironmentName { get; set; }
    string ApplicationName { get; set; }
    string ContentRootPath { get; set; }
    IFileProvider ContentRootFileProvider { get; set; }
  }
}

namespace Microsoft.AspNetCore.Hosting
{
  public interface IWebHostEnvironment : IHostEnvironment
  {
    string WebRootPath { get; set; }
    IFileProvider WebRootFileProvider { get; set; }
  }
}

Я отредактировал это, чтобы вы не копировали ответ @ aamir133.

Mukus 11.03.2020 00:21

Спасибо .. Фактически, я не копировал код aamir, я скопировал свой первоначальный ответ и заменил интерфейс. :) Но то, что вы сказали, имеет смысл, я снова отредактировал и просто связал ответ с ответом aamir, а также предоставил определение интерфейса для людей, которым интересно знать, как свойства расположены между этими интерфейсами ..

ashin 12.03.2020 06:15

Непонятно, каков фактический ответ на OP ?!

niico 25.01.2021 04:26

Ненавижу внедрение зависимостей. Как я могу получить среду хостинга без использования DI?

A X 27.02.2021 08:45

Просто столкнулся с этим, пытаясь обновить сайт, чтобы добавить новый контент. Почему это было сделано? Мне это определенно кажется менее интуитивным. На самом деле, похоже, прошли те времена, когда Microsoft развлекала разработку. Теперь весь код кажется чем-то вроде хакерской работы со стороны детей нового поколения, которые не хотят писать весь код.

jp2code 07.04.2021 19:09

.Net 5, .net core 3

Например, я хочу найти ~/wwwroot/CSS

public class YourController : Controller
{
    private readonly IWebHostEnvironment _webHostEnvironment;

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

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

        string path  = "";
        path = Path.Combine(webRootPath , "CSS");
        //or path = Path.Combine(contentRootPath , "wwwroot" ,"CSS" );
        return View();
    }
}

Некоторые хитрости

Также, если у вас нет контроллера или службы, следуйте последней части и зарегистрируйте его класс как одноэлементный. Затем в Startup.ConfigureServices:

services.AddSingleton<your_class_Name>();

Наконец, введите your_class_Name там, где он вам нужен.


.Net Core 2

Например, я хочу найти ~/wwwroot/CSS

public class YourController : Controller
{
    private readonly IHostingEnvironment _HostEnvironment;

    public YourController (IHostingEnvironment HostEnvironment)
    {
        _HostEnvironment= HostEnvironment;
    }

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

        string path  = "";
        path = Path.Combine(webRootPath , "CSS");
        //or path = Path.Combine(contentRootPath , "wwwroot" ,"CSS" );
        return View();
    }
}

Подробнее

Спасибо @Ashin, но IHostingEnvironment устарел в MVC 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.

Спасибо amir133 за указание .. я обновил ответ

ashin 07.05.2019 07:43

@ashin Вы обновили ответ, чтобы написать именно то, что написал amir133. Почему бы просто не упомянуть вместо этого ссылку на ответ amir133?

Mukus 11.03.2020 00:18

используйте, например: var fullPath = Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json");

этот ответ не будет работать для среды Linux, см. stackoverflow.com/questions/12916204/…

Yegor Androsov 28.02.2020 23:39

Спасибо за комментарий, не знала

German Gracia 05.03.2020 10:10

Предложение принятого ответа достаточно хорошо в большинстве сценариев, однако - поскольку оно зависит от Внедрение зависимости - ограничено контроллерами и представлениями: для того, чтобы иметь правильную замену Server.MapPath, к которой можно получить доступ из не-одноэлементных вспомогательных классов, мы можем добавить следующую строку (s) кода в конце метода Configure() файла Startup.cs приложения:

// setup app's root folders
AppDomain.CurrentDomain.SetData("ContentRootPath", env.ContentRootPath);
AppDomain.CurrentDomain.SetData("WebRootPath", env.WebRootPath);

Таким образом, мы сможем получить их из любого класса (включая, но не ограничиваясь, контроллеры и представления) следующим образом:

var contentRootPath = (string)AppDomain.CurrentDomain.GetData("ContentRootPath");
var webRootPath = (string)AppDomain.CurrentDomain.GetData("WebRootPath");

В дальнейшем это можно использовать для создания статического вспомогательного метода, который позволит нам иметь ту же функциональность, что и старый добрый Server.MapPath:

public static class MyServer 
{
    public static string MapPath(string path)
    {
        return Path.Combine(
            (string)AppDomain.CurrentDomain.GetData("ContentRootPath"), 
            path);
    }
}

Что можно использовать следующим образом:

var docPath = MyServer.MapPath("App_Data/docs");

Для получения дополнительной информации об этом подходе и немного предыстории, взгляните на эта почта в моем блоге.

Другие вопросы по теме