【发布时间】:2011-01-29 07:21:49
【问题描述】:
我写了一个 IHttpModule 使用 gzip 压缩我的响应(我返回大量数据。)以减少响应大小。只要 Web 服务不引发异常,它就可以很好地工作。如果抛出异常,则会对异常进行 gzip 压缩,但 Content-encoding 标头会消失,客户端不知道读取异常。
为什么缺少标题?我需要在客户端获取异常。
这是模块:
public class JsonCompressionModule : IHttpModule
{
public JsonCompressionModule()
{
}
public void Dispose()
{
}
public void Init(HttpApplication app)
{
app.BeginRequest += new EventHandler(Compress);
}
private void Compress(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
HttpRequest request = app.Request;
HttpResponse response = app.Response;
try
{
//Ajax Web Service request is always starts with application/json
if (request.ContentType.ToLower(CultureInfo.InvariantCulture).StartsWith("application/json"))
{
//User may be using an older version of IE which does not support compression, so skip those
if (!((request.Browser.IsBrowser("IE")) && (request.Browser.MajorVersion <= 6)))
{
string acceptEncoding = request.Headers["Accept-Encoding"];
if (!string.IsNullOrEmpty(acceptEncoding))
{
acceptEncoding = acceptEncoding.ToLower(CultureInfo.InvariantCulture);
if (acceptEncoding.Contains("gzip"))
{
response.AddHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("deflate"))
{
response.AddHeader("Content-encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
}
}
}
}
catch (Exception ex)
{
int i = 4;
}
}
}
这里是网络服务:
[WebMethod]
public void DoSomething()
{
throw new Exception("This message get currupted on the client because the client doesn't know it gzipped.");
}
【问题讨论】:
-
请帮忙?您无需提及,因为这是本网站的实际目的。
-
这仍然会发生。 (叹气!)显然,这是因为在处理错误时,ASP.NET clears out all current headers。
标签: asp.net ajax gzip response