我在 ASP .NET Core 3.1 中有一个带有 Brotli 的静态预压缩 JS 文件。我希望当对该文件的请求以 .js 结尾时,返回具有相同名称、以 .js.br 结尾的预压缩版本的内容。
我尝试添加一些中间件代码:
app.UseSpaStaticFiles(new StaticFileOptions
{
OnPrepareResponse = async (staticFilesContext) =>
{
IHeaderDictionary headers = staticFilesContext.Context.Response.Headers;
var httpContext = staticFilesContext.Context;
string contentType = headers["Content-Type"];
if (contentType == "application/javascript" && staticFilesContext.File.Name.EndsWith("somehash.chunk.js"))
{
var compressed = @$"ClientApp\build\static\js\{staticFilesContext.File.Name}";
var compressedBytes = await File.ReadAllBytesAsync(compressed);
httpContext.Response.Headers.Add("Content-Encoding", "br");
await httpContext.Response.Body.WriteAsync(compressedBytes);
}
}
});
我尝试了 2 个 npm 库进行预压缩:
- brotli - 我在 Chrome 控制台中遇到解码错误
- brotli-max - 我目前使用的那个,我收到以下错误。
使用该代码,我在 Chrome 中得到net::ERR_HTTP2_PROTOCOL_ERROR响应。有时我在 Visual Studio 2019 中遇到内容长度异常:
响应内容长度不匹配:写入的字节太多
如何正确编写这样的预压缩文件作为响应?我正在做预压缩,因为我使用的是最慢的 Brotli 11 级,所以动态压缩不是我的选择。