tipo iscontenttypesupported custom contenido charset .net wcf
WCF ISO 8859-1 Encoding

.net - custom - iscontenttypesupported c# wcf



Llamar a un servicio web que utiliza la codificación ISO-8859-1 de WCF (4)

En este link , puede descargar los archivos para crear el enlace personalizado y hacer lo siguiente en su código:

CustomBinding binding = new CustomBinding( new CustomTextMessageBindingElement("iso-8859-1", "text/xml", MessageVersion.Soap11), new HttpTransportBindingElement()); myWebService client = new myWebService(); client.Endpoint.Binding = binding;

Intento llamar a un servicio web utilizando WCF que utiliza la siguiente codificación:

<?xml version="1.0" encoding="ISO-8859-1" ?>

No puedo cambiar la codificación de este servicio web. He generado un proxy wcf y cuando intento llamar al proxy, aparece el siguiente error:

FailedSystem.ServiceModel.ProtocolException: el tipo de contenido text / xml; charset = ISO-8859-1 del mensaje de respuesta no coincide con el tipo de contenido del enlace (text / xml; charset = utf-8). Si utiliza un codificador personalizado, asegúrese de que el método IsContentTypeSupported se implemente correctamente.

¿Alguien tiene alguna idea de cómo llamo a un servicio web que no es UTF-8 usando wcf?


No se puede hacer esto de forma inmediata en WCF, desafortunadamente.

Enfrenté el mismo problema y obtuve un enlace personalizado (ya sea en configuración o en código) que puede usar. Se basa en el transporte HTTP, y si eso te sirve, podría publicar la configuración personalizada aquí, o enviarte un enlace al código C # para el enlace.

Esta página de MSDN aquí muestra cómo crear un "CustomTextEncoder" que puede soportar más que utf-8, utf-16 y codificaciones Unicode. Incluye un código fuente de muestra completo y fue muy útil para que funcione.

Esta publicación de blog aquí muestra algunas cosas adicionales a tener en cuenta al intentar que el codificador de texto personalizado funcione correctamente.

Espero que ayude.

Bagazo

ACTUALIZAR:
Basado en el ejemplo de Microsoft que mencioné anteriormente para CustomTextEncoder, puede crear fácilmente un enlace personalizado con una codificación de mensaje de texto ISO-8859-1; solo use este fragmento de configuración (suponiendo que haya descargado y compilado y hecho referencia a ese ejemplo de Microsoft):

<system.serviceModel> <extensions> <bindingElementExtensions> <add name="customTextMessageEncoding" type="Microsoft.ServiceModel.Samples.CustomTextMessageEncodingElement, Microsoft.ServiceModel.Samples.CustomTextEncoder"/> </bindingElementExtensions> </extensions> <bindings> <customBinding> <binding name="ISO8859Binding" > <customTextMessageEncoding encoding="ISO-8859-1" /> <httpTransport /> </binding> </customBinding> </bindings> <client> <endpoint name="Test" address="......." binding="customBinding" bindingConfiguration="ISO8859Binding" contract="IYourContract" /> </client> </system.serviceModel>

Puedes encontrar ese código, más un ISO88591Binding que básicamente envuelve toda esta configuración en código, en mi directorio Skydrive WCF ISO 8859-1 Encoding . Sin embargo, ten cuidado: esto se basa en mis requisitos que tenía en ese momento, por ejemplo, mi servicio necesitaba hablar con https requerido, y también algunos otros ajustes un tanto extraños, por lo que es posible que tengas que modificarlos o hacerlos configurables en config , si es necesario. Ese proyecto ISO88591Binding "también contiene un netHttpBinding que de nuevo es una muestra proporcionada por Microsoft que usé para escribir mi propio enlace personalizado en el código.

Escribir un encuadernado personalizado en WCF definitivamente es posible, pero no realmente para los débiles de corazón ...


Otra opción es utilizar la tecnología más antigua de .NET Framework 2.0 ASMX WebServices que admite iso-8859-1 de fábrica:

Y si el servicio utiliza la Autenticación HTTP básica, puede especificarlo así:

TheService theService = new TheService(); theService.Credentials = new NetworkCredential("username", "password");


Si no desea ocuparse de una gran cantidad de códigos descargados e implementación de bajo nivel, puede solucionarlo utilizando una solicitud de estilo antiguo utilizando la clase HttpWebRequest, como se describe here . Ahora, estará exento de código automatizado e instalaciones de la interfaz y jugará con el análisis Xml manual.