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.Envío y recepción de mensajes SOAP
¿Es esto posible en C#?
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.Envío y recepción de mensajes SOAP
¿Es esto posible en C#?
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.
Sí - sólo tiene que declarar las entradas y salidas, XmlNode
's
[WebMethod]
public XmlNode MyMethod(XmlNode input);
Puede utilizar las clases de System.Net, como HttpWebRequest y HttpWebResponse a leer y escribir directamente a una conexión HTTP.
Aquí hay un ejemplo básico (fuera de compás, no compilado, sin errores, extremadamente 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 es posible que lo que necesite hacer se logre heredando las clases de proxy existentes y anulando los miembros que necesita para tener un comportamiento diferente. Este tipo de cosas se reservan mejor para cuando no tienes otra opción, lo cual no es muy frecuente en mi experiencia.
+1 gracias por la publicación. Publiqué mi implementación de tu sugerencia también. – CRice
Voto al azar de respuesta de cinco años de edad? ¿Alguna explicación? –
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; }
}
y realmente necesita SOAP, o simplemente quiere enviar XML de ida y vuelta? –