objet SOAP sur HTTP Post en C # .NET
Question
Je suis en train de composer un message SOAP (en-tête y compris) en C # .NET pour envoyer à une URL en utilisant HTTP POST. L'URL que je veux l'envoyer à n'est pas un service Web, il ne reçoit que des messages SOAP pour éventuellement extraire des informations. Toutes les idées sur la façon de le faire?
La solution
D'abord, vous devez créer un XML valide. J'utilise LINQ to XML pour y parvenir, comme suit:
XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
var document = new XDocument(
new XDeclaration("1.0", "utf-8", String.Empty),
new XElement(soapenv + "Envelope",
new XAttribute(XNamespace.Xmlns + "soapenv", soapenv),
new XElement(soapenv + "Header",
new XElement(soapenv + "AnyOptionalHeader",
new XAttribute("AnyOptionalAttribute", "false"),
)
),
new XElement(soapenv + "Body",
new XElement(soapenv + "MyMethodName",
new XAttribute("AnyAttributeOrElement", "Whatever")
)
)
);
Puis-je l'envoyer à l'aide ( EDIT :. Ajouté XDocument.ToString()
ici)
var req = WebRequest.Create(uri);
req.Timeout = 300000; //timeout
req.Method = "POST";
req.ContentType = "text/xml;charset=UTF-8";
using (var writer = new StreamWriter(req.GetRequestStream()))
{
writer.WriteLine(document.ToString());
writer.Close();
}
Si je dois lire une réponse, je fais (ce qui est suivi du code ci-dessus):
using (var rsp = req.GetResponse())
{
req.GetRequestStream().Close();
if (rsp != null)
{
using (var answerReader =
new StreamReader(rsp.GetResponseStream()))
{
var readString = answerReader.ReadToEnd();
//do whatever you want with it
}
}
}
Autres conseils
votre code ci-dessus était manquant une parenthèse et avait une virgule supplémentaire, je fixe ici:
XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
var document = new XDocument(
new XDeclaration("1.0", "utf-8", String.Empty),
new XElement(soapenv + "Envelope",
new XAttribute(XNamespace.Xmlns + "soapenv", soapenv),
new XElement(soapenv + "Header",
new XElement(soapenv + "AnyOptionalHeader",
new XAttribute("AnyOptionalAttribute", "false")
)
),
new XElement(soapenv + "Body",
new XElement(soapenv + "MyMethodName",
new XAttribute("AnyAttributeOrElement", "Whatever")
)
)
)
);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow