asp.net - compresion - gzip iis
¿Cómo habilito la compresión GZIP para solicitudes POST(carga) a SOAP WebService en IIS 7? (2)
Al final, utilicé la respuesta de Wiktor Zychla pero encontré un par de errores (también mencionados en los comentarios de su artículo). Para completar, publicaré mi versión fija del módulo HttpCompression aquí, pero el resto del código (y las pautas de implementación) que necesita están en el artículo de Wiktor .
ACTUALIZAR:
De hecho, he tenido que dejar de usar este código ya que tiene un error que no puedo solucionar (incluso con mi versión mejorada a continuación). Para muchas personas que se encuentran detrás de los servidores proxy, aparece un error que dice "el número mágico en el encabezado gzip es incorrecto" y no puedo encontrar la manera de solucionarlo. Creo que es porque los servidores proxy descomprimen GZIP y este código no permite recibir respuestas comprimidas y no comprimidas en su forma actual.
using System;
using System.IO.Compression;
using System.Web;
using System.Web.Security;
/// <summary>
/// Implement two way HTTP compression for the SOAP API
/// Code taken from: http://netpl.blogspot.co.uk/2009/07/aspnet-webservices-two-way- response-and.html
/// Fix: Set Content-encoding: gzip header when an Exception occurs on the server.
/// Fix: Do not attempt to decrypt GZIP request stream when request was not GZIPed.
/// </summary>
public class HttpCompressionModule : IHttpModule
{
private bool isDisposed = false;
~HttpCompressionModule()
{
Dispose(false);
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(Context_BeginRequest);
context.PreSendRequestHeaders += new EventHandler(context_PreSendRequestHeaders);
}
void context_PreSendRequestHeaders(object sender, EventArgs e)
{
// Fix headers having been lost if an exception occurred.
HttpApplication app = sender as HttpApplication;
HttpContext ctx = app.Context;
if (app.Response.Filter is GZipStream) SetEncoding("gzip");
else if (app.Response.Filter is DeflateStream) SetEncoding("deflate");
// Fix double header
if (ctx.Response.Headers["Content-encoding"] == "gzip,gzip")
ctx.Response.Headers.Set("Content-encoding", "gzip");
}
public void Context_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
HttpContext ctx = app.Context;
// Currently only enable for the Uploader API webservice
if (!ctx.Request.Url.PathAndQuery.ToLower().Contains("uploaderapi.asmx"))
{
return;
}
// Add request filter if request was GZIP encoded
string requestEncoding = ctx.Request.Headers["Content-encoding"];
if (requestEncoding != null && requestEncoding == "gzip")
{
app.Request.Filter =
new System.IO.Compression.GZipStream(app.Request.Filter, CompressionMode.Decompress);
}
// Add response compression filter if the client accepts compressed responses
if (IsEncodingAccepted("gzip"))
{
app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress);
SetEncoding("gzip");
}
else if (IsEncodingAccepted("deflate"))
{
app.Response.Filter = new DeflateStream(app.Response.Filter, CompressionMode.Compress);
SetEncoding("deflate");
}
}
private bool IsEncodingAccepted(string encoding)
{
return HttpContext.Current.Request.Headers["Accept-encoding"] != null &&
HttpContext.Current.Request.Headers["Accept-encoding"].Contains(encoding);
}
private void SetEncoding(string encoding)
{
HttpContext ctx = HttpContext.Current;
string responseEncodings = ctx.Response.Headers.Get("Content-encoding");
if (responseEncodings == null || !responseEncodings.Contains(encoding))
HttpContext.Current.Response.AppendHeader("Content-encoding", encoding);
}
public void Dispose()
{
Dispose(true);
}
private void Dispose(bool dispose)
{
isDisposed = dispose;
}
}
¿Cómo puedo habilitar la compresión para datos POST cargados en un .NET WebService (SOAP, no WCF)? Pensé que sería una simple cuestión de habilitar la compresión dinámica en IIS, pero después de habilitarla, solo está comprimiendo la respuesta , no la solicitud POST.
Lo agregué como referencia de servicio y no puedo encontrar ninguna configuración en el SOAPClient generado para habilitar la compresión de solicitudes.
Parece que me falta un ajuste de configuración o código en el lado del cliente para comprimir la solicitud antes de enviarla al servidor. ¿O lo que intento hacer (datos GZipping POST) ni siquiera es compatible?
Más información: estoy usando .NET 4.0 en el cliente y el servidor.
He blogueado en eso hace 4 años
http://netpl.blogspot.com/2009/07/aspnet-webservices-two-way-response-and.html
Me pregunto por qué no has encontrado esto al buscar en Google. De todos modos, esto debería funcionar para usted, lo tenemos trabajando en un entorno de producción desde hace 4 años.