使用 StaticFileOptions() 会破坏 Razor Class 库中的嵌入式静态文件
Using StaticFileOptions() breaks embedded static files from Razor Class Library
我正在尝试使用 StaticFileOptions
将长缓存 headers 添加到静态 .css 和 .js 文件
根据各种 SO 和其他文章,这就是您的做法:
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = ctx =>
{
const int durationInSeconds = 60 * 60 * 24;
ctx.Context.Response.Headers[HeaderNames.CacheControl] =
"public,max-age=" + durationInSeconds;
}
});
但是,我正在使用 RCL 提供的一堆静态文件。 RCL 有一个 StaticServing.cs class,我在这篇文章中使用了它:
为了我的问题完整,这个class如下:
public StaticServing(IHostingEnvironment environment)
{
Environment = environment;
}
public IHostingEnvironment Environment { get; }
public void PostConfigure(string name, StaticFileOptions options)
{
name = name ?? throw new ArgumentNullException(nameof(name));
options = options ?? throw new ArgumentNullException(nameof(options));
// Basic initialization in case the options weren't initialized by any other component
options.ContentTypeProvider = options.ContentTypeProvider ?? new FileExtensionContentTypeProvider();
if (options.FileProvider == null && Environment.WebRootFileProvider == null)
{
throw new InvalidOperationException("Missing FileProvider.");
}
options.FileProvider = options.FileProvider ?? Environment.WebRootFileProvider;
string basePath = "Static";
ManifestEmbeddedFileProvider filesProvider = new ManifestEmbeddedFileProvider(GetType().Assembly, basePath);
options.FileProvider = new CompositeFileProvider(options.FileProvider, filesProvider);
}
}
在消费项目中 startup.cs 我有 services.ConfigureOptions(typeof(StaticServing));
并且 RCL 有 <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
和 <EmbeddedResource Include="Static\**\*" />
设置。
一切就绪后,一切正常... UNLESS 我在问题的开头添加了 StaticFileOptions
代码,在这种情况下,所有对嵌入式静态文件 return 404
.
我试过添加:
FileProvider = env.ContentRootFileProvider
和
FileProvider = env.WebRootFileProvider
到 StaticFileOptions
设置,但这不起作用。
静态文件中间件可以通过以下两种方式之一接收其 StaticFileOptions
:
- 通过依赖注入隐式。
- 明确地通过调用
UseStaticFiles
.
在您遇到问题的情况下,您(无意中)尝试使用这两种方法配置中间件。只要您向 UseStaticFiles
调用添加一个参数,您就会 替换 框架为中间件提供的配置,其中包括 RCL 支持的设置。
要构建框架提供的配置,您可以利用 ConfigureServices
中的选项模式:
services.Configure<StaticFileOptions>(options =>
{
options.OnPrepareResponse = ctx =>
{
const int durationInSeconds = 60 * 60 * 24;
ctx.Context.Response.Headers[HeaderNames.CacheControl] =
"public, max-age=" + durationInSeconds;
}
});
您还需要删除传递给 UseStaticFiles
的参数。
我正在尝试使用 StaticFileOptions
根据各种 SO 和其他文章,这就是您的做法:
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = ctx =>
{
const int durationInSeconds = 60 * 60 * 24;
ctx.Context.Response.Headers[HeaderNames.CacheControl] =
"public,max-age=" + durationInSeconds;
}
});
但是,我正在使用 RCL 提供的一堆静态文件。 RCL 有一个 StaticServing.cs class,我在这篇文章中使用了它:
为了我的问题完整,这个class如下:
public StaticServing(IHostingEnvironment environment)
{
Environment = environment;
}
public IHostingEnvironment Environment { get; }
public void PostConfigure(string name, StaticFileOptions options)
{
name = name ?? throw new ArgumentNullException(nameof(name));
options = options ?? throw new ArgumentNullException(nameof(options));
// Basic initialization in case the options weren't initialized by any other component
options.ContentTypeProvider = options.ContentTypeProvider ?? new FileExtensionContentTypeProvider();
if (options.FileProvider == null && Environment.WebRootFileProvider == null)
{
throw new InvalidOperationException("Missing FileProvider.");
}
options.FileProvider = options.FileProvider ?? Environment.WebRootFileProvider;
string basePath = "Static";
ManifestEmbeddedFileProvider filesProvider = new ManifestEmbeddedFileProvider(GetType().Assembly, basePath);
options.FileProvider = new CompositeFileProvider(options.FileProvider, filesProvider);
}
}
在消费项目中 startup.cs 我有 services.ConfigureOptions(typeof(StaticServing));
并且 RCL 有 <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
和 <EmbeddedResource Include="Static\**\*" />
设置。
一切就绪后,一切正常... UNLESS 我在问题的开头添加了 StaticFileOptions
代码,在这种情况下,所有对嵌入式静态文件 return 404
.
我试过添加:
FileProvider = env.ContentRootFileProvider
和FileProvider = env.WebRootFileProvider
到 StaticFileOptions
设置,但这不起作用。
静态文件中间件可以通过以下两种方式之一接收其 StaticFileOptions
:
- 通过依赖注入隐式。
- 明确地通过调用
UseStaticFiles
.
在您遇到问题的情况下,您(无意中)尝试使用这两种方法配置中间件。只要您向 UseStaticFiles
调用添加一个参数,您就会 替换 框架为中间件提供的配置,其中包括 RCL 支持的设置。
要构建框架提供的配置,您可以利用 ConfigureServices
中的选项模式:
services.Configure<StaticFileOptions>(options =>
{
options.OnPrepareResponse = ctx =>
{
const int durationInSeconds = 60 * 60 * 24;
ctx.Context.Response.Headers[HeaderNames.CacheControl] =
"public, max-age=" + durationInSeconds;
}
});
您还需要删除传递给 UseStaticFiles
的参数。