2017-09-15 25 views
5

Mam następującą hierarchię projektu:.net core - StaticFiles z niestandardowych DefaultFiles-Definicje

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

i teraz chcę użyć angulardev.html jako punkt wyjścia podczas uruchamiania aplikacji.

Próbowałem wykonać w Startup.cs/Configure, ale to nie działa.

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

Musisz ustawić właściwość FileProvider na obu DefaultFileOptions i StaticFIleOptions. W przeciwnym razie oprogramowanie pośrednie DefaultFiles będzie szukało w wwwroot. – OdeToCode

Odpowiedz

4

Używam tego:

 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

Dziękuję. niestety to nie działa dla opisanej przeze mnie hierarchii. Jest tak na wypadek, gdy angulardev.html znajduje się w folderze wwwroot. – MaxPower

+0

Cieszę się, że udało się znaleźć rozwiązanie. Twoje zdrowie! –

0

Po zmianie w którym pliki statyczne są ładowane z, to nie zmienia w którym pliki „default” są ładowane z.

Jeśli spojrzeć na rzeczywisty kod middleware na Github: https://github.com/damianh/StaticFilesMiddleware/blob/475aef7f56b92d6420ec700dcb397841b6842ed8/src/Microsoft.Owin.StaticFiles/DefaultFilesMiddleware.cs

Widać to nadal próbuje załadować plik ręcznie. Nie dba o to, jakie opcje ustawiono dla StaticFiles. Głównie dlatego, że zakładam, że możesz mieć domyślną stronę bez przy użyciu oprogramowania pośredniego plików statycznych.

Pamiętaj, że podczas wywoływania app.UseDefaultFiles() jest to oprogramowanie pośrednie, a nie ustawienie. To faktycznie "robi" coś, aby spróbować i zwrócić ten plik do ciebie.

W każdym razie, jeśli chcesz użyć niestandardowego folderu do załadowania strony domyślnej, musisz po prostu przekazać tego samego dostawcę. Na przykład, ten kod powinien działać dobrze dla ciebie:

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

Pracuje teraz na mnie z mieszanką z @Irena bogaty i mój dawny rozwiązanie:

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 = "" 
     }); 
}