.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 = ""
});
}
我有以下项目层次结构:
-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 = ""
});
}