Tengo problemas para habilitar la compresión GZIP en mi C# .NET servicio WCF web y estaba esperando que alguien podría saber lo que me falta en mi archivo de configuración App.conf, o lo que es adicional necesario al hacer la llamada para iniciar el servicio web en el código.añadiendo GZIP de servicio WCF REST en C#
He seguido el enlace Applying GZIP Compression to WCF Services que apunta a la descarga del ejemplo de Microsoft de agregar GZIP pero el ejemplo no se correlaciona con la forma en que estoy configurando mi servicio web.
Así que mi App.conf parece
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service name="MyService.Service1">
<endpoint address="http://localhost:8080/webservice" binding="webHttpBinding" contract="MyServiceContract.IService"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior>
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<bindingElementExtensions>
<add name="gzipMessageEncoding" type="MyServiceHost.GZipMessageEncodingElement, MyServiceHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bindingElementExtensions>
</extensions>
<protocolMapping>
<add scheme="http" binding="customBinding" />
</protocolMapping>
<bindings>
<customBinding>
<binding>
<gzipMessageEncoding innerMessageEncoding="textMessageEncoding"/>
<httpTransport hostNameComparisonMode="StrongWildcard" manualAddressing="False" maxReceivedMessageSize="65536" authenticationScheme="Anonymous" bypassProxyOnLocal="False" realm="" useDefaultWebProxy="True"/>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
que simplemente se copian las clases de configuración y GZIP de la MS ejemplo en mi proyecto y añadí mis configuraciones de servicios web relevent. El código que estoy usando para iniciar el servicio de Windows es:
WebServiceHost webserviceHost = new WebServiceHost(typeof(MyService.Service1));
webserviceHost.Open();
El servicio web funciona bien, pero violinista no detecta ninguna respuesta volviendo con GZIP compressesion al hacer una llamada desde un navegador web. También probé programáticamente configurar y ejecutar el servicio web con GZIP, pero fracasé miserablemente. Siendo verde no estoy seguro de qué más necesito configurar, cualquier consejo es muy bueno
He profundizado en esto y descubrí que, dado que estoy ejecutando el servicio web como un objeto WebServiceHost, debe estar anulando el enlace GZIP personalizado en el archivo app.conf con el objeto WebHTTPBinding al que WebServiceHost se establece de manera predeterminada, lo que significa que cualquier cosa que salga del servicio web no se codificará. Para evitar esto que pensé que iba a escribir la unión mediante programación en el código
var serviceType = typeof(Service1);
var serviceUri = new Uri("http://localhost:8080/webservice");
var webserviceHost = new WebServiceHost(serviceType, serviceUri);
CustomBinding binding = new CustomBinding(new GZipMessageEncodingBindingElement(), new HttpTransportBindingElement());
var serviceEndPoint = webserviceHost.AddServiceEndpoint(typeof(IService), binding, "endpoint");
webserviceHost.Description.Endpoints[0].Behaviors.Add(new WebHttpBehavior { HelpEnabled = true });
webserviceHost.Open();
El problema es que no permitirá una costumbre vinculante con el WebHttpBehavior GZIP personalizado. Pero si elimino el comportamiento, mi servicio web REST se pone feo y espera que los objetos Stream sean entradas en mis contratos. No estoy seguro de cómo configurar comportamientos para que cualquier ayuda sea útil.
me temo que no estoy usando IIS pero en vez de distribuirlo como su propia aplicación de servicio ejecutable de Windows, por lo tanto no tener que depender de los clientes la creación de su propio IIS. –
Finalmente he resuelto el problema a través del código. Estaba en lo cierto al decir que se necesita un enlace personalizado para el webServiceHost, pero necesita ser inicializado usando un enlace WebHttp en su contructor, luego mapea el elemento de enlace gzip y un asignador. A continuación, en cada uno de los métodos que implementan el contrato del servidor web, debe cambiar explícitamente la codificación del contenido de los encabezados de respuesta a "gzip". Este enlace ayudó mucho http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/8c3eafae-b6a1-441f-85ef-90721d941a1a –