示例#1
0
        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);
        }
示例#2
0
        /// <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));
        }