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

ASP.NET MVC6:以编程方式设置webroot,asp.net,asp.net-core-mvc,Asp.net,Asp.net Core Mvc,在ASP.NET MVC6中,默认情况下从wwwroot提供静态文件 目录wwwroot由键webroot在project.json中定义(如本文所述:) 我想知道是否可以在运行时(启动时)以编程方式设置此webroot 我想在运行时切换webroot,具体取决于在调试或生产模式下运行。因为我的静态资产(JS、CSS…)是在构建时处理的(连接、缩小…),所以我认为最好的方法是有一个包含源资产的目录和一个包含优化资产的目录(构建输出) 在运行时,我希望在生产模式下运行时将webroot指向优化的资

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

目录
wwwroot
由键
webroot
project.json
中定义(如本文所述:)

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

我想在运行时切换
webroot
,具体取决于在调试或生产模式下运行。因为我的静态资产(JS、CSS…)是在构建时处理的(连接、缩小…),所以我认为最好的方法是有一个包含源资产的目录和一个包含优化资产的目录(构建输出)

在运行时,我希望在生产模式下运行时将
webroot
指向优化的资产

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


更新2015-11-19:在我的场景中,我只想使用静态文件。正如在回答中指出的,当使用Razor在服务器端呈现html时,可以使用TagHelpers()实现不同资产之间的切换。

我将采用不同的方法

首先,当您将应用程序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>

这将允许您根据实际运行的环境更改资源/javascript甚至HTML

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

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

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

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

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
提供服务

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


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

感谢您指出了标记帮助程序,这些帮助程序可以根据环境的不同,在运行时在服务器端以不同的方式呈现html。但在我的场景中,我根本不使用Razor/服务器端渲染,我只想使用静态填充。。。(我据此更新了问题)