asp.net mvc的COM preSS流,并删除空白 [英] asp.net mvc compress stream and remove whitespace
问题描述
所以我COM $ P $通过一个动作过滤器pssing我的输出流:
So I am compressing my output stream via an action filter:
var response = filterContext.HttpContext.Response;
response.Filter = new DeflateStream(response.Filter), CompressionMode.Compress);
伟大的工程。现在,我也想去掉多余的空格present。我发现的Mads克里斯滕森的HTTP模块<一个href=\"http://madskristensen.net/post/A-whitespace-removal-HTTP-module-for-ASPNET-20.aspx\">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类,并添加像COM pression一个新的过滤器:
I added the WhitespaceFilter class and added a new filter like the compression:
var response = filterContext.HttpContext.Response;
response.Filter = new WhitepaperFilter(response.Filter);
这也是伟大工程。但是,我似乎有两者结合的问题!
This also works great. However, I seem to be having problems combining the two!
我试过:
var response = filterContext.HttpContext.Response;
response.Filter = new DeflateStream(new WhitespaceFilter(response.Filter), CompressionMode.Compress);
然而这会导致一些重大问题。在html得到完全搞砸了,有时我得到一个330错误。
However this results in some major issues. The html gets completely messed up and sometimes I get an 330 error.
看来这个空白过滤器的写入方法被调用多次。第一次HTML字符串是好的,但在随后的调用它只是随机字符。
It seems that the Whitespace filter write method gets called multiple times. The first time the html string is fine, but on subsequent calls its just random characters.
我想这可能是因为流已经瘪了,但是,这不是用不变流,然后将得到的数据流传递给DeflateStream呼叫空白过滤器?
I thought it might be because the stream had been deflated, but isnt the whitespace filter using the untouched stream and then passing the resulting stream to the DeflateStream call?
任何想法?
推荐答案
对于那些谁走到这一步......你可以做到这一点...只是换流链的顺序:
For those who get this far... you can do it... just swap the order of the stream chaining:
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);
}
这篇关于asp.net mvc的COM preSS流,并删除空白的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!