所以我通过动作过滤器压缩输出流:

var response = filterContext.HttpContext.Response;
response.Filter = new DeflateStream(response.Filter), CompressionMode.Compress);

哪个效果很好。 现在,我还想删除多余的空白。 我找到了Mads Kristensen的http模块http://madskristensen.net/post/A-whitespace-removal-HTTP-module-for-ASPNET-20.aspx

public class WhitespaceFilter : Stream {

    // using Mads Kristensen httpModule
    // http://madskristensen.net/post/A-whitespace-removal-HTTP-module-for-ASPNET-20.aspx

    private Stream os;
    private static Regex reg = new Regex(@"^\s+", RegexOptions.Multiline | RegexOptions.Compiled); 

    public WhitespaceFilter(Stream os) {
        this.os = os;
    }

    //methods that need to be overridden from stream
    public override bool CanRead {
        get { return true; }
    }

    public override bool CanSeek {
        get { return true; }
    }

    public override bool CanWrite {
        get { return true; }
    }

    public override void Flush() {
        os.Flush();
    }

    public override long Length {
        get { return 0; }
    }

    private long _position;
    public override long Position {
        get { return _position; }
        set { _position = value; }
    }

    public override int Read(byte[] buffer, int offset, int count) {
        return os.Read(buffer, offset, count);
    }

    public override long Seek(long offset, SeekOrigin origin) {
        return os.Seek(offset, origin);
    }

    public override void SetLength(long value) {
        os.SetLength(value);
    }

    public override void Close() {
        os.Close();
    }

    public override void Write(byte[] buffer, int offset, int count) {
        string html = System.Text.Encoding.Default.GetString(buffer);

        //remove whitespace
        html = reg.Replace(html, string.Empty);

        byte[] outdata = System.Text.Encoding.Default.GetBytes(html);

        //write bytes to stream
        os.Write(outdata, 0, outdata.GetLength(0));
    } 

我添加了WhitespaceFilter类并添加了一个像压缩一样的新过滤器:

var response = filterContext.HttpContext.Response;
response.Filter = new WhitepaperFilter(response.Filter);

这也很有效。 但是,我似乎在将两者结合起来时遇到了问题!

我试过了:

var response = filterContext.HttpContext.Response;
response.Filter = new DeflateStream(new WhitespaceFilter(response.Filter), CompressionMode.Compress);

然而,这会导致一些重大问题。 html完全搞砸了,有时我得到330错误。

似乎多次调用Whitespace过滤器写入方法。 第一次html字符串很好,但在后续调用它只是随机字符。

我认为这可能是因为流已被放气,但不是使用未触摸的流的空白过滤器,然后将结果流传递给DeflateStream调用?

有任何想法吗?

#1楼 票数:7 已采纳

对于那些到目前为止的人......你可以做到......只需交换流链接的顺序:

   public override void OnActionExecuting(ActionExecutingContext filterContext)
   {
        var response = filterContext.HttpContext.Response;

        // - COMPRESS
        HttpRequestBase request = filterContext.HttpContext.Request;
        string acceptEncoding = request.Headers["Accept-Encoding"];
        if (!String.IsNullOrEmpty(acceptEncoding))
        {
            acceptEncoding = acceptEncoding.ToUpperInvariant();

            if (acceptEncoding.Contains("GZIP"))
            {
                response.AppendHeader("Content-encoding", "gzip");
                response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
            }
            else if (acceptEncoding.Contains("DEFLATE"))
            {
                response.AppendHeader("Content-encoding", "deflate");
                response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
            }
        }

        // - REMOVE WHITE SPACE
        response.Filter = new WhitespaceFilter(response.Filter);
    }

#2楼 票数:0

我没有看到上面的代码有多大的错误,但你可能想尝试这种方法:

var response = filterContext.HttpContext.Response; 
using(var wsf = new WhitespaceFilter(response.Filter))
{
   wsf.Flush();
   response.Filter = new DefalteStream(wsf, CompressMode.Compress);
}

BTW在应用压缩和空白删除时使用此属性方法:

http://www.avantprime.com/articles/view-article/7/compress-httpresponse-for-your-controller-actions-using-attributes

DaTribe

  ask by James Hull translate from so

未解决问题?本站智能推荐:

1回复

为什么在使用GZipStream压缩HTTP响应时未加载CSS文件?

我正在使用asp.net 2.0(C#)开发一个应用程序,在该应用程序中,我试图实现文件的压缩,以便改善我的网站的性能。 为此,我在Global.asax文件中添加了代码以压缩所有请求(.aspx,.js,.css),但是当我运行我的应用程序时,它第一次运行良好,因此CSS无法加载,并且网
5回复

在asp.net/mvc中的控制器内部的动作中将标头添加到http响应

我正在将数据从服务器流传输到客户端,以使用filestream.write下载。 在这种情况下,发生的事情是我能够下载文件,但在浏览器中却没有下载。 在“下载”部分中不会出现“另存为”的弹出窗口,而不会出现“下载栏”。 从四周看,我想我需要在响应标头中包含“某些内容”,以告知浏览器此响应包
1回复

Session_Start和ASP.Net异步SessionState模块

我们最近集成了ASP.Net Async SessionState模块 ,并开始在Global.asax Session_Start事件处理程序中看到null ref异常。 我无法在本地复制它,并且它似乎并非一直都在实时发生,但是我相信这是当我们尝试在Session_Start中访问Htt
1回复

自定义asp.net身份存储-为什么HttpContext.Current有时为空

我已经按照此处设置的示例为ASP.NET Identity实现了自定义用户存储。 一切正常,除了: 我需要访问用户存储中有关当前登录用户的数据。 通常,您可以通过访问 现在,一旦用户登录,如果该用户随后进入Manage控制器(例如尝试更改其密码),则当ASP.NET身份通过调用
2回复

ASP.NET异步控制器并调用Sync(); 什么是“ Sync()”?

在ASP.NET MVC中使用异步控制器的“ 使用 BeginMethod / EndMethod模式”部分涉及Sync()方法。 它没有链接,由于同步太常见,我无法通过Google搜索找到有关文档。 有人可以指出我的写作方向吗? 为了确保您可以访问HttpContext.Curr
1回复

MVC - 当响应代码为错误请求时删除 cookie 将不起作用,但状态代码上的相同代码正常工作

我有一个具有登录方法的 MVC 控制器。 如果登录参数为 false,则会引发异常,在这种情况下,我需要删除一个 cookie。 问题是如果 Response.StatusCode = OK,代码就可以工作。 但是由于抛出了异常,我想设置 StatusCode = 400。可以这样做吗? 我有一种感
1回复

asp.net mvc http上下文在global.asax以及mvc的控制器上下文和过滤器上下文中具有不同的值

我在global.asax Application_AuthenticateRequest方法和Aut​​horize属性filterContext的HttpContext以及控制器Context上具有不同的HttpContext对象值。 我已将应用程序设置为运行“单一登录”。 这是我的
2回复

试图将ASP.Net MVC 1.0项目更新为MVC 2.0

我正在尝试将我的项目从MVC 1.0更新为ASP.Net MVC 2.0。 我已经删除了对System.Web.MVC的较新版本的引用。 我从HTTPContext读取到一个异常,该异常显示为“ CurrentNotification ='HttpContext.Current.Curren