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

时间:2015-11-01 21:07:19

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

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

目录wwwrootproject.json中由密钥webroot定义(如下所示:http://docs.asp.net/en/latest/fundamentals/static-files.html

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

我想在运行时切换webroot,具体取决于在调试或生产模式下运行。由于我的静态assests(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)实现不同资产之间的切换。

2 个答案:

答案 0 :(得分:2)

我会采用不同的方式。

首先,当您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,对我而言,这将是一个部署任务,而不是在运行时步骤。

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

答案 1 :(得分:2)

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中的资产,并在wwwroot中放置优化的资产(连接,最小化,修订和在html中调整引用)。

如果我想测试发布版本,我可以从wwwroot投放。

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

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