首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Web API的压缩筛选器

Web API的压缩筛选器
EN

Stack Overflow用户
提问于 2013-06-26 21:17:09
回答 2查看 20.8K关注 0票数 19

我一直在为我的MVC操作使用压缩过滤器,如下所示:

http://msdn.microsoft.com/en-us/magazine/gg232768.aspx

我试图改变代码的用途,为Web API做一些类似的事情,但我遇到了一个障碍:

代码语言:javascript
复制
public class CompressAPIAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext filterContext)
    {
        var preferredEncoding = GetPreferredEncoding(filterContext.Request);
        Stream compressedStream = null;
        // Compress the response accordingly
        var response = filterContext.Response;
        response.Headers.Add("Content-encoding", preferredEncoding.ToString());

        if (preferredEncoding == CompressionScheme.Gzip)
        {
            response.Content = new GZipStream(compressedStream, CompressionMode.Compress); //THIS WON'T WORK
        } 

        if (preferredEncoding == CompressionScheme.Deflate)
        {
            response.Content = new DeflateStream(compressedStream, CompressionMode.Compress); //THIS WON'T WORK
        }
        return;
    }

    enum CompressionScheme
    {
        Gzip = 0,
        Deflate = 1,
        Identity = 2
    }

    private CompressionScheme GetPreferredEncoding(HttpRequestMessage request)
    {
        var acceptableEncoding = request.Headers.AcceptEncoding;

        if (acceptableEncoding.Where(h => h.Value.Contains("gzip")).Count() > 0)
            return CompressionScheme.Gzip;

        if (acceptableEncoding.Where(h => h.Value.Contains("deflate")).Count() > 0)
            return CompressionScheme.Deflate;

        return CompressionScheme.Identity;
    }

你知道如何将压缩流分配给响应的内容吗?

我应该指出这是在IIS 6.0中托管的,我不能控制它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-27 06:34:59

我认为您不应该在操作筛选器中这样做,因为模型绑定阶段发生在操作筛选器执行之前,并且在模型绑定期间,格式器可能正在读取流以对其进行反序列化,在这种情况下,它将失败。

如果您使用的是IIS,那么执行以下操作来设置压缩(下面是Scott Hanselman的blog post中的一些代码片段):

  • 在IIS中启用了“动态压缩”功能。
  • 回到IIS管理器,转到服务器的页面,而不是站点。点击配置编辑器:

  • 从下拉列表中选择system.webServer/httpCompression:

  • 然后单击Dynamic Types,现在您已进入列表编辑器,考虑您想要压缩哪些类型。默认情况下,/为False,但您可以将其打开。我选择更加挑剔,添加了application/atom+xml、application/json和application/atom+xml;charset=utf-8,如下所示。有一点小问题,application/atom+xml和application/atom+xml;charset=utf-8是分开的条目。你可以在这里添加任何你喜欢的mimeTypes。

添加应用程序并关闭对话框后,请确保单击Apply Restart your IIS Service以加载新模块。

  • 现在使用Accept-Encoding标头发出请求,您应该会看到expected.

  • EDIT形式的响应(此外,还包括“

  • / json;Accept-Encoding=utf-8”以涵盖两种json格式)
票数 58
EN

Stack Overflow用户

发布于 2018-05-20 22:43:29

如果您使用IIS设置压缩,则可以修改该文件:

C:\Windows\System32\inetsrv\config\applicationHost.config

添加以下标签

代码语言:javascript
复制
    <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/atom+xml" enabled="true" />
        <add mimeType="application/atom+xml; charset=utf-8" enabled="true" />
        <add mimeType="application/json" enabled="true" />
        <add mimeType="application/json; charset=utf-8" enabled="true" />
        <!--<add mimeType="application/*" enabled="true" />-->
        <add mimeType="*/*" enabled="false" />
        <staticTypes>
        ...
        </staticTypes>
    </dynamicTypes>

在部分中:

代码语言:javascript
复制
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
        <!-- 
            add here 
        -->
        <staticTypes>
            <add mimeType="text/*" enabled="true" />
            <add mimeType="message/*" enabled="true" />
            <add mimeType="application/x-javascript" enabled="true" />
            <add mimeType="application/atom+xml" enabled="true" />
            <add mimeType="application/xaml+xml" enabled="true" />
            <add mimeType="*/*" enabled="false" />
        </staticTypes>
</httpCompression>

在添加了它们之后,重新启动来加载新模块。

可以通过修改标签来增加压缩级别:

代码语言:javascript
复制
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"
 staticCompressionLevel="9" dynamicCompressionLevel="9" />

完成:)

PS:记住在IIS服务器的配置编辑器中启用路径system.webServer/httpCompression下的动态压缩

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17321131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档