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

时间:2015-07-13 15:30:49

标签: asp.net-core asp.net-core-mvc

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

我想知道的是,是否可以在Approot中存储和读取我自己的自定义文件?如果是这样的话?

例如,我没有使用实体框架,所以我需要一个地方放置sql安装和升级脚本,并且不希望将它们放在wwwroot下面。我也有导航站点地图等自定义配置文件,如果可以将它们放在其他地方,例如approot,我宁愿不放在wwwroot下面。

我知道我可以使用IHostingEnvironment env.MapPath(“〜/ somefileinwwwrootfoilder.json”)访问wwwroot下的文件

是否有类似的方法来访问approot下的文件?

2 个答案:

答案 0 :(得分:11)

接受的答案是正确的,但是自从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列表中。

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

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

答案 1 :(得分:8)

是的,有可能。只需获取app文件夹的路径,然后将其传递给配置或其他任何需要它的人:

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