【问题标题】:Asp.Net Core - Enable HttpCompression in Shared Hosting Environment?Asp.Net Core - 在共享主机环境中启用 HttpCompression?
【发布时间】:2018-05-24 20:28:02
【问题描述】:

我正在使用运行 ASP.Net Core 2.0 Web 应用程序的共享主机。当我在 localhost 上运行应用程序时,我可以看到 HttpCompression 工作正常(内容编码:gzip)为 JS 文件返回响应标头)。

在我部署到共享主机后, content-encoding: gzip 响应不再存在。我尝试在 web.config 中添加各种 httpCompression/urlCompression 设置,但托管公司说这些设置在我的计划中被禁用。

是否有任何其他方法可以使 Gzip 压缩工作,或者我必须使用在 IIS 中启用它的托管计划?

编辑:我还在使用 ResponseCompression 中间件作为 ASP.Net Core 的一部分,并且内容编码响应标头仍然没有出现。配置代码如下:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddLogging();

        services.AddResponseCompression(options =>
        {
            options.Providers.Add<GzipCompressionProvider>();
        });

...
}

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {        
        if (env.IsDevelopment())
        {
            loggerFactory.AddDebug(LogLevel.Debug);
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseExceptionHandler("/error");
        }

        app.UseStatusCodePagesWithRedirects("/error/{0}");
        app.UseResponseCompression();

        app.UseStaticFiles(new StaticFileOptions
        {
            OnPrepareResponse = ctx =>
            {
                ctx.Context.Response.Headers.Append("Cache-Control", "public, max-age=604800");
            }
        });

        app.UseAuthentication();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "areas",
                template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
              );

            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

        var options = new RewriteOptions()
            .AddRedirectToHttps();

        app.UseRewriter(options);
    }

【问题讨论】:

    标签: c# asp.net iis asp.net-core


    【解决方案1】:

    使用响应压缩中间件;添加对 Microsoft.AspNetCore.ResponseCompression 或 Microsoft.AspNetCore.All NuGet 包的引用。 见docs

    通过以下方式设置:

    WebHost.CreateDefaultBuilder(args)
        .ConfigureServices(services =>
        {
            services.AddResponseCompression();
        })
        .Configure(app =>
        {
            app.UseResponseCompression();
    
            // ...
        })
        .Build();
    

    编辑:在下面的评论中,您提到您的网站在 https 上,这就是默认情况下关闭响应压缩以防止 CRIME 和 BREACH 攻击的原因。 您可以通过 EnableForHttps 选项重新启用它。

    services.AddResponseCompression(options =>
    {
    options.EnableForHttps = true;
    options.Providers.Add<GzipCompressionProvider>();
    });
    

    【讨论】:

    • 我其实已经在用这个了,gzip响应头还是没有出现。
    • 确保 IIS 静态文件处理程序不提供文件而不是此中间件。通过 IIS 管理器 1. 导航到模块功能。 2. 在列表中选择 StaticFileModule。 3. 单击操作侧栏中的删除。
    • 根据文档,StaticFileModule 甚至没有用于 ASP.Net Core:docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/…
    • docs.microsoft.com/en-us/aspnet/core/fundamentals/… 的文档提到:如果启用了 IIS 静态文件处理程序并且 ASP.NET Core 模块配置不正确,则会提供静态文件。例如,如果未部署 web.config 文件,就会发生这种情况。
    • 你能分享更多信息吗,比如使用的中间件的注册顺序,网站是在https上还是在反向代理后面等等?
    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2017-04-10
    相关资源
    最近更新 更多