Я нашел частичный ответ здесь .
class DecompressStream : Stream
{
...
public override int Read(byte[] buffer, int offset, int count)
{
GZipStream test = new GZipStream(_sink, CompressionMode.Decompress);
int c = test.Read(buffer, offset, count);
return c;
}
...
}
Затем я могу указать фильтр для объекта запроса следующим образом:
void Application_BeginRequest(object sender, EventArgs e)
{
string contentEncoding = Request.Headers["Content-Encoding"];
Stream prevCompressedStream = Request.Filter;
if(contentEncoding == null || contentEncoding.Length == 0)
return;
contentEncoding = contentEncoding.ToLower();
if(contentEncoding.Contains("gzip"))
{
Request.Filter = new DecompressStream(Request.Filter);
}
}
Iскажем частичный ответ, потому что, хотя теперь я могу обработать входящий запрос, ответ получает заголовок «Content-Encoding: gzip», даже если ответ не закодирован.Я могу проверить в Fiddler, что содержимое не закодировано.
Если я закодирую ответ, произойдет сбой клиента для веб-службы.Кажется, что даже при отправке «Accept-Encoding: gzip» он фактически не принимает сжатый gzip ответ.Я могу проверить в Fiddler, что ответ сжат, и Fiddler успешно распакует его.
Итак, я застрял, пытаясь удалить блуждающий заголовок «Content-Encoding: gzip» из ответа.Я удалил все ссылки, которые могу найти на сжатие, из приложения, web.config и IIS.