2017-09-15 92 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 = "" 
     }); 
}