ASP. NET Core 3.0 HttpContext.Current.Server.MapPath - PullRequest
1 голос
/ 14 января 2020

Я перенесу проект classi c C# MVC на .NET Core, и у меня есть служебный проект, в котором мне нужно получить доступ к папке App_Data.

Я уже создаю в этом новом проекте свой App_Data папка вне wwwroot, но мне нужно получить ссылку на нее из этого служебного проекта.

enter image description here

Это мой старый код:

 public static class Common
    {
      private static void DeleteTestFiles()
            {
                var path = HttpContext.Current.Server.MapPath("~/App_Data/Files");
                .....
    }
}

Я читал, что в 3.0 есть способ сделать это, вот пример:

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

Но приведенный выше код предназначен для контроллера, который живет в веб-проекте. Общий класс моих служебных проектов не является Контроллером и является классом stati c, поэтому у меня не может быть конструктора, чтобы автоматически вводить IWebHostEnvironment.

Любая подсказка, как мне получить путь или, может быть, мне нужно вручную ввести IWebHostEnvironment, но не имею понятия.

1 Ответ

1 голос
/ 14 января 2020

Не используйте класс c. Вы можете сохранить что-то похожее на ваш класс и зарегистрировать его как синглтон.

public class Common
{
    private readonly IWebHostEnvironment _env;

    public Common(IWebHostEnvironment env)
    {
        _env = env;
    }

    private void DeleteTestFiles()
    {
            var path = Path.Combine(_env.ContentRootPath, "App_Data/Files");
            .....
    }
}

Затем в Startup.ConfigureServices:

services.AddSingleton<Common>();

Наконец, введите Common, где вам нужно это, вместо того, чтобы просто статически ссылаться на класс. Вот как все работает в DI, статика не - go.

ОБНОВЛЕНИЕ:

Чтобы это работало, потому что проект Utility ссылается на Microsoft.NETCore.App, а не Microsoft.AspNetCore.App Framework, тогда вы должны использовать IHostEnvironment вместо IWebHostEnvironment.

IWebHostEnvironment фактически реализует IHostEnvironment интерфейс.

Сделал тест и все работает хорошо! Я мог бы получить ContentRootPath.

public class Common
    {
        private readonly IHostEnvironment _env;

        public Common(IHostEnvironment env)
        {
            _env = env;
        }

        private void DeleteTestFiles()
        {
                var path = Path.Combine(_env.ContentRootPath, "App_Data/Files");
                .....
        }
    }
...