Сжатие json ihttpmodule
Я написал IHttpModule, который сжимает мой респон с помощью gzip (я возвращаю много данных), чтобы уменьшить размер ответа. Он отлично работает, пока веб-сервис не создает исключение. В случае возникновения исключения, исключение gzipped, но заголовок 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.");
}
Я ценю любую помощь.
Спасибо!
1 ответ
Несмотря на то, что вы давно опубликовали этот вопрос, у меня возникла та же проблема, и вот как я ее исправил:
В методе Init() добавьте обработчик для события Error
app.Error += new EventHandler(app_Error);
В обработчике удалите Content-Type из заголовков Response и установите для свойства Response.Filter значение null.
void app_Error(object sender, EventArgs e)
{
HttpApplication httpApp = (HttpApplication)sender;
HttpContext ctx = HttpContext.Current;
string encodingValue = httpApp.Response.Headers["Content-Encoding"];
if (encodingValue == "gzip" || encodingValue == "deflate")
{
httpApp.Response.Headers.Remove("Content-Encoding");
httpApp.Response.Filter = null;
}
}
Может быть, есть более элегантный способ сделать это, но у меня получилось.