在 asp.net 5 中是否可以在 approot 而不是 wwwroot 中存储和读取自定义文件?

in asp.net 5 is it possible to store and read custom files in approot instead of wwwroot?

当您部署 asp.net5/mvc6 应用程序时,会有 wwwroot 文件夹,其中包含 css、js、图像等网络资源,还有 approot 文件夹,其中包含包和源代码属于。 例如,Microsoft.Framework.Configuration 命名空间中的 类 似乎必须能够从 approot 下面读取文件,因为那是 config.json 文件所在的位置。

我想知道的是,是否可以在approot中存储和读取自己的自定义文件?如果是的话怎么办?

例如,我没有使用 Entity Framework,所以我需要一个地方来放置 sql 安装和升级脚本,并且不希望将它们放在 wwwroot 下。我还有导航站点地图之类的自定义配置文件,如果可以将它们放在其他地方(例如 approot),我宁愿不放在 wwwroot 下面。

我知道我可以使用 IHostingEnvironment env.MapPath("~/somefileinwwwrootfoilder.json")

访问 wwwroot 下的文件

approot下有没有类似的方式访问文件?

是的,这是可能的。只需获取您的应用程序文件夹的路径并将其传递给配置或其他需要它的人:

public class Startup
{
    public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
    {
        var wwwrootRoot = env.WebRootPath;
        var appRoot = appEnv.ApplicationBasePath;

接受的答案是正确的,但是自从 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 文件夹添加到 project.json.

中的 publishOptions include 列表中

如评论中所述,要在 ASP.NET MVC Core 2 中正确部署 AppData 文件夹(使用 *.csproj 文件,而不是project.json),语法如下:

  <ItemGroup>
    <None Include="AppData\*" CopyToPublishDirectory="PreserveNewest" />
  </ItemGroup>