wcf http-headers gzip

WCF GZip solicitud de compresión/procesamiento de respuesta



http-headers (2)

¿Cómo obtengo un cliente WCF para procesar las respuestas del servidor que han sido GZipped o desinfladas por IIS?

En IIS, he seguido las instrucciones here sobre cómo hacer que IIS 6 gzip todas las respuestas (donde la solicitud contenía "Aceptar-Codificación: gzip, desinflar") emitido por .svc wcf services.

En el cliente, he seguido las instrucciones here y here sobre cómo insertar este encabezado en la solicitud web: "Aceptar codificación: gzip, desinflar".

Fiddler2 muestra que la respuesta es binaria y no es simple Xml.

El cliente se bloquea con una excepción que básicamente dice que no hay encabezado Xml, lo que por supuesto es cierto.

En mi IClientMessageInspector, la aplicación falla antes de que se llame a AfterReceiveReply.

Algunas notas adicionales:

(1) No puedo cambiar el servicio WCF o el cliente ya que son suministrados por un tercero. Sin embargo, puedo adjuntar comportamientos y / o inspectores de mensajes a través de la configuración si esta es la dirección correcta para tomar.

(2) No quiero comprimir / descomprimir solo el cuerpo del jabón, sino todo el mensaje.

¿Alguna idea / solución?

* SOLUCIONADO *

No fue posible escribir una extensión WCF para lograr estos objetivos. En cambio, seguí este article CodeProject que aboga por una clase de ayuda:

public class CompressibleHttpRequestCreator : IWebRequestCreate { public CompressibleHttpRequestCreator() { } WebRequest IWebRequestCreate.Create(Uri uri) { HttpWebRequest httpWebRequest = Activator.CreateInstance(typeof(HttpWebRequest), BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] { uri, null }, null) as HttpWebRequest; if (httpWebRequest == null) { return null; } httpWebRequest.AutomaticDecompression =DecompressionMethods.GZip | DecompressionMethods.Deflate; return httpWebRequest; } }

y también, una adición al archivo de configuración de la aplicación:

<configuration> <system.net> <webRequestModules> <remove prefix="http:"/> <add prefix="http:" type="Pajocomo.Net.CompressibleHttpRequestCreator, Pajocomo" /> </webRequestModules> </system.net> </configuration>

Lo que parece estar sucediendo es que WCF eventualmente le pide a una fábrica u otra en el fondo de system.net que proporcione una instancia de HttpWebRequest, y proporcionamos la ayuda que se le pedirá que cree la instancia requerida.

En el archivo de configuración del cliente WCF, todo lo que se necesita es un simple basicHttpBinding, sin la necesidad de extensiones personalizadas.

Cuando se ejecuta la aplicación, la solicitud Http del cliente contiene el encabezado "Aceptar codificación: gzip, desinflar", el servidor devuelve una respuesta web comprimida y el cliente descomprime transparentemente la respuesta http antes de entregarla a WCF.

Cuando traté de aplicar esta técnica a los servicios web, descubrí que NO funcionaba. Aunque la clase auxiliar se ejecutó de la misma manera que cuando el cliente WCF la utilizó, la solicitud http no contenía el encabezado "Accept-Encoding: ...".

Para que esto funcione para los servicios web, tuve que editar la clase del proxy web y agregar este método:

protected override System.Net.WebRequest GetWebRequest(Uri uri) { System.Net.HttpWebRequest rq = (System.Net.HttpWebRequest)base.GetWebRequest(uri); rq.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; return rq; }

Tenga en cuenta que no importaba si el CompressibleHttpRequestCreator y el bloque del archivo de configuración de la aplicación estaban presentes o no. Para los servicios web, solo se reemplazó GetWebRequest en el proxy del servicio web.


Gracias por tu consejo WCF! Vamos a habilitar la compresión de IIS para los servicios en mi tienda, y espero que su solución funcione. Con "Para que esto funcione para los servicios web", ¿se refería a los clientes de la vieja escuela SoapHttpProtocol? Porque la clase SoapHttpProtocol tiene una propiedad EnableDecompression incorporada, que manejará automáticamente el encabezado Compression y el manejo de respuestas.


Aquí hay una respuesta que di a otra pregunta sobre el tema. Esa pregunta fue solicitada desde la perspectiva de ADO.NET Data Services, pero mi respuesta fue puramente acerca de WCF.