.net Core - 具有自定义DefaultFiles-Definitions的StaticFiles

Geo*_*ris 5 c# startup asp.net-core

我有以下项目层次结构:

-MyDotNetProject
 ...
 L wwwroot
 L angular
   L src
     L angulardev.html
     L index.html
Run Code Online (Sandbox Code Playgroud)

现在我想在启动应用程序时使用angulardev.html作为起点.

我试过在Startup.cs/Configure中跟进,但它不起作用.

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);
Run Code Online (Sandbox Code Playgroud)

小智 6

我用这个:

       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();
Run Code Online (Sandbox Code Playgroud)


Min*_*ata 5

当您更改静态文件的加载位置时,它不会更改“默认”文件的加载位置。

如果您查看 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("")
});
Run Code Online (Sandbox Code Playgroud)