в asp.net 5 можно хранить и читать пользовательские файлы в approot вместо wwwroot?

когда вы развертываете приложение asp.net5/mvc6, есть папка wwwroot, к которой принадлежат веб-ресурсы, такие как css, js, изображения, и папка approot, к которой принадлежат пакеты и исходный код. Кажется, что классы в пространстве имен Microsoft.Framework.Configuration, например, должны иметь возможность читать файлы ниже approot, поскольку именно там будут жить файлы config.json.

Я хочу знать, возможно ли хранить и читать собственные файлы в approot? и если да то как?

Например, я не использую Entity Framework, поэтому мне нужно место для размещения сценариев установки и обновления sql, и я бы предпочел не помещать их под wwwroot. У меня также есть настраиваемые файлы конфигурации для таких вещей, как навигационная карта сайта, которые я бы предпочел не размещать ниже wwwroot, если их можно разместить в другом месте, например approot.

Я знаю, что могу получить доступ к файлам ниже wwwroot, используя IHostingEnvironment env.MapPath("~/somefileinwwwrootfoilder.json")

Есть ли аналогичный способ доступа к файлам под approot?


person Joe Audette    schedule 13.07.2015    source источник


Ответы (2)


Да, это возможно. Просто получите путь к папке вашего приложения и передайте его в конфигурацию или кому еще это нужно:

public class Startup
{
    public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
    {
        var wwwrootRoot = env.WebRootPath;
        var appRoot = appEnv.ApplicationBasePath;
person Victor Hurdugaci    schedule 13.07.2015
comment
поэтому я получаю путь к файлу, например string path = env.MapPath(appEnv.ApplicationBasePath + /somefolder/somefile.json); ? - person Joe Audette; 13.07.2015
comment
Я вижу, ApplicationBasePath — это путь к файловой системе, а не виртуальный, поэтому мы должны использовать appRoot + Path.DirectorySeparatorChar + имя папки + Path.DirectorySeparatorChar + имя файла; построить путь платформо-нейтральным способом - person Joe Audette; 13.07.2015
comment
Просто используйте Path.Combine :) - person davidfowl; 15.07.2015
comment
Обратите внимание на выпуск .NET Core 1.0, IApplicationEnvironment больше нет, а ApplicationBasePath теперь доступен как IHostingEnvironment.ContentRootPath. - person McGuireV10; 18.07.2016

Принятый ответ правильный, но с момента выпуска ASP.NET Core 1.0 кое-что изменилось, поэтому я решил немного прояснить ситуацию.

Что я сделал, так это создал папку в своем проекте под названием AppData. Вы можете называть это как угодно.

Примечание. этого нет в wwwroot, потому что мы хотим сохранить конфиденциальность этих данных.

Затем вы можете использовать IHostingEnvironment, чтобы получить доступ к пути к папке. Этот интерфейс можно внедрить как зависимость в какую-нибудь вспомогательную службу, и в итоге вы получите что-то вроде этого:

public class AppDataHelper
{
    private readonly IHostingEnvironment _hostingEnvironment;
    private const string _appDataFolder = "AppData";

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

    public async Task<string> ReadAllTextAsync(string relativePath)
    {
        var path = Path.Combine(_hostingEnvironment.ContentRootPath, _appDataFolder, relativePath);

        using (var reader = File.OpenText(path))
        {
            return await reader.ReadToEndAsync();
        }
    }
}

Кроме того, для правильного развертывания мне пришлось добавить папку AppData в список publishOptions include в project.json.

Как упоминалось в комментариях, для правильного развертывания папки AppData в ASP.NET MVC Core 2 (с использованием файла *.csproj вместо project.json) используется следующий синтаксис:

  <ItemGroup>
    <None Include="AppData\*" CopyToPublishDirectory="PreserveNewest" />
  </ItemGroup>
person craftworkgames    schedule 30.08.2016
comment
Как вы это делаете теперь, когда project.json был заменен на .csproj. Я попытался вставить <Folder Include="AppData\" CopyToPublishDirectory="PreserveNewest" />, но это ничего не скопировало в папку. - person Scott Chamberlain; 19.05.2017
comment
Тот же вопрос здесь. - person arao6; 19.05.2017
comment
Разобрался: <ItemGroup> <None Include="AppData\*" CopyToPublishDirectory="PreserveNewest" CopyToOutputDirectory="PreserveNewest" /> </ItemGroup> - person arao6; 20.05.2017