usar tutorial como codigo c# web-services soap

c# - tutorial - Envío y recepción de mensajes SOAP



como usar soap (4)

Puede hacer que su método de servicio web devuelva una cadena que contenga el xml, pero preste atención al comentario anterior sobre cómo hacer que las cosas sean más propensas a errores.

Estoy escribiendo un cliente de servicio web en C # y no quiero crear y serializar / deserializar objetos, sino más bien enviar y recibir XML sin procesar.

¿Es esto posible en C #?


Puede usar las clases System.Net, como HttpWebRequest y HttpWebResponse, para leer y escribir directamente en una conexión HTTP.

Aquí hay un ejemplo básico (improvisado, no compilado, sin errores, excesivamente simplificado). Puede que no sea 100% correcto, pero al menos le dará una idea de cómo funciona:

HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create(url); req.ContentLength = content.Length; req.Method = "POST"; req.GetRequestStream().Write(Encoding.ASCII.GetBytes(content), 0, content.Length); HttpWebResponse resp = (HttpWebResponse) req.getResponse(); //Read resp.GetResponseStream() and do something with it...

Este enfoque funciona bien. Pero lo más probable es que lo que necesite hacer se pueda lograr heredando las clases proxy existentes y anulando los miembros que necesita para comportarse de manera diferente. Este tipo de cosas se reserva mejor para cuando no tienes otra opción, lo cual no es muy frecuente en mi experiencia.


Sí, simplemente puede declarar las entradas y salidas como XmlNode ''s

[WebMethod] public XmlNode MyMethod(XmlNode input);


Aquí hay parte de una implementación que acabo de ejecutar basada en el ejemplo de John M Gant. Es importante establecer el encabezado de solicitud de tipo de contenido. Además, mi solicitud necesitaba credenciales.

protected virtual WebRequest CreateRequest(ISoapMessage soapMessage) { var wr = WebRequest.Create(soapMessage.Uri); wr.ContentType = "text/xml;charset=utf-8"; wr.ContentLength = soapMessage.ContentXml.Length; wr.Headers.Add("SOAPAction", soapMessage.SoapAction); wr.Credentials = soapMessage.Credentials; wr.Method = "POST"; wr.GetRequestStream().Write(Encoding.UTF8.GetBytes(soapMessage.ContentXml), 0, soapMessage.ContentXml.Length); return wr; } public interface ISoapMessage { string Uri { get; } string ContentXml { get; } string SoapAction { get; } ICredentials Credentials { get; } }