Compactar um HttpWebRequest usando gzip

Estou desenvolvendo um.NET 4.0 Aplicativo de console para servir como umSOAP Web Service cliente que enviará os dados (POST) para terceiros. Não tenho controle sobre o serviço web no lado do servidor. O terceiro forneceuWSDL's usar, e eu pude importá-los e usá-los com um sucesso razoável. No entanto, é necessário compactar a mensagem de solicitação usandogzip, e não consegui descobrir como fazer isso usando os serviços de proxy.

Este tópico aqui no SO, me levou a acreditar que, sem ter controle sobre o código do cliente e do servidor, a solicitação não pode ser compactada. Como resultado dessa descoberta, escrevi o código no meu aplicativo para criar manualmente oSOAP XML em umXDocument objeto; então, preencheu os valores doWSDL objetos de classe proxy que eu havia codificado anteriormente para usar meu aplicativo cliente.

O primeiro requisito para esse cliente é enviar a mensagem compactada viagzip. Depois de alguma pesquisa, vi respostas tão simples quanto adicionar oHttpRequestHeader.AcceptEncoding, "gzip, deflate" para o cabeçalho da solicitação. Infelizmente, fazer isso que não pareceu funcionar.

Atualmente, o certificado que estou recuperando não é o certificado real. Estou tentando tornar o código o mais sólido possível antes de implantar em um ambiente de teste para fazer o teste de serviço real.

Existe uma maneira de compactar a solicitação por meio da chamada de proxy (wsdl)?Há algo que estou faltando para compactar corretamente oHttpWebRequest?Pode haver algo mais errado que resultaria na devolução da mensagem de erro?
Eu esperaria que uma mensagem diferente referente à autenticação fosse inválida se a solicitação em si estivesse OK.Existe uma maneira de a compactação ser feita através doapp.config?

No próximo conjunto de requisitos, estou um pouco confuso sobre como lidar / o que fazer. Sob a suposição de que o que defini comoContentType da solicitação para, como (e o que) eu adiciono para adicionar ocontent-transfer-encoding peça ao pedido? Se oContentType está incorreto, como devo adicionar essas informações também?

O tipo de conteúdo do Evenlope SOAP com anexo codificado por MTOM deve ser "application / xop + xml" e a codificação de transferência de conteúdo deve ser de 8 bits.

Passei por algumas iterações do código abaixo, no entanto, acredito que os trechos relevantes são o código em sua forma mais simples. Informe-me se houver outras informações que possam ser úteis.

Método para criar o HttpWebRequest:

private static HttpWebRequest CreateWebRequest(SoapAction action)
{
    string url = GetUrlAddress(action);

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

    request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
    request.Headers.Add("SOAPAction", action.ToString());
    request.ContentType = "application/xop+xml";
    request.Accept = "text/xml";
    request.Method = "POST";

    request.ClientCertificates.Add(/* Retrieve X509Certificate Object*/);

    return request;
}

Código para enviar a solicitação:

using (Stream stream = request.GetRequestStream())
{
    soapXml.Save(stream);
}

Código para recuperar a resposta:
É assim que estou recuperando a mensagem de erro que está ocorrendo

try
{
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        using (StreamReader reader = new StreamReader(response, Encoding.Default))
        {
            File.AppendAllText(filePath, response.Headers.ToString());
            File.AppendAllText(filePath, reader.ReadToEnd());
        }
    }
}
catch (WebException ex)
{
    using (var stream = ex.Response.GetResponseStream())
    {
        using (var reader = new StreamReader(stream))
        {
            Console.WriteLine(reader.ReadToEnd());
        }
    }
}

Mensagem de erro sendo recebida:

A mensagem de solicitação deve ser enviada usando a compactação HTTP (RFC 1952 - GZIP).

questionAnswers(2)

yourAnswerToTheQuestion