当前位置: 移动技术网 > IT编程>开发语言>.net > C# 不添加WEB引用调用WSDL接口

C# 不添加WEB引用调用WSDL接口

2019年04月12日  | 移动技术网IT编程  | 我要评论

苏岩岛,生活常识百科宝典,育儿

在项目中添加web引用耦合度较高,更新时要更新引用,所以我建议不添加web引用调用wsdl接口,废话不多说,直接上代码

例如wsdl地址为:http://xxx.xx.xxx.xxx:9115/wsportal/soap/ws?wsdl    需要调用execute方法  先查看描述文件参数 

 

/// <summary>
        /// 需要webservice支持post调用
        /// </summary>
        public static xmldocument querypostwebservice(string url, string methodname, hashtable pars)
        {
            httpwebrequest request = (httpwebrequest)httpwebrequest.create(url + "/" + methodname);
            request.method = "post";
            request.contenttype = "application/x-www-form-urlencoded";
            setwebrequest(request);
            byte[] data = encodepars(pars);
            writerequestdata(request, data);
            return readxmlresponse(request.getresponse());
        }


        /// <summary>
        /// 需要webservice支持get调用
        /// </summary>
        public static xmldocument querygetwebservice(string url, string methodname, hashtable pars)
        {
            httpwebrequest request = (httpwebrequest)httpwebrequest.create(url + "/" + methodname + "?" + parstostring(pars));
            request.method = "get";
            request.contenttype = "application/x-www-form-urlencoded";
            setwebrequest(request);
            return readxmlresponse(request.getresponse());
        }

        /// <summary>
        /// 通用webservice调用(soap),参数pars为string类型的参数名、参数值
        /// </summary>
        public static xmldocument querysoapwebservice(string url, string methodname, hashtable pars)
        {
            if (_xmlnamespaces.containskey(url))
            {
                return querysoapwebservice(url, methodname, pars, _xmlnamespaces[url].tostring());
            }
            else
            {
                return querysoapwebservice(url, methodname, pars, getnamespace(url));
            }
        }

        private static xmldocument querysoapwebservice(string url, string methodname, hashtable pars, string xmlns)
        {
            _xmlnamespaces[url] = xmlns;
            httpwebrequest request = (httpwebrequest)httpwebrequest.create(url);
            request.method = "post";
            request.contenttype = "text/xml; charset=utf-8";
            request.headers.add("soapaction", "\"" + xmlns + (xmlns.endswith("/") ? "" : "/") + methodname + "\"");
            setwebrequest(request);
            byte[] data = encodeparstosoap(pars, xmlns, methodname);
            writerequestdata(request, data);
            xmldocument doc = new xmldocument(), doc2 = new xmldocument();
            doc = readxmlresponse(request.getresponse());

            xmlnamespacemanager mgr = new xmlnamespacemanager(doc.nametable);
            mgr.addnamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
            string retxml = doc.selectsinglenode("//soap:body/*/*", mgr).innerxml;
            doc2.loadxml("<root>" + retxml + "</root>");
            adddelaration(doc2);
            return doc2;
        }
        private static string getnamespace(string url)
        {
            httpwebrequest request = (httpwebrequest)webrequest.create(url + "?wsdl");
            setwebrequest(request);
            webresponse response = request.getresponse();
            streamreader sr = new streamreader(response.getresponsestream(), encoding.utf8);
            xmldocument doc = new xmldocument();
            doc.loadxml(sr.readtoend());
            sr.close();
            return doc.selectsinglenode("//@targetnamespace").value;
        }

        private static byte[] encodeparstosoap(hashtable pars, string xmlns, string methodname)
        {
            xmldocument doc = new xmldocument();
            doc.loadxml("<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:envelope>");
            adddelaration(doc);
            xmlelement soapbody = doc.createelement("soap", "body", "http://schemas.xmlsoap.org/soap/envelope/");
            xmlelement soapmethod = doc.createelement(methodname);
            soapmethod.setattribute("xmlns", xmlns);
            foreach (string k in pars.keys)
            {
                xmlelement soappar = doc.createelement(k);
                soappar.innerxml = objecttosoapxml(pars[k]);
                soapmethod.appendchild(soappar);
            }
            soapbody.appendchild(soapmethod);
            doc.documentelement.appendchild(soapbody);
            return encoding.utf8.getbytes(doc.outerxml);
        }
        private static string objecttosoapxml(object o)
        {
            xmlserializer myserializer = new xmlserializer(o.gettype());
            memorystream ms = new memorystream();
            myserializer.serialize(ms, o);
            xmldocument doc = new xmldocument();
            doc.loadxml(encoding.utf8.getstring(ms.toarray()));
            if (doc.documentelement != null)
            {
                return doc.documentelement.innerxml;
            }
            else
            {
                return o.tostring();
            }
        }

        /// <summary>
        /// 设置凭证与超时时间
        /// </summary>
        /// <param name="request"></param>
        private static void setwebrequest(httpwebrequest request)
        {
            request.credentials = credentialcache.defaultcredentials;
            request.timeout = 10000;
        }

        private static void writerequestdata(httpwebrequest request, byte[] data)
        {
            request.contentlength = data.length;
            stream writer = request.getrequeststream();
            writer.write(data, 0, data.length);
            writer.close();
        }

        private static byte[] encodepars(hashtable pars)
        {
            return encoding.utf8.getbytes(parstostring(pars));
        }

        private static string parstostring(hashtable pars)
        {
            stringbuilder sb = new stringbuilder();
            foreach (string k in pars.keys)
            {
                if (sb.length > 0)
                {
                    sb.append("&");
                }
            }
            return sb.tostring();
        }

        private static xmldocument readxmlresponse(webresponse response)
        {
            streamreader sr = new streamreader(response.getresponsestream(), encoding.utf8);
            string retxml = sr.readtoend();
            sr.close();
            xmldocument doc = new xmldocument();
            doc.loadxml(retxml);
            return doc;
        }

        private static void adddelaration(xmldocument doc)
        {
            xmldeclaration decl = doc.createxmldeclaration("1.0", "utf-8", null);
            doc.insertbefore(decl, doc.documentelement);
        }

        private static hashtable _xmlnamespaces = new hashtable();

使用:

1 //以xml参数类型为例,其他太简单
2 string xml = request.toxml("requestparameter").tostring();
3             hashtable ht = new hashtable();
4             ht.add("arg0", xml);
5             xmldocument xd =querysoapwebservice("地址","方法" , ht);

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网