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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 JuanDG
21/02/2005 - 18:17 | Informe spam
Hola Ronald,

Te agradezco mucho tu respuesta, pero probé todas las alternativas que me
diste y ninguna funciono, la primera, de modificar el web.config ya la había
hecho, fue lo primero que hice y por eso aclare en mi post que ya había
modificado el requestEncoding y el requestResponse.
Luego una persona de soporte técnico de Microsoft me confirmo que este
método NO FUNCIONA para web services y solo funciona para Web Forms.
Otra persona en el foro de Web Services en ingles me sugirió que pusiera
esta línea en el constructor del servicio:

this.Context.Response.ContentEncoding =
System.Text.Encoding.GetEncoding("ISO-8859-1");

Cuando la agregue a mi versión del servicio hecha en VS 2003 me arroja un
error diciendo que “this” no tiene ningún miembro Context, sin embargo en la
versión del servicio que tengo en VS 2005 esta línea si compilo, pero al
probar el servicios, sigue devolviendo UTF-8

Luego encontré lo del los SoapExtensions en GotDotNet, lo baje, lo probé y
tampoco funciono.

Finalmente recibí tu respuesta, en donde me dabas soluciones que ya había
probado y no funcionaban, sin embargo decidí darle una oportunidad a tu
implementación del SoapExtension, pero igual que la GotDotNet no funciona y
el servicio Web sigue devolviendo UTF-8 y mi cliente sigue generando
excepciones ante esto.

No me explico que es lo que puede estar pasando, y me gustaría saber si tu
ya probaste he implementaste el código que me mandaste, y en caso de que haya
sido así, dime si me puedes mandar el proyecto de VS para yo analizar que
diferencia tiene con el mío.


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


"Ronald Ricardo Ramirez Moran" wrote:

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
Respuesta Responder a este mensaje
#3 Ronald Ricardo Ramirez Moran
22/02/2005 - 02:07 | Informe spam
Hola Juan,
Como ye te dije, el encabezado lo que hace es enviar el mensaje SOAP en
formato ISO-8859-1. Pues como ya lo sabes el Web.config y el App.Config, solo
te sirven en el cliente para la recepcion del XML. Porque bueno, en mi
compañia tuve el mismo problema hace años, e hize esto y me funciona de
maravillas, aunque como ahora es obligado que todos las PCs de la compañia
sean compatibles con todos los formatos y codificaciones.
Algo que quiero recalcar, es que si lo que, en verdad quieres hacer es
enviar XML con este formato, tendras que definirle el formato o codificacion.
Pues aunque si es necesario que tu cliente tenga definido como los datos se
van a recibir.

Espero te ayude,
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 Ronald,

Te agradezco mucho tu respuesta, pero probé todas las alternativas que me
diste y ninguna funciono, la primera, de modificar el web.config ya la había
hecho, fue lo primero que hice y por eso aclare en mi post que ya había
modificado el requestEncoding y el requestResponse.
Luego una persona de soporte técnico de Microsoft me confirmo que este
método NO FUNCIONA para web services y solo funciona para Web Forms.
Otra persona en el foro de Web Services en ingles me sugirió que pusiera
esta línea en el constructor del servicio:

this.Context.Response.ContentEncoding =
System.Text.Encoding.GetEncoding("ISO-8859-1");

Cuando la agregue a mi versión del servicio hecha en VS 2003 me arroja un
error diciendo que “this” no tiene ningún miembro Context, sin embargo en la
versión del servicio que tengo en VS 2005 esta línea si compilo, pero al
probar el servicios, sigue devolviendo UTF-8

Luego encontré lo del los SoapExtensions en GotDotNet, lo baje, lo probé y
tampoco funciono.

Finalmente recibí tu respuesta, en donde me dabas soluciones que ya había
probado y no funcionaban, sin embargo decidí darle una oportunidad a tu
implementación del SoapExtension, pero igual que la GotDotNet no funciona y
el servicio Web sigue devolviendo UTF-8 y mi cliente sigue generando
excepciones ante esto.

No me explico que es lo que puede estar pasando, y me gustaría saber si tu
ya probaste he implementaste el código que me mandaste, y en caso de que haya
sido así, dime si me puedes mandar el proyecto de VS para yo analizar que
diferencia tiene con el mío.


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


"Ronald Ricardo Ramirez Moran" wrote:

> 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
Respuesta Responder a este mensaje
#4 JuanDG
22/02/2005 - 16:21 | Informe spam
Bueno Ronald, como te dije mi cliente no soporta "UTF-8" porque no es un
cliente hecho en .NET, (es mas nisiquiera es un PC) asi que no tengo ni
Web.config y ni App.Config ademas como te dije ayer, la gente de microsoft me
confirmo que el elemento globalization no funciona para web services sino
solamente para web forms.
La unica solucion que encontre fue migrar mi servicio web a Java/Axis que es
mucho mas flexible y configurable y perfectamente puedo entregar mis mensajes
SOAP en ISO-8859-1 modificando una sola linea de codigo.

Espero que con ASP.NET 2.0 arreglen esto y traten de estar a la par con
Java, o tal vez me toque esperar hasta Indigo...

"Ronald Ricardo Ramirez Moran" wrote:

Hola Juan,
Como ye te dije, el encabezado lo que hace es enviar el mensaje SOAP en
formato ISO-8859-1. Pues como ya lo sabes el Web.config y el App.Config, solo
te sirven en el cliente para la recepcion del XML. Porque bueno, en mi
compañia tuve el mismo problema hace años, e hize esto y me funciona de
maravillas, aunque como ahora es obligado que todos las PCs de la compañia
sean compatibles con todos los formatos y codificaciones.
Algo que quiero recalcar, es que si lo que, en verdad quieres hacer es
enviar XML con este formato, tendras que definirle el formato o codificacion.
Pues aunque si es necesario que tu cliente tenga definido como los datos se
van a recibir.

Espero te ayude,
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 Ronald,
>
> Te agradezco mucho tu respuesta, pero probé todas las alternativas que me
> diste y ninguna funciono, la primera, de modificar el web.config ya la había
> hecho, fue lo primero que hice y por eso aclare en mi post que ya había
> modificado el requestEncoding y el requestResponse.
> Luego una persona de soporte técnico de Microsoft me confirmo que este
> método NO FUNCIONA para web services y solo funciona para Web Forms.
> Otra persona en el foro de Web Services en ingles me sugirió que pusiera
> esta línea en el constructor del servicio:
>
> this.Context.Response.ContentEncoding =
> System.Text.Encoding.GetEncoding("ISO-8859-1");
>
> Cuando la agregue a mi versión del servicio hecha en VS 2003 me arroja un
> error diciendo que “this” no tiene ningún miembro Context, sin embargo en la
> versión del servicio que tengo en VS 2005 esta línea si compilo, pero al
> probar el servicios, sigue devolviendo UTF-8
>
> Luego encontré lo del los SoapExtensions en GotDotNet, lo baje, lo probé y
> tampoco funciono.
>
> Finalmente recibí tu respuesta, en donde me dabas soluciones que ya había
> probado y no funcionaban, sin embargo decidí darle una oportunidad a tu
> implementación del SoapExtension, pero igual que la GotDotNet no funciona y
> el servicio Web sigue devolviendo UTF-8 y mi cliente sigue generando
> excepciones ante esto.
>
> No me explico que es lo que puede estar pasando, y me gustaría saber si tu
> ya probaste he implementaste el código que me mandaste, y en caso de que haya
> sido así, dime si me puedes mandar el proyecto de VS para yo analizar que
> diferencia tiene con el mío.
>
>
> Juan David Gomez A.
> Microsoft Certified Professional
> Analista de Desarrollo - PSL S.A.
> Web and Wireless Banking
> Medellin - Colombia
>
>
> "Ronald Ricardo Ramirez Moran" wrote:
>
> > 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
Respuesta Responder a este mensaje
#5 Ronald Ricardo Ramirez Moran
24/02/2005 - 02:05 | Informe spam
Eso espero yo tambien, pero a mi me funciono correctamente, aunque ahora
nuestros estandares en lo que es clientes de Servicios funcionen con UTF-8 y
tuve que obviar esta parte por este tipo de problemas.
Lo de Java, es correcto eso que dices que no modificas una sola Linea de
codigo, pues el estandar de envio de informacion es siempre Iso-8859-1
auqnque ahi tu eres quien elige como lo envias.
Espero que algun momento en esas travesurillas que nos damos los
desarrolladores encuentres el porque no te funciona mi extension soap.

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ó:

Bueno Ronald, como te dije mi cliente no soporta "UTF-8" porque no es un
cliente hecho en .NET, (es mas nisiquiera es un PC) asi que no tengo ni
Web.config y ni App.Config ademas como te dije ayer, la gente de microsoft me
confirmo que el elemento globalization no funciona para web services sino
solamente para web forms.
La unica solucion que encontre fue migrar mi servicio web a Java/Axis que es
mucho mas flexible y configurable y perfectamente puedo entregar mis mensajes
SOAP en ISO-8859-1 modificando una sola linea de codigo.

Espero que con ASP.NET 2.0 arreglen esto y traten de estar a la par con
Java, o tal vez me toque esperar hasta Indigo...

"Ronald Ricardo Ramirez Moran" wrote:

> Hola Juan,
> Como ye te dije, el encabezado lo que hace es enviar el mensaje SOAP en
> formato ISO-8859-1. Pues como ya lo sabes el Web.config y el App.Config, solo
> te sirven en el cliente para la recepcion del XML. Porque bueno, en mi
> compañia tuve el mismo problema hace años, e hize esto y me funciona de
> maravillas, aunque como ahora es obligado que todos las PCs de la compañia
> sean compatibles con todos los formatos y codificaciones.
> Algo que quiero recalcar, es que si lo que, en verdad quieres hacer es
> enviar XML con este formato, tendras que definirle el formato o codificacion.
> Pues aunque si es necesario que tu cliente tenga definido como los datos se
> van a recibir.
>
> Espero te ayude,
> 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 Ronald,
> >
> > Te agradezco mucho tu respuesta, pero probé todas las alternativas que me
> > diste y ninguna funciono, la primera, de modificar el web.config ya la había
> > hecho, fue lo primero que hice y por eso aclare en mi post que ya había
> > modificado el requestEncoding y el requestResponse.
> > Luego una persona de soporte técnico de Microsoft me confirmo que este
> > método NO FUNCIONA para web services y solo funciona para Web Forms.
> > Otra persona en el foro de Web Services en ingles me sugirió que pusiera
> > esta línea en el constructor del servicio:
> >
> > this.Context.Response.ContentEncoding =
> > System.Text.Encoding.GetEncoding("ISO-8859-1");
> >
> > Cuando la agregue a mi versión del servicio hecha en VS 2003 me arroja un
> > error diciendo que “this” no tiene ningún miembro Context, sin embargo en la
> > versión del servicio que tengo en VS 2005 esta línea si compilo, pero al
> > probar el servicios, sigue devolviendo UTF-8
> >
> > Luego encontré lo del los SoapExtensions en GotDotNet, lo baje, lo probé y
> > tampoco funciono.
> >
> > Finalmente recibí tu respuesta, en donde me dabas soluciones que ya había
> > probado y no funcionaban, sin embargo decidí darle una oportunidad a tu
> > implementación del SoapExtension, pero igual que la GotDotNet no funciona y
> > el servicio Web sigue devolviendo UTF-8 y mi cliente sigue generando
> > excepciones ante esto.
> >
> > No me explico que es lo que puede estar pasando, y me gustaría saber si tu
> > ya probaste he implementaste el código que me mandaste, y en caso de que haya
> > sido así, dime si me puedes mandar el proyecto de VS para yo analizar que
> > diferencia tiene con el mío.
> >
> >
> > Juan David Gomez A.
> > Microsoft Certified Professional
> > Analista de Desarrollo - PSL S.A.
> > Web and Wireless Banking
> > Medellin - Colombia
> >
> >
> > "Ronald Ricardo Ramirez Moran" wrote:
> >
> > > 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
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida