2015-11-01 146 views
5

默認情況下,在ASP.NET MVC6靜態文件從wwwroot提供服務。ASP.NET MVC6:以編程方式設置webroot

目錄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)可以實現不同資產之間的切換。

回答

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發佈。

在調試配置文件(項目 - >屬性 - >調試或文件Properties/launchSettings.json)中設置環境變量ASPNET_ENV可以在調試和發佈版本之間切換。

感謝@Maxime Rouiller指導我在他的回答中正確的方向。

2

我會採取不同的方式。

首先,當你F5你的應用程序時,它自動將ASPNET_ENV設置爲Development。在剃鬚刀,你就可以使用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的依賴,它會爲你提供環境變量來決定你是哪個環境。

+0

感謝您指出有助於在運行時以不同方式在erver端呈現html的標記助手,具體取決於環境。但在我的方案中,我根本不使用Razor /服務器端渲染,我只想使用靜態填充...(我相應地更新了該問題) – jbandi

+1

更新了我的答案。 –