public OperationWSDL Analysize(String url, string operation) { operation = operation.ToLower(); var doc = _baseStream.GetXDocument(url); doc.Descendants().Attributes().Where(a => a.IsNamespaceDeclaration && a.Name != "import").Remove(); foreach (var element in doc.Descendants()) { element.Name = element.Name.LocalName; } var opXpath = @"/definitions/binding/operation[translate(@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '" + operation + @"']"; var opName = doc.XPathSelectElement(opXpath).Attribute("name").Value; var actXpath = @"/definitions/binding/operation[translate(@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '" + operation + @"']/operation"; var action = doc.XPathSelectElement(actXpath).Attribute("soapAction").Value; var tgtNs = doc.XPathSelectElement(@"/definitions").Attribute("targetNamespace").Value; var actBindingName = doc.XPathSelectElement(@"/definitions/binding").Attribute("name").Value; var lctXpath = @"/definitions/service/port[contains(@binding,'" + actBindingName + @"')]/address"; var location = doc.XPathSelectElement(lctXpath).Attribute("location").Value; var inputMsgPath = @"/definitions/portType/operation[translate(@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '" + operation + @"']/input"; var inputMsg = doc.XPathSelectElement(inputMsgPath).Attribute("message").Value.LocalName(); var partPath = @"/definitions/message[contains(@name,'" + inputMsg + @"')]/part"; var parameters = new Dictionary <string, ComplexType>(StringComparer.OrdinalIgnoreCase); foreach (var part in doc.XPathSelectElements(partPath)) { if (part.Attributes().Any(a => a.Name == "element")) { //to do need resuse var schemaPath = @"/definitions/types/schema"; var schemas = doc.XPathSelectElements(schemaPath); foreach (var schema in schemas) { SetParamNamespace(schema, tgtNs, part.Attribute("element").Value.LocalName(), parameters); } } else { var param = part.Attribute("name").Value; parameters.Add(param, new ComplexType { Namespace = tgtNs }); } } OperationWSDL opWsdl = new OperationWSDL(); opWsdl.ServiceLocation = location; opWsdl.SoapAction = action; opWsdl.Operation = opName; opWsdl.OperaitonNamespace = tgtNs; opWsdl.ParameterNamespace = parameters; return(opWsdl); }
/// <summary> /// 封装Soap协议正文 /// </summary> ///<param name="pars"> /// 请求参数值 ///</param> /// <returns> 字节数组</returns> public byte[] EnvelopeSoapBody(OperationWSDL wsdl, Dictionary <string, object> pars, string id, string pwd) { XmlDocument doc = new XmlDocument(); XmlElement root = doc.CreateElement(_soapPrefix, "Envelope", _soapEnvelope); doc.AppendChild(root); InitSoapHeader(doc, id, pwd); XmlElement soapBody = doc.CreateElement(_soapPrefix, "Body", _soapEnvelope); XmlElement soapMethod = doc.CreateElement(wsdl.Operation, wsdl.OperaitonNamespace); foreach (string key in pars.Keys) { XmlElement soapPar = doc.CreateElement(wsdl.ParameterNamespace[key].Name, wsdl.ParameterNamespace[key].Namespace); soapPar.InnerXml = ObjectToSoapXml(pars[key]); soapMethod.AppendChild(soapPar); } soapBody.AppendChild(soapMethod); doc.DocumentElement.AppendChild(soapBody); AddDelaration(doc); return(Encoding.UTF8.GetBytes(doc.OuterXml)); }