ASP.NET Core 1.0自定义压缩中间件和静态文件问题

时间:2016-02-23 07:52:51

标签: asp.net-core asp.net-core-mvc dnx asp.net-core-1.0

我的启动中间件配置如下所示:

public void Configure(IApplicationBuilder app)
{
    app.UseCompression();
    app.UseIISPlatformHandler();
    app.UseApplicationInsightsRequestTelemetry();
    app.UseCors("CorsPolicy");
    app.UseStaticFiles();
    app.UseMvc();
    app.UseApplicationInsightsExceptionTelemetry();
}

自添加app.UseCompression()中间件后,wwwroot中的静态html文件不再正确加载。 他们无法解决并且无限期地加载。

压缩中间件如下所示,源自here

public class CompressionMiddleware
{
    private readonly RequestDelegate nextDelegate;

    public CompressionMiddleware(RequestDelegate next)
    {
        nextDelegate = next;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        var acceptEncoding = httpContext.Request.Headers["Accept-Encoding"];
        //Checking that we have been given the correct header before moving forward
        if (!(String.IsNullOrEmpty(acceptEncoding)))
        {
            //Checking that it is gzip
            if (acceptEncoding.ToString().IndexOf("gzip", StringComparison.CurrentCultureIgnoreCase) >= 0)
            {
                using (var memoryStream = new MemoryStream())
                {
                    var stream = httpContext.Response.Body;
                    httpContext.Response.Body = memoryStream;
                    await nextDelegate(httpContext);
                    using (var compressedStream = new GZipStream(stream, CompressionLevel.Optimal))
                    {
                        httpContext.Response.Headers.Add("Content-Encoding", new string[] { "gzip" });
                        memoryStream.Seek(0, SeekOrigin.Begin);
                        await memoryStream.CopyToAsync(compressedStream);
                    }
                }
            }
            else
            {
                await nextDelegate(httpContext);
            }
        }
        //If we have are given to Accept Encoding header or it is blank
        else
        {
            await nextDelegate(httpContext);
        }

    }
}

有谁知道为什么会发生这种情况?

注意:我使用的是DNX 1.0.0-rc1-update11.0.0-rc1-final库。

2 个答案:

答案 0 :(得分:1)

我刚刚在/ wwwroot文件夹中的web.config中启用了压缩(就像我们以前在IIs applicationHost.config中所做的那样),并且它可以工作。无需添加压缩中间件。

http://www.brandonmartinez.com/2015/08/20/enable-gzip-compression-for-azure-web-apps/

答案 1 :(得分:1)

web.config中定义的压缩仅适用于IIS而非自托管Web服务器。

我测试了CompressionMiddleware示例,您看到的问题是由内容长度标题引起的。

如果已经设置了 Content-Length ,则浏览器会感到困惑,因为内容被压缩后,响应的实际大小与标题中定义的值不匹配。

删除内容长度标题解决了问题:

httpContext.Response.Headers.Remove("Content-Length");    
httpContext.Response.Headers.Add("Content-Encoding", new string[] { "gzip" });

...甚至可以在压缩内容时尝试指定实际的内容长度。