2017-09-15 95 views
5

我有以下的項目層次:.NET核心 - StaticFiles定製DefaultFiles-定義

-MyDotNetProject 
... 
L wwwroot 
L angular 
    L src 
    L angulardev.html 
    L index.html 

,現在我想在啓動應用程序時使用angulardev.html爲出發點。

我試過Startup.cs /配置但它不起作用。

DefaultFilesOptions defaultFilesOptions = new DefaultFilesOptions(); 
defaultFilesOptions.DefaultFileNames.Clear(); 
defaultFilesOptions.DefaultFileNames.Add("angulardev.html"); 
app.UseDefaultFiles(defaultFilesOptions); 

var path = Path.Combine(env.ContentRootPath, "angular/src"); 
var provider = new PhysicalFileProvider(path); 
var options = new StaticFileOptions(); 
options.RequestPath = ""; 
options.FileProvider = provider; 
app.UseStaticFiles(options); 
+0

您需要設置上都FileProvider財產DefaultFileOptions和StaticFIleOptions。否則,DefaultFiles中間件將在wwwroot中查找。 – OdeToCode

回答

4

我用這個:

 app.Use(async (context, next) => { 
      await next(); 

      if (context.Response.StatusCode == 404 && 
       !Path.HasExtension(context.Request.Path.Value) && 
       !context.Request.Path.Value.StartsWith("/api/")) 
      { 
       context.Request.Path = "/angulardev.html"; 

       await next(); 
      } 
     }); 

     app.UseAuthentication(); 
     app.UseDefaultFiles(); 
     app.UseStaticFiles(); 
     app.UseMvcWithDefaultRoute(); 
+0

謝謝。不幸的是,這對我描述的層次結構不起作用。這是在angulardev.html位於wwwroot文件夾中的情況下。 – MaxPower

+0

很高興你能找到解決方案。乾杯! –

0

當您更改其中的靜態文件被加載從,這裏的「默認」的文件是從加載它不會改變。

如果你看一下在Github上實際的中間件代碼:https://github.com/damianh/StaticFilesMiddleware/blob/475aef7f56b92d6420ec700dcb397841b6842ed8/src/Microsoft.Owin.StaticFiles/DefaultFilesMiddleware.cs

你可以看到它仍然試圖手動加載文件。它不關心你爲StaticFiles設置了什麼選項。主要是因爲我認爲你可以使用默認頁面而不使用使用靜態文件中間件。請記住,當你調用app.UseDefaultFiles()時,它是一箇中間件,而不是設置。它實際上是在「做」某件事來嘗試並將該文件返回給你。

無論如何,如果你想使用非標準的文件夾來加載默認頁面,你只需要傳入相同的提供者。例如,此代碼應工作對你罰款:

DefaultFilesOptions defaultFilesOptions = new DefaultFilesOptions(); 
defaultFilesOptions.DefaultFileNames.Clear(); 
defaultFilesOptions.DefaultFileNames.Add("angulardev.html"); 
defaultFilesOptions.FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"angular", @"src")); 
defaultFilesOptions.RequestPath = new PathString(""); 
app.UseDefaultFiles(defaultFilesOptions); 


app.UseStaticFiles(new StaticFileOptions() 
{ 
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"angular", @"src")), 
    RequestPath = new PathString("") 
}); 
1

現在對我的作品從@Irena豐富的混合和我以前的解決方案:

if (env.IsDevelopment()) 
{ 
    app.Use(async (context, next) => 
    { 
      await next(); 
      if (context.Response.StatusCode == 404 && 
        !Path.HasExtension(context.Request.Path.Value) && 
        !context.Request.Path.Value.StartsWith("/api/")) 
      { 
       context.Request.Path = "/src/angulardev.html"; 
       await next(); 
      } 
     }); 

     DefaultFilesOptions options = new DefaultFilesOptions(); 
     options.DefaultFileNames.Clear(); 
     options.DefaultFileNames.Add("angulardev.html"); 
     app.UseDefaultFiles(options); 
     app.UseStaticFiles(); 

     app.UseStaticFiles(new StaticFileOptions() 
     { 
      FileProvider = new PhysicalFileProvider(
       Path.Combine(Directory.GetCurrentDirectory(), @"angular")), 
       RequestPath = "" 
     }); 
}