ASP.NET MVC6:以编程方式设置 webroot

ASP.NET MVC6: Setting webroot programmatically

在 ASP.NET 中,MVC6 静态文件默认从 wwwroot 提供。

目录 wwwrootproject.json 中由关键字 webroot 定义(如此处记录:http://docs.asp.net/en/latest/fundamentals/static-files.html

我想知道是否可以在运行时(启动时)以编程方式设置此 webroot

我想在调试或生产模式下根据 运行 在运行时切换 webroot。由于我的静态资产(JS,CSS ...)是在构建时处理的(串联,缩小...)我认为最好的方法是拥有一个包含源资产的目录和一个包含优化资产(构建输出)。

在运行时,我想在生产模式 运行 时将 webroot 指向优化资产。

有人知道如何以编程方式设置 webroot 吗?

2015-11-19 更新: 在我的场景中,我只想使用静态文件。正如答案中所指出的,当使用带有 Razor 的 html 的服务器端呈现时,可以使用 TagHelpers (http://blogs.msdn.com/b/cdndevs/archive/2015/08/06/a-complete-guide-to-the-mvc-6-tag-helpers.aspx) 实现不同资产之间的切换。

我会走不同的路。

首先,当您 F5 应用程序时,它会自动将 ASPNET_ENV 设置为 Development。在 Razor 中,您可以使用 TagHelpers 来切换您的资源,如下所示:

<environment names="Development">            
    <link rel="stylesheet" href="~/css/site1.css" />
    <link rel="stylesheet" href="~/css/site2.css" />
</environment>
<environment names="Staging,Production">
    <link rel="stylesheet" href="~/css/site.min.css" asp-file-version="true"/>
</environment>

这将允许您根据您实际 运行 所在的环境更改 resources/javascript 甚至 HTML。

唯一缺少的是在您的暂存和生产机器上设置 ASPNET_ENV,它将自动被拾取。无需动态更改 wwwroot

如果您真的想坚持更改 wwwroot,对我来说,这将是一个部署任务,而不是 运行时 步骤。

否则,check the documentation 在您已经 link 编辑的静态文件上。它提供了有关如何在运行时在不同文件夹上 link 的代码示例。也许您缺少的是对 IHostingEnvironment 的依赖,它会为您提供环境变量来决定您所在的环境。

The documentation describes how to set up static file serving from any directory.

我的问题的解决方案是根据托管环境切换提供静态文件的目录,如下所示:

public class Startup
{
    private IHostingEnvironment env;
    public Startup(IHostingEnvironment env)
    {
        this.env = env;
    }

    public void Configure(IApplicationBuilder app)
    {

        if (env.IsDevelopment())
        {
            var webRootPath = env.WebRootPath;
            var webSrcPath = webRootPath + @"\..\wwwsrc";
            app.UseDefaultFiles(new DefaultFilesOptions()
            {
                FileProvider = new PhysicalFileProvider(webSrcPath),
                RequestPath = new PathString("")
            });
            app.UseStaticFiles(new StaticFileOptions()
            {
                FileProvider = new PhysicalFileProvider(webSrcPath),
                RequestPath = new PathString("")
            });
        }
        else
        {
            app.UseDefaultFiles();
            app.UseStaticFiles(); // use wwwroot
        }
    }

通过此设置,我可以将所有前端资产(html、javascript、css)放在 wwwsrc 中,并在开发期间从该目录提供未经处理的服务。

我的前端构建(基于 gulp)然后处理 wwwsrc 中的资产并将优化的资产(在 html 中连接、最小化、修订和调整参考)放入wwwroot.

如果我想测试发布版本,我可以从 wwwroot.

开始服务

调试和发布版本之间的切换可以通过在调试配置文件中设置环境变量 ASPNET_ENV 来完成(项目 -> 属性 -> 调试或在文件 Properties/launchSettings.json 中)。

感谢@Maxime Rouiller 在他的回答中为我指明了正确的方向。