Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未应用Web API Gzip_C#_Gzip_Asp.net Web Api2 - Fatal编程技术网

C# 未应用Web API Gzip

C# 未应用Web API Gzip,c#,gzip,asp.net-web-api2,C#,Gzip,Asp.net Web Api2,我已经添加了web.config条目,以基于这个S/O答案启用gzip压缩 然后,我在加载ASPX页面时检查了Chrome Developer窗口,并在响应中看到了标题: Cache-Control:private Content-Encoding:gzip Content-Length:3669 Content-Type:text/html; charset=utf-8 Date:Wed, 04 Mar 2015 00:46:05 GMT Server:Microsoft-IIS/7.5 Va

我已经添加了web.config条目,以基于这个S/O答案启用gzip压缩

然后,我在加载ASPX页面时检查了Chrome Developer窗口,并在响应中看到了标题:

Cache-Control:private
Content-Encoding:gzip
Content-Length:3669
Content-Type:text/html; charset=utf-8
Date:Wed, 04 Mar 2015 00:46:05 GMT
Server:Microsoft-IIS/7.5
Vary:Accept-Encoding
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
这意味着它在“工作”,对吗?但在进行Web API调用时查找该标头时,该标头不存在:

Cache-Control:no-cache
Content-Length:551
Content-Type:application/json; charset=utf-8
Date:Wed, 04 Mar 2015 00:53:05 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
我尝试过各种不同的配置(从上面链接的S/O答案中推荐的配置开始)。最后,在绝望的情况下,我将其设置为此,我认为这将使其尝试压缩所有请求(除*/*注释外的所有请求):


,并在IIS Express 8.0(Visual Studio)和本地安装的IIS 7.5中编辑applicationHost.config。所有这些都产生了相同的结果:对其他mime类型(如text/*work)的请求都有效,但application/json拒绝gzip。

根据您的说法,有两种选择:

  • 更改
    applicationHost.config
    并添加

    到httpCompression->dynamicTypes部分

  • 在web api管道中使用委派处理程序来处理压缩。
    e、 g.或


  • WebAPI是否位于防火墙、Web代理、病毒防护套件之后?如中所述
    这可能会剥离标题。

    在实现NuGet软件包Microsoft.AspNet.WebApi.MessageHandlers.Compression时,是否将必需的行(以下)添加到应用程序\u Start\WebApiConfig.cs文件中?请注意,根据包的主站点上的说明,is必须位于同一方法中的所有其他消息处理程序之后

    GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
    
    下面是我在博客中使用的WebApiConfig文件中的一个注册方法示例:

        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
    
            // Web API routes
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { echo = RouteParameter.Optional }
            );
            GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
        }
    

    这是我提到的博客帖子:

    我想你已经在服务器端完成了所有的作业,但问题在于请求

    要允许服务器压缩响应,有必要在请求中包含此头文件:

    Accept-Encoding: gzip, deflate
    
    如果不这样做,无论在服务器端做什么,响应都不会被压缩


    您没有指定哪一个是Web API客户端,但总有一种方法可以使用客户端API在请求中添加头。

    我认为@Peeticus的做法是正确的

    以下是我所做的工作:

    运行“安装包Microsoft.AspNet.WebApi.MessageHandlers.Compression”或通过GUI添加后,需要更新/App\u Start/WebApiConfig.cs

    需要以下附加的using语句:

    using Microsoft.AspNet.WebApi.MessageHandlers.Compression.Compressors;
    using Microsoft.AspNet.WebApi.MessageHandlers.Compression;
    
    在WebApiConfig.Register方法中添加以下内容:

    GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
    
    下一步,在IISExpress applicationHost.config中,在默认值之前找到

    
    
    也可以在applicationHost.config中更新到


    多亏了上述两种解决方案和其他解决方案,我想逐步解释如何使用Web API 2.2实现http压缩可能会有所帮助,因为自上述文章发布以来,一些包/名称空间已经发生了变化

    1) 使用nuget package manager控制台安装以下内容:

    Install-Package Microsoft.AspNet.WebApi.MessageHandlers.Compression
    
    2) 在WebApiConfig.cs中添加这些用法

    using System.Net.Http.Extensions.Compression.Core.Compressors;
    using Microsoft.AspNet.WebApi.Extensions.Compression.Server;
    
    3) 在WebApiConfig.cs内部,添加到寄存器底部(HttpConfiguration config)

    4) 编辑您的web.config并在system.webServer中添加

    <urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="true" />
    <httpCompression>
        <dynamicTypes>
            <clear />
            <add enabled="true" mimeType="text/*" />
            <add enabled="true" mimeType="message/*" />
            <add enabled="true" mimeType="application/x-javascript" />
            <add enabled="true" mimeType="application/javascript" />
            <add enabled="true" mimeType="application/json" />
            <add enabled="false" mimeType="*/*" />
            <add enabled="true" mimeType="application/atom+xml" />
        </dynamicTypes>
        <staticTypes>
            <clear />
            <add enabled="true" mimeType="text/*" />
            <add enabled="true" mimeType="message/*" />
            <add enabled="true" mimeType="application/javascript" />
            <add enabled="true" mimeType="application/atom+xml" />
            <add enabled="true" mimeType="application/xaml+xml" />
            <add enabled="true" mimeType="application/json" />
            <add enabled="false" mimeType="*/*" />
        </staticTypes>
    </httpCompression>
    
    
    
    第一次在本地和azure网站上工作,希望它能为你工作!另外,一开始当然不需要弄乱applicationHost.config…

    IIS忽略WEB API响应压缩,因为WEB API响应属于mime类型

    application/json; charset=utf-8
    
    默认IIS压缩设置不包含此Mime类型,因此它们不会压缩响应

    因此,您必须将此mime类型添加到
    部分

    (或者只是为了测试它,就像您所做的那样

    但是

    默认情况下,
    节被IIS锁定,用于外部设置

    因此,您在web.config上指定的任何设置都将被忽略

    除非您在applicationHost.config
    部分或 编辑
    部分以允许从外部进行设置

    <section name="httpCompression" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />
    

    您看到的问题是,由于文档中说明,小于860字节的响应未被压缩,并且您的示例显示“内容长度:551”。
    发送更多数据,它应该可以正常工作。

    在构建应用程序时,您是否将web.config设置为始终复制到输出目录?是的,新条目肯定存在。没有防火墙。我通过IIS Express 8(即Visual Studio)中的localhost在本地和IIS 7.5上进行了所有尝试,并在同一网络上的服务器上进行了IIS 7.5本地和IIS 7.5的所有尝试。好的,结果证明我错了。在同一台开发人员计算机上,有一个完整的IIS安装正在运行应用程序请求路由,该应用程序请求路由充当反向代理,以允许本地环境之外的计算机命中该IIS,然后将请求转发到本地IIS Express实例(不允许外部连接)。尽管我在尝试启用gzip时对本地实例进行了大部分测试,但完整IIS中的路由条目位于web.config(同一目录)中。删除该web.config条目使NuGet gzip变得栩栩如生。谢谢-对我来说,这是ESET AntiVirus在内部解压缩所有响应。解决方案是禁用“web扫描器”模块。我已通过IIS Express 8.0和IIS 7.5在本地尝试了applicationHost.config。我还没有在我们的开发服务器(IIS 7.5)上尝试过它。我确实引入、配置和部署了NuGet包(本地和开发服务器)。都有相同的结果
    GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
    
    <urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="true" />
    <httpCompression>
        <dynamicTypes>
            <clear />
            <add enabled="true" mimeType="text/*" />
            <add enabled="true" mimeType="message/*" />
            <add enabled="true" mimeType="application/x-javascript" />
            <add enabled="true" mimeType="application/javascript" />
            <add enabled="true" mimeType="application/json" />
            <add enabled="false" mimeType="*/*" />
            <add enabled="true" mimeType="application/atom+xml" />
        </dynamicTypes>
        <staticTypes>
            <clear />
            <add enabled="true" mimeType="text/*" />
            <add enabled="true" mimeType="message/*" />
            <add enabled="true" mimeType="application/javascript" />
            <add enabled="true" mimeType="application/atom+xml" />
            <add enabled="true" mimeType="application/xaml+xml" />
            <add enabled="true" mimeType="application/json" />
            <add enabled="false" mimeType="*/*" />
        </staticTypes>
    </httpCompression>
    
    application/json; charset=utf-8
    
    <section name="httpCompression" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />