Pregunta

Tengo un silverlight 2 beta 2 aplicación que acceda a un servicio web WCF.Debido a esto, en la actualidad sólo se puede utilizar basicHttp de unión.El webservice volverá bastante grandes cantidades de datos XML.Este parece bastante despilfarro de un uso de ancho de banda punto de vista la respuesta, si la cremallera, sería menor por un factor de 5 (en realidad me pega la respuesta en un archivo txt y con cremallera en ella.)

La solicitud tiene el "Accept-Encoding:gzip, deflate" - ¿hay alguna manera de tener el servicio WCF gzip (o de lo contrario comprimir) la respuesta?

Me hizo encontrar este enlace pero seguro que se parece un poco complejo para la funcionalidad que debe ser manejado fuera-de-la-caja en mi humilde opinión.

ACEPTAR - en primer lugar he marcado la solución con el Sistema.IO.La compresión como la respuesta como yo nunca podría "parecer" para obtener el IIS7 de compresión dinámica para trabajar.Bien, resulta que:

  1. La Compresión dinámica en IIS7 fue trabajando junto al.Es sólo que Nikhil Web del Desarrollador del plugin Auxiliar para el IE no lo demostró en su trabajo.Mi conjetura es que desde que SL manos de la llamada al servicio web de descuento para el navegador, el navegador se encarga de que "bajo las sábanas" y Nikhil la herramienta nunca ve la respuesta comprimida.Yo era capaz de confirmar esta usando el Violinista que monitorea el tráfico externo a la aplicación del navegador.En el fiddler, la respuesta fue, de hecho, comprimido con gzip!!

  2. El otro problema con el Sistema.IO.Solución de compresión es ese Sistema.IO.La compresión no existe en el Silverlight CLR.

Así que desde mi punto de vista, la forma más sencilla para habilitar WCF compresión en Silverlight es para habilitar la Compresión Dinámica en IIS7 y escribir ninguna línea de código.

¿Fue útil?

Solución

Si usted está usando IIS7, echa un vistazo a la Módulo De Compresión.Esto le permite configurar la compresión para las solicitudes HTTP al servidor.

Otros consejos

WS-Compresión de WCF permite configurar la compresión en la unión.

Ver WS-Compresión de WCF por Pablo M.Cibraro

Como alternativa, pruebe Microsoft GZip Codificador De La Muestra que "crea un codificador de canal que utiliza el Sistema.IO.La compresión.GZipStream clase para comprimir saliente mensajes de WCF"

No veo forma nativa para WCF para hacer la compresión cuando se realiza un proyecto WCF recientemente.Acabo de utilizar el Sistema.IO.La compresión espacio de nombres e hizo un rápido compresor.Aquí está el código que he usado

public static class CompressedSerializer
{
    /// <summary>
    /// Decompresses the specified compressed data.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="compressedData">The compressed data.</param>
    /// <returns></returns>
    public static T Decompress<T>(byte[] compressedData) where T : class
    {
        T result = null;
        using (MemoryStream memory = new MemoryStream())
        {
            memory.Write(compressedData, 0, compressedData.Length);
            memory.Position = 0L;

            using (GZipStream zip= new GZipStream(memory, CompressionMode.Decompress, true))
            {
                zip.Flush();
                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                result = formatter.Deserialize(zip) as T;
            }
        }

        return result;
    }

    /// <summary>
    /// Compresses the specified data.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="data">The data.</param>
    /// <returns></returns>
    public static byte[] Compress<T>(T data)
    {
        byte[] result = null;
        using (MemoryStream memory = new MemoryStream())
        {
            using (GZipStream zip= new GZipStream(memory, CompressionMode.Compress, true))
            {
                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                formatter.Serialize(zip, data);
            }

            result = memory.ToArray();
        }

        return result;
    }
}

entonces yo sólo tenía mis servicios en una matriz de bytes como una entrada, tales como

void ReceiveData(byte[] data);

Funcionó muy bien para mí.

También debe señalarse que usted puede necesitar agregar el tipo mime para applicationHost.config bajo <httpCompression><dynamicTypes> sección además de la habilitación de compresión para el sitio:

<add mimeType="application/soap+msbin1" enabled="true" />

Si algunas de las respuestas dinámicas no están siendo comprimido (y algunos) podría ser un tipo mime problema.Usar Fiddler para obtener los detalles asociados con la solicitud.Seguimiento de solicitudes con error puede ser útil en la determinación de si o no IIS está intentando incluso de compresión de la respuesta.Si la compresión está configurado correctamente, usted verá una NO_MATCHING_CONTENT_TYPE en el completo seguimiento la sección de la salida de la traza.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top