4

我在 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 级,所以动态压缩不是我的选择。

4

0 回答 0