【问题标题】:ASP.NET MVC6: Setting webroot programmaticallyASP.NET MVC6:以编程方式设置 webroot
【发布时间】:2015-11-01 21:07:18
【问题描述】:

在 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) 实现不同资产之间的切换。

【问题讨论】:

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


    【解决方案1】:

    我会走不同的路。

    首先,当您 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 的依赖,它将为您提供环境变量来决定您所在的环境。

    【讨论】:

    • 感谢您指出标签助手有助于在运行时根据环境在 erver 端以不同方式呈现 html。但在我的场景中,我根本不使用 Razor/服务器端渲染,我只想使用静态填充...(我相应地更新了问题)
    【解决方案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 中的资产,并将优化的资产(在 html 中连接、最小化、修订和调整引用)放入 wwwroot

    如果我想测试发布版本,我可以从wwwroot 提供服务。

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 2021-11-21
      • 2018-11-26
      相关资源
      最近更新 更多