2009-12-07 5 views
6

J'écris un client de service Web en C# et je ne veux pas créer et sérialiser/désérialiser des objets, mais plutôt envoyer et recevoir du XML brut.Envoyer et recevoir des messages SOAP

Est-ce possible en C#?

+0

et avez-vous vraiment besoin de savon, ou voulez-vous juste envoyer XML avant et en arrière? –

Répondre

1

Vous pouvez demander à votre méthode de service Web de renvoyer une chaîne contenant le fichier XML, mais prenez en compte le commentaire ci-dessus pour rendre les choses plus sujettes aux erreurs.

2

Oui - vous pouvez simplement déclarer les entrées et sorties XmlNode « s

[WebMethod] 
public XmlNode MyMethod(XmlNode input); 
2

Vous pouvez utiliser les classes System.Net, comme HttpWebRequest et HttpWebResponse à lire et à écrire directement à une connexion HTTP.

Voici un exemple basique (non-compilé, non-compilé, sans erreur, grossièrement simplifié). Ne peut pas être 100% correct, mais au moins vous donner une idée de comment cela fonctionne:

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... 

Cette approche fonctionne bien. Mais chances sont tout ce que vous devez faire peut être accompli en héritant les classes proxy existantes et en remplaçant les membres dont vous avez besoin de se comporter différemment. Ce type de chose est mieux réservé lorsque vous n'avez pas d'autre choix, ce qui n'est pas très souvent dans mon expérience.

+0

+1 merci pour le poste. J'ai posté ma mise en œuvre de votre suggestion aussi. – CRice

+2

Downvote aléatoire sur une réponse de cinq ans? Toute explication? –

4

Voici une partie d'une implémentation que je viens de lancer, basée sur l'exemple de John M Gant. Il est important de définir l'en-tête de demande de type de contenu. De plus, ma demande avait besoin d'informations d'identification.

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; } 
} 
+0

Merci beaucoup, mais comment l'utiliser? –

+0

Demande WebRequest = CreateRequest (soapMessage); – CRice

+0

WebResponse webResponse = request.GetResponse(); – CRice

Questions connexes