Http &引用;“内容解码失败”;使用GZIP压缩下载文件时出错
我的web应用程序会动态生成CSV文件,但每当我使用GZIP压缩时,下载都会失败:Http &引用;“内容解码失败”;使用GZIP压缩下载文件时出错,http,gzip,download,http-compression,Http,Gzip,Download,Http Compression,我的web应用程序会动态生成CSV文件,但每当我使用GZIP压缩时,下载都会失败: HTTP/1.1 200 OK Cache-Control: private, s-maxage=0,no-store, no-cache Transfer-Encoding: chunked Content-Type: text/csv;charset=utf-8 Content-Encoding: gzip Vary: Accept-Encoding Server: Microsoft-IIS/7.5 X-A
HTTP/1.1 200 OK
Cache-Control: private, s-maxage=0,no-store, no-cache
Transfer-Encoding: chunked
Content-Type: text/csv;charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
Content-Disposition: attachment;filename="filename.csv"
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
p3p: CP="CAO PSA OUR"
Date: Fri, 03 Feb 2012 11:27:27 GMT
在Google Chrome中,下载显示为“中断”,而在Internet Explorer中,显示为“内容解码失败”的错误
解决方案是禁用该操作的压缩,但是。。。为什么会发生这种情况
干杯
更新:我使用的压缩过滤器:
public class EnableCompressionAttribute : ActionFilterAttribute
{
const CompressionMode compress = CompressionMode.Compress;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.IsChildAction)
return;
var actionAttributes = filterContext.ActionDescriptor.GetCustomAttributes(true);
if (actionAttributes != null && actionAttributes.Any(attr => attr is SkipCompressionAttribute))
return;
HttpRequestBase request = filterContext.HttpContext.Request;
HttpResponseBase response = filterContext.HttpContext.Response;
String acceptEncoding = request.Headers["Accept-Encoding"];
if (acceptEncoding == null || response.Filter == null)
return;
if (acceptEncoding.ToLower().Contains("gzip"))
{
response.Filter = new GZipStream(response.Filter, compress);
response.AppendHeader("Content-Encoding", "gzip");
response.AppendHeader("Vary", "Accept-Encoding");
}
else if (acceptEncoding.ToLower().Contains("deflate"))
{
response.Filter = new DeflateStream(response.Filter, compress);
response.AppendHeader("Content-Encoding", "deflate");
response.AppendHeader("Vary", "Accept-Encoding");
}
}
}
尝试:
另一个问题可能是缓存:如果一个客户端接受压缩内容,但下一个客户端不接受,而服务器缓存了压缩数据,该怎么办?第二个客户将得到什么?无法解码的缓存压缩页面
要解决此问题,请添加另一种方法:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom == "GZIP")
{
string acceptEncoding = HttpContext.Current.Response.Headers["Content-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding))
return "";
else if (acceptEncoding.Contains("gzip"))
return "GZIP";
else if (acceptEncoding.Contains("deflate"))
return "DEFLATE";
return "";
}
return base.GetVaryByCustomString(context, custom);
}
你如何对内容应用压缩?我已经更新了帖子。你确定这些压缩过滤器会像预期的那样返回HTTP中的数据吗?它适用于HTML内容,你的意思是什么?@vtortola你复制了所有HTTP头吗?我看不到
内容长度标题。嗯。。。我没有注意到内容编码头丢失了。。。明天早上我会尽力强迫你的。谢谢
Response.Headers.Remove("Content-Encoding");
Response.AppendHeader("Content-Encoding", "gzip");
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom == "GZIP")
{
string acceptEncoding = HttpContext.Current.Response.Headers["Content-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding))
return "";
else if (acceptEncoding.Contains("gzip"))
return "GZIP";
else if (acceptEncoding.Contains("deflate"))
return "DEFLATE";
return "";
}
return base.GetVaryByCustomString(context, custom);
}