Domanda

Ho questo XML tagliato da a App.config quale io trovato qui:

<?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>
...

Per alcuni motivi non voglio codificare l'assembly e non voglio utilizzare un file XML per questo.

Attualmente utilizzo questo codice:

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

Ma l'ultima riga non funziona, come posso risolverlo?Penso che debba essere possibile farlo tramite codice.


Attualmente ho trovato quasi una soluzione. Ho solo un problema quando provo a utilizzare JsonSerialisator, tuttavia ora utilizzo questa associazione:

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

IL GZipMessageEncoder è leggermente modificato per rendere la compressione opzionale:

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

Ma il mio codice ha causato l'arresto anomalo di Visual Studio durante il debug nella riga contrassegnata.Qualche idea?

È stato utile?

Soluzione

Non funziona in questo modo. WebHttpBinding non utilizzerà mai il tuo elemento di rilegatura. BindingElementExtensions nel file di configurazione definisce semplicemente nuovi elementi che possono essere utilizzati per definire CutomBinding nel file di configurazione.Se hai bisogno di farlo nel codice, crea semplicemente una nuova istanza di CustomBinding e riempilo con gli elementi di associazione che desideri utilizzare (classi derivate da BindingElement) - utilizzeraiGZipMessageEncodingBindingElement.L'esempio collegato descrive anche quel codice:

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top