asp.net-mvc – 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;
    }

任何想法,我如何可以分配一个压缩流到响应的内容

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

解决方法

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

如果您正在使用IIS,请执行以下操作来设置压缩(以下是Scott Hanselman的blog post的一些片段):

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

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

>然后点击动态类型,现在你在列表编辑器中,想想你想要压缩的类型。认情况下/是False,但是你可以打开它。我选择了一些更挑剔的添加应用程序/ 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格式)

相关文章

ASP.NET与IIS是紧密联系的,由于IIS6.0与IIS7.0的工作方式的...
在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NE...
这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...