Cambiar la codificación de Utf-8 a Iso-8859-1

18/02/2005 - 17:55 por JuanDG | Informe spam
Hola,

Tengo un Servicio Web en .Net y la codificación de los mensajes SOAP es
siempre Utf-8, y necesito cambiar el servicio web de modo que codifique con
Iso-8859-1 porque es la única codificación soportada por mi cliente de
Servicios Web.

He modificado el web.config y machine.config y ajustado el requestEncoding y
el requestResponse del elemento Globalization para reflejar esto pero siempre
que pruebo esto a través de la página asmx por defecto el encabezado XML
incluye siempre la característica Utf-8, y es lo mismo cuando la probamos
desde el cliente, también devuelve mensajes SOAP codificados en Utf-8.

Alguien me puede ayudar por favor con esto????????

Gracias de Antemano,


Juan David Gomez A.
Microsoft Certified Professional
Analista de Desarrollo - PSL S.A.
Web and Wireless Banking
Medellin - Colombia
 

Leer las respuestas

#1 Ronald Ricardo Ramirez Moran
19/02/2005 - 02:51 | Informe spam
Hola como estas Juan,
Al parecer por lo que vi, tienes problemas al enviar o al recibir
informacion con tu Servicio Web.
Dices que has configurado el elemento Globalization, y sus atributos para
que te permitan usar la codificación Iso-8859-1. Lo primero que quiero
preguntarte [si es el caso] si modificaste el Web.config del cliente y/o del
servidor. Si no lo has hecho en cualquiera de ellos, te suguiero que lo hagas
en los dos, en el servidor, en la localizacion del Web.config; y en el
cliente, asimismo en la localizacion del App.config.
Si no lo has hecho te recomiendo que chequees el siguiente codigo y comparalo:

<configuration>
<system.web>
<globalization
requestEncoding="iso-8859-1"
responseEncoding="iso-8859-1"/>
</system.web>
</configuration>

Esta es la parte de codigo que debes agregar a tu Web.config, y a tu
App.config.
Algo que quiero dejar muy en claro que esto no cambia la el encoding del
WebService. Pero yo he encontrado una manera de hacerlo, cambiando el mensaje
SOAP, implementando una Extensión SOAP, o tambien llamada SoapExtension, que
incluyo a continuación:

using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;
using System.Diagnostics;
using System.Xml;
using System.Text;
namespace WSStudy
{
public class EncodingExtension : SoapExtension
{

Stream newStream;
Stream oldStream;
Encoding encoding;

public override object GetInitializer(LogicalMethodInfo methodInfo,
SoapExtensionAttribute attribute)
{
return ((EncodingExtensionAttribute) attribute).Encoding;
}

public override object GetInitializer(Type WebServiceType)
{
return WebServiceType.GetType();
}

public override void Initialize(object initializer)
{
encoding = (Encoding)initializer;
}

public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeDeserialize:
WriteInput( message );
break;
case SoapMessageStage.AfterDeserialize:
break;
case SoapMessageStage.BeforeSerialize:
break;
case SoapMessageStage.AfterSerialize:
WriteOutput( message );
break;
default:
throw new Exception("invalid stage");
}
}

public override Stream ChainStream( Stream stream )
{
oldStream = stream;
newStream = new MemoryStream();
return newStream;
}

public void WriteOutput( SoapMessage message )
{
newStream.Position = 0;
TextReader reader = new StreamReader(newStream);
TextWriter writer = new StreamWriter(oldStream);
StringBuilder sb = new StringBuilder(reader.ReadToEnd());
sb.Replace("utf-8", encoding.WebName);
writer.WriteLine(sb);
writer.Flush();
}

private void WriteInput(SoapMessage message)
{
Copy(oldStream, newStream);
newStream.Position = 0;
}

private void Copy(Stream sourceStream, Stream destinationStream)
{
TextReader reader = new StreamReader(sourceStream);
TextWriter writer = new StreamWriter(destinationStream);
writer.WriteLine(reader.ReadToEnd());
writer.Flush();
}
}

[AttributeUsage(AttributeTargets.Method)]
public class EncodingExtensionAttribute : SoapExtensionAttribute
{
private Encoding encoding = Encoding.GetEncoding("ISO-8859-1");
private int priority;

public override Type ExtensionType
{
get { return typeof(EncodingExtension); }
}

public override int Priority
{
get { return priority; }
set { priority = value; }
}

public Encoding Encoding
{
get { return encoding; }
set { encoding = value; }
}
}
}


Lecturas Recomendadas:
"Encodings and Code Pages" en
[ http://www.microsoft.com/globaldev/...epage.mspx ]

"Web.config" en
[ http://authors.aspalliance.com/das/...fig.aspx#6 ]

"<globalization> Element" en
[
http://msdn.microsoft.com/library/d...ection.asp ]



Saludos,

Ronald R. Ramirez Moran
Analista Programador
ECUAPLANTATION S.A.

Voluntario de Ineta Latam { http://www.ineta.org/latam }
Coordinador de FoxEcuador { http://groups.msn.com/FoxEcuador }

«Because... I'm Inspired!»




"JuanDG" escribió:

Hola,

Tengo un Servicio Web en .Net y la codificación de los mensajes SOAP es
siempre Utf-8, y necesito cambiar el servicio web de modo que codifique con
Iso-8859-1 porque es la única codificación soportada por mi cliente de
Servicios Web.

He modificado el web.config y machine.config y ajustado el requestEncoding y
el requestResponse del elemento Globalization para reflejar esto pero siempre
que pruebo esto a través de la página asmx por defecto el encabezado XML
incluye siempre la característica Utf-8, y es lo mismo cuando la probamos
desde el cliente, también devuelve mensajes SOAP codificados en Utf-8.

Alguien me puede ayudar por favor con esto????????

Gracias de Antemano,


Juan David Gomez A.
Microsoft Certified Professional
Analista de Desarrollo - PSL S.A.
Web and Wireless Banking
Medellin - Colombia

Preguntas similares