Pergunta

Eu tenho esse XML cortado de um App.config que eu encontrado aqui:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <extensions>
      <bindingElementExtensions>
        <add name="gzipMessageEncoding" type="Microsoft.Samples.GZipEncoder.GZipMessageEncodingElement, GZipEncoder, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null" />
      </bindingElementExtensions>
    </extensions>
...

Por alguns motivos, não quero codificar o assembly e não quero usar um arquivo XML para isso.

Atualmente eu uso este código:

Uri baseAddress = new Uri("http://localhost:80/Test");
WebHttpBinding binding = new WebHttpBinding(
                                    WebHttpSecurityMode.TransportCredentialOnly);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
ServiceHost host = new ServiceHost(typeof(ExampleWebService), baseAddress);
host.Extensions.Add(new GZipMessageEncodingElement());

Mas a última linha não funciona, como posso consertar isso?Acho que deve ser possível fazer isso por código.


Atualmente encontrei quase uma solução, só tenho um problema quando tento usar o JsonSerialisator, porém uso esta ligação agora:

CustomBinding cb = new CustomBinding(binding);
MessageEncodingBindingElement inner = (MessageEncodingBindingElement)cb.Elements.ToArray()[0];
cb.Elements.RemoveAt(0);
cb.Elements.Insert(0, new GZipMessageEncodingBindingElement(inner));

O GZipMessageEncoder é um pouco modificado para tornar a compactação opcional:

public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset) {
    var req = WebOperationContext.Current.IncomingRequest;
    var encoding=req.Headers[HttpRequestHeader.AcceptEncoding]; // crash while debug
    //Use the inner encoder to encode a Message into a buffered byte array
    ArraySegment<byte> buffer = innerEncoder.WriteMessage(message, maxMessageSize, bufferManager, 0);
    if(encoding != null && encoding.ToLower().Contains("gzip")) {
        WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.ContentEncoding] = "gzip";
        WebOperationContext.Current.OutgoingRequest.Headers[HttpResponseHeader.ContentEncoding] = "gzip";
        //Compress the resulting byte array
        return CompressBuffer(buffer, bufferManager, messageOffset);
    } else {
        return buffer;
    }
}

Mas meu código deixou o Visual Studio travar durante a depuração na linha marcada.Alguma ideia?

Foi útil?

Solução

Não funciona assim. WebHttpBinding nunca usará seu elemento de ligação. BindingElementExtensions no arquivo de configuração apenas define novos elementos que podem ser usados ​​para definir CutomBinding no arquivo de configuração.Se você precisar fazer isso no código, basta criar uma nova instância de CustomBinding e preencha-o com os elementos de ligação que você deseja usar (classes derivadas de BindingElement) - você usaráGZipMessageEncodingBindingElement.O exemplo vinculado também descreve esse código:

ICollection<BindingElement> bindingElements = new List<BindingElement>();
HttpTransportBindingElement httpBindingElement = new HttpTransportBindingElement();
GZipMessageEncodingBindingElement compBindingElement = new GZipMessageEncodingBindingElement ();
bindingElements.Add(compBindingElement);
bindingElements.Add(httpBindingElement);
CustomBinding binding = new CustomBinding(bindingElements);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top