в 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
Бележка от версия, 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