2012-02-02 17 views
6

Este es nuestro escenario (que no es negociable):transparente de descompresión GZIP de datos post para WCF Servicio Resto

  • WCF resto servicio expuesto a través de HTTP utilizando WebHttpEndpoint alojada en IIS7
  • Todas las respuestas, solicitud de datos de POST transmitido como JSON
  • Cliente web no WCF
  • Hemos activado la compresión gzip para respuestas JSON en IIS7 que funciona bien.

Dado que estamos haciendo peticiones POST con cargas útiles JSON más grandes que hemos implementado cliente lado de compresión GZIP para los datos JSON colocar y fijar el "Content-Encoding" de cabecera para "gzip". Lamentablemente, IIS no maneja esto de la caja. Los datos de la publicación llegan al deserializador WCF en forma comprimida, lo que, por supuesto, da como resultado una excepción.

He intentado varios puntos de extensión para conectar a la tubería de WCF pero la única solución prometedora (Comportamiento de manejo) que no funcionó debido a que en ausencia de un cliente WCF, nunca será llamado el método de la interfaz ApplyClientBehavior IOperationBehavior.

Al final, si implementa un HttpModule el que hace el trabajo, pero no estoy exactamente contento con el resultado debido a las siguientes salvedades:

  • Aunque soy capaz de descomprimir de forma transparente los datos de la solicitud mediante el establecimiento la propiedad Filter del HttpRequest actual a un GZipInputStream que es solo la mitad de la solución porque WCF insiste en leer exactamente HttpRequest.ContentLength bytes de la solicitud que para solicitudes comprimidas obviamente será mucho menor que la carga no comprimida
  • Por alguna razón extraña más allá mi imaginación Microsoft ha bloqueado todas las formas legales para cambiar la longitud del contenido de la r equest. Al final tuve que modificar el campo de respaldo privado para la propiedad ContentLength de la solicitud. Lo cual no es algo que quieras hacer en el código de producción.
  • Microsoft también hizo imposible leer InputStream solicitud por HttpModule de averiguar la longitud del contenido sin comprimir, que requiere que nuestro cliente web para pasar también un encabezado personalizado que contiene la longitud del contenido sin comprimir

Con todo esto se siente como una gran cantidad de trabajo que ni siquiera podría implementarse limpiamente, por lo que me gustaría saber si alguien puede señalar alternativas para implementar la parte de descompresión en IIS. Estoy absolutamente de acuerdo con las recomendaciones para un producto comercial que hace esto si hay uno.

+0

¿Ha encontrado una solución para esto? – Snowy

+0

¿Alguien ha encontrado una solución para esto? –

+0

No parece haber una solución conocida. –

Respuesta

0

creo que usted debería ser capaz de hacer esto con un service side Message inspector

Descomprimir en AfterReceiveRequest

+0

Desafortunadamente, un inspector de mensajes de despacho se ejecuta demasiado tarde en la tubería. Ya lo he intentado y el mensaje pasado al inspector ya está en estado de error. –

+0

¿Ha mirado usando el codificador GZip en su punto final en el lado del servicio http://msdn.microsoft.com/en-us/library/cc138373(v=VS.90).aspx O al menos una versión que decodifica GZip pero codifica normalmente –

Cuestiones relacionadas