2011-03-02 9 views
5

¿Cómo crea .NET framework el mensaje SOAP del contrato de mensaje? ¿Qué clase de serializador se usa para serializar el contrato del mensaje?Traducción de contrato de mensaje a mensaje SOAP

+0

¿Por qué quieres saber? ¿Qué te gustaría lograr? –

+1

@ John Saunders: Quería ver cómo se vería el mensaje SOAP cuando se serializa/formatea el contrato del mensaje. Después de algunas excavaciones, encontré la clase que realmente me puede ayudar a lograr eso sin enviar el mensaje por el cable. La clase 'TypedMessageConverter' tiene varias sobrecargas de método estático' Create' que devuelven una instancia de clase que hereda de 'TypedMessageConverter'. Puedo pasar una instancia de contrato de mensaje a una de sus sobrecargas de método 'ToMessage' y llamar al método' ToString' en el 'Mensaje' devuelto para lograr lo que realmente quería. Voy a publicar el ejemplo en algún momento de hoy –

Respuesta

10

En la parte inferior de la portada, el mensaje SOAP se construye principalmente utilizando el método de clase SerializeReply que implementa la interfaz System.ServiceModel.Dispatcher.IDispatchMessageFormatter. Hay dos formateadores internos que utilizan las implementaciones XmlObjectSerializer y XmlSerializer para serializar los encabezados y el cuerpo del mensaje.

Afortunadamente, hay otra clase pública que proporciona funcionalidad deseada. El TypedMessageConverter crea internamente el formateador de mensajes de despacho de forma similar al formateador configurado para una operación de despacho. Utiliza el método privado GetOperationFormatter en Create sobrecargas de métodos estáticos para crear una instancia de clase interna System.ServiceModel.Description.XmlMessageConverter.

Después de crear la instancia de implementación TypedMessageConverter, se puede pasar la instancia de contrato de mensaje al método ToMessage. Finalmente, la llamada al método ToString en la instancia Message devuelve la cadena esperada del mensaje SOAP.

TypedMessageConverter converter = TypedMessageConverter.Create(
    typeof(CustomMessage), 
    "http://schemas.cyclone.com/2011/03/services/Service/GetData", 
    "http://schemas.cyclone.com/2011/03/data", 
    new DataContractFormatAttribute() { Style = OperationFormatStyle.Rpc }); 
CustomMessage body = new CustomMessage() 
{ 
    // Setting of properties omitted 
}; 
Message message = converter.ToMessage(body, MessageVersion.Soap12); 
string soapMessage = message.ToString(); 
2

Esto dependerá de su configuración. De forma predeterminada, basicHttpBinding y wsHttpBinding usan la clase DataContractSerializer. En lo que respecta a los sobres SOAP, no sé qué clases se usan y no estoy seguro de si serían públicas (podría estar equivocado al respecto).

1

Según tengo entendido, el serializador no lo usa directamente. Crea una estructura interna del tipo Message que luego se escribe en base a MessageVersion y se selecciona Encoder.

La estructura interna es preparada por TypedMessageConverter. Creo que es una clase responsable del procesamiento de contratos de mensajes. Desafortunadamente, es una clase abstracta con implementación interna.

Por eso, los contratos de mensajes funcionan tanto con DataContractSerializer como con XmlSerializer.

-1

Para responder a la pregunta "que quería ver cómo el mensaje SOAP se verá como cuando el contrato mensaje es serializado/formateado"

Usted puede utilizar una herramienta como Fiddler que le permite ver que hay de nuevo sobre el alambre. Aquí puede rastrear el xml del mensaje real que se envía.

Cuestiones relacionadas