Pergunta

Eu tenho uma silverlight 2 beta 2 aplicação que acede a um serviço web do WCF.Devido a isso, atualmente, ela só pode usar basicHttp ligação.O webservice retornará bastante grandes quantidades de dados XML.Isso parece bastante desperdício de largura de banda ponto de vista de utilização como resposta, se zipado, seria menor por um fator de 5 (na verdade, eu colei a resposta em um arquivo txt e compactado mesmo).

O pedido tem o "Accept-Encoding:gzip, deflate" - existe alguma maneira de ter o serviço do WCF gzip (ou outra forma de comprimir) a resposta?

Eu achei esse link mas com certeza parece um pouco complexo para a funcionalidade que deve ser tratada out-of-the-box IMHO.

OK - em primeiro lugar eu marquei a solução a utilizar o Sistema.IO.A compressão como a resposta como eu nunca poderia "parecer" para obter o IIS7 compressão dinâmica para o trabalho.Bem, como se vê:

  1. A Compressão dinâmica no IIS7 foi trabalhando al junto.É justo que Nikhil Web Developer Auxiliar de plugin para o IE não mostrá-lo a trabalhar.Meu palpite é que, desde SL mãos a chamada de serviço da web off para o browser, o browser lida com ele "nos bastidores" e Nikhil ferramenta de nunca vê a resposta compactada.Eu era capaz de confirmar isso usando o Fiddler, que monitora o tráfego externo para a aplicação do browser.No fiddler, a resposta foi, na verdade, compactado gzip!!

  2. O outro problema com o Sistema.IO.Solução de compressão é que esse Sistema.IO.A compressão não existe no Silverlight CLR.

Portanto, do meu ponto de vista, a maneira mais FÁCIL para ativar o WCF compressão no Silverlight é para ativar a Compactação Dinâmica no IIS7 e escrever nenhuma linha de código.

Foi útil?

Solução

Se você estiver usando o IIS7, dê uma olhada no Compressão Módulo De.Isto permite-lhe configurar a compactação para solicitações HTTP para o servidor.

Outras dicas

WS-Compressão para o WCF permite-lhe configurar a compressão da ligação.

Ver WS-Compressão para WCF por Pablo M.Cibraro

Como alternativa, tente Microsofts GZip Codificador De Exemplo o que "cria um codificador de canal que utiliza o Sistema.IO.A compressão.Classe GZipStream para comprimir saída do WCF mensagens"

Eu não vejo um caminho nativo para o WCF para fazer a compressão quando se faz um projeto do WCF recentemente.Eu usei apenas o Sistema.IO.Compactação de espaço de nomes e fez uma rápida compressor.Aqui está o código que eu usei

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;
    }
}

então eu só tinha meus serviços em uma matriz de bytes como uma entrada, como tal

void ReceiveData(byte[] data);

Funcionou bem para mim.

Também deve ser notado que você pode precisar adicionar o tipo de mime para applicationHost.config sob <httpCompression><dynamicTypes> seção além de ativar a compactação do site:

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

Se certas respostas dinâmicas não estão sendo comprimido (e algumas são), ele poderia ser um tipo de mime problema.Use o Fiddler para obter os detalhes associados com o pedido.Rastreamento de solicitação falha pode ser útil para determinar se ou não o IIS é mesmo tentar compressão a resposta.Se a compressão estiver configurado corretamente, você verá uma NO_MATCHING_CONTENT_TYPE no completa de rastreamento seção de saída do rastreamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top