/// <summary> /// Invokes a Web Method, with its parameters encoded or not. /// </summary> /// <param name="methodName">Name of the web method you want to call (case sensitive)</param> /// <param name="encode">Do you want to encode your parameters? (default: true)</param> private void Invoke(string methodName, bool encode) { AssertCanInvoke(methodName); string soapStr = @"<?xml version=""1.0"" encoding=""utf-8""?> <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> <soap:Body> <{0} xmlns=""http://tempuri.org/""> {1} </{0}> </soap:Body> </soap:Envelope>"; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url); req.Headers.Add("SOAPAction", "\"http://tempuri.org/" + methodName + "\""); req.ContentType = "text/xml;charset=\"utf-8\""; req.Accept = "text/xml"; req.Method = "POST"; using (Stream stm = req.GetRequestStream()) { string postValues = ""; foreach (var param in Params) { if (encode) { postValues += string.Format("<{0}>{1}</{0}>", HttpUtility.HtmlEncode(param.Key), HttpUtility.HtmlEncode(param.Value)); } else { postValues += string.Format("<{0}>{1}</{0}>", param.Key, param.Value); } } soapStr = string.Format(soapStr, methodName, postValues); using (StreamWriter stmw = new StreamWriter(stm)) { stmw.Write(soapStr); } } using (StreamReader responseReader = new StreamReader(req.GetResponse().GetResponseStream())) { string result = responseReader.ReadToEnd(); ResponseSOAP = XDocument.Parse(UtilsProxyAPI.UnescapeString(result)); ExtractResult(methodName); } }
private void ExtractResult(string methodName) { // Selects just the elements with namespace http://tempuri.org/ (i.e. ignores SOAP namespace) XmlNamespaceManager namespMan = new XmlNamespaceManager(new NameTable()); namespMan.AddNamespace("foo", "http://tempuri.org/"); XElement webMethodResult = ResponseSOAP.XPathSelectElement("//foo:" + methodName + "Result", namespMan); // If the result is an XML, return it and convert it to string if (webMethodResult.FirstNode.NodeType == XmlNodeType.Element) { ResultXML = XDocument.Parse(webMethodResult.FirstNode.ToString()); ResultXML = UtilsProxyAPI.RemoveNamespaces(ResultXML); ResultString = ResultXML.ToString(); } // If the result is a string, return it and convert it to XML (creating a root node to wrap the result) else { ResultString = webMethodResult.FirstNode.ToString(); ResultXML = XDocument.Parse("<root>" + ResultString + "</root>"); } }