Question

J'ai ce XML ciselée d'un App.config qui je trouvé ici:

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

Pour certaines raisons, je ne veux pas coder en dur l'assemblée et je ne veux pas utiliser un fichier XML pour que.

Curriently j'utilise ce code:

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

Mais la dernière ligne n'a pas de travail, comment puis-je résoudre ce problème?Je pense qu'il doit être possible de le faire par code.


Curriently j'ai trouvé presque une solution, j'ai juste un problème quand j'essaie d'utiliser le JsonSerialisator cependant je utiliser cette liaison maintenant:

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

L' GZipMessageEncoder est un peu modifiée pour faire de la compression facultatif:

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

Mais mon code de laisser visual studio crash pendant le débogage dans la ligne marquée.Des idées?

Était-ce utile?

La solution

Il ne fonctionne pas de cette façon. WebHttpBinding n'utiliserons jamais votre élément de liaison. BindingElementExtensions dans le fichier de configuration ne définit de nouveaux éléments qui peuvent être utilisés pour définir CutomBinding dans le fichier de configuration.Si vous avez besoin de le faire dans le code que vous venez de créer une nouvelle instance de CustomBinding et de le remplir avec des éléments de liaison que vous souhaitez utiliser (classes dérivées de BindingElement) - vous allez utiliserGZipMessageEncodingBindingElement.Liées exemple décrit que le code ainsi:

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top