Web API的压缩过滤器

Mis*_*pic 19 asp.net-mvc asp.net-web-api

我一直在为我的MVC操作使用压缩过滤器,详见此处:

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

我试图重新编写代码来为Web API做类似的事情,但我遇到了障碍:

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;
    }
Run Code Online (Sandbox Code Playgroud)

有关如何将压缩流分配给响应内容的任何想法?

我应该指出这是在IIS 6.0中托管,我无法控制.

Kir*_*lla 50

我想你应该作为动作过滤器在执行之前的modelbinding阶段发生在一个动作过滤器做到这一点,modelbinding格式化程序可以读取流反序列化,在这种情况下,它会失败时.

如果您使用的是IIS,请执行以下操作以设置压缩(以下是Scott Hanselman 博客文章中的一些片段):

  • 在IIS中启用"动态压缩"功能.

  • 返回IIS管理器,转到SERVER的页面,而不是SITE.单击配置编辑器: 在此输入图像描述

  • 从下拉列表中选择system.webServer/httpCompression: 在此输入图像描述

  • 然后单击动态类型,现在您已进入列表编辑器,请考虑要压缩的类型.默认情况下/是False,但你可以打开它.我选择更挑剔并添加了application/atom + xml,application/json和application/atom + xml; charset = utf-8如下所示.应用程序/ atom + xml和application/atom + xml; charset = utf-8是单独的条目.随意在这里添加你喜欢的mimeTypes. 在此输入图像描述
  • 添加它们并关闭对话框后,请确保单击" 应用重新启动 IIS服务"以加载新模块.
  • 现在使用Accept-Encoding标头发出请求,您应该按预期看到响应.

  • 编辑(除了上面包括"application/json; charset = utf-8"以涵盖两种json格式)

  • @Tim UPDATE:我找到了.您可能正在使用像Notepad ++这样的32位程序查看该文件.使用Windows默认记事本,即64位,它会显示实际文件(记事本++被重定向到SysWOW64文件夹b/c其32位) (3认同)
  • 这对我有用,但我对设置存储的位置感到困惑.MMC管理单元的底部显示Configuration:ApplicationHost.config.我无法在C:\ Windows\System32\inetsrv\config\applicationhost.config中看到这些设置.(这是我之前尝试编辑的那个).我在服务器上看不到任何其他修改过的applicationhost.configs?(Windows 2012) (2认同)