Pregunta

Tengo este XML recortado de un App.config cual yo encontrado aquí:

<?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 algunas razones, no quiero codificar el ensamblaje y no quiero usar un archivo XML para eso.

Actualmente 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());

Pero la última línea no funciona, ¿cómo puedo solucionarlo?Creo que debe ser posible hacerlo mediante código.


Actualmente encontré casi una solución. Solo tengo un problema cuando intento usar JsonSerialisator, sin embargo, ahora uso este enlace:

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

El GZipMessageEncoder está un poco modificado para que la compresión sea 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;
    }
}

Pero mi código permitió que Visual Studio fallara durante la depuración en la línea marcada.¿Algunas ideas?

¿Fue útil?

Solución

No funciona de esta manera. WebHttpBinding Nunca utilizará su elemento vinculante. BindingElementExtensions en el archivo de configuración simplemente define nuevos elementos que se pueden usar para definir CutomBinding en el archivo de configuración.Si necesita hacer eso en el código, simplemente cree una nueva instancia de CustomBinding y rellénelo con los elementos vinculantes que desee utilizar (clases derivadas de BindingElement) - usarásGZipMessageEncodingBindingElement.El ejemplo vinculado también describe ese 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top