.net Core - 具有自定义默认文件定义的静态文件

.net Core - StaticFiles with custom DefaultFiles-Definitions

我有以下项目层次结构:

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

现在我想使用 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);

我用这个:

       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();

当您更改加载静态文件的位置时,它不会更改 "default" 文件的加载位置。

如果您查看 Github 上的实际中间件代码:https://github.com/damianh/StaticFilesMiddleware/blob/475aef7f56b92d6420ec700dcb397841b6842ed8/src/Microsoft.Owin.StaticFiles/DefaultFilesMiddleware.cs

您可以看到它仍在尝试手动加载文件。它不关心您为 StaticFiles 设置的选项。主要是因为我假设你可以有一个默认页面 without 使用静态文件中间件。

请记住,当您调用 app.UseDefaultFiles() 时,它是一个中间件,而不是设置。这实际上是 "doing" 可以尝试的东西 return 那个文件给你。

无论如何,如果你想使用非标准文件夹来加载默认页面,你只需要传入相同的提供程序即可。例如,这段代码应该适合您:

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

它现在对我有用,结合了@Irena Rich 和我以前的解决方案:

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