¿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
Respuesta
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();
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).
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
.
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.
- 1. Validar mensaje SOAP contra WSDL
- 2. Extracto de cuerpo SOAP de un mensaje SOAP
- 3. Firma digital para mensaje SOAP en WCF
- 4. Serializar el mensaje WCF de forma binaria, y no como mensaje SOAP
- 5. ¿Cómo eliminar los datos de "VsDebuggerCausalityData" del mensaje SOAP?
- 6. Mensaje de excepción a UI
- 7. Validación del mensaje SOAP contra WSDL con múltiples XSD's
- 8. Crear mensaje SOAP desde XML de muestra a través de Java
- 9. ¿Por qué un mensaje SOAP debe enviarse a través de HTTP?
- 10. Cuerpo del mensaje en un mensaje 404
- 11. mensaje gráfico de carga
- 12. Leer Jabón mensaje usando C#
- 13. Mensaje de error con respecto a IEnumerable.GetEnumerator()
- 14. Paso de mensaje frente a bloqueo
- 15. Agregar mensaje de error a @ Html.ValidationSummary
- 16. ¿Cómo puedo controlar el nombre genérico de un mensaje WCF Contrato
- 17. Mensaje emergente de Android
- 18. mensaje de advertencia Firefox
- 19. Mostrar mensaje de validación
- 20. Android: Mensaje de intención
- 21. Tamaño de mensaje JMS
- 22. Cuadro de mensaje personalizado
- 23. enviar un mensaje de texto a través de .net
- 24. mensaje console.log
- 25. No se instaló el complemento ADT en Eclipse - mensaje de error '' viola el contrato ''
- 26. Problema de caso en nombres de etiquetas de mensaje SOAP usando savon
- 27. Patrones de diseño de mensaje
- 28. C# de SOAP - Error en deserializar el cuerpo del mensaje de respuesta (Magento API)
- 29. mensaje de error de PDO?
- 30. Error grave de PHP: "La acción SOAP especificada en el mensaje '' no coincide con la acción HTTP SOAP"
¿Por qué quieres saber? ¿Qué te gustaría lograr? –
@ 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 –