当前位置: 移动技术网 > IT编程>开发语言>.net > 深入.net调用webservice的总结分析

深入.net调用webservice的总结分析

2017年12月12日  | 移动技术网IT编程  | 我要评论
最近做一个项目,由于是在别人框架里开发app,导致了很多限制,其中一个就是不能直接引用webservice 。
我们都知道,调用webserivice 最简单的方法就是在 "引用"  那里点击右键,然后选择"引用web服务",再输入服务地址。
确定后,会生成一个app.config 里面就会自动生成了一些配置信息。
现在正在做的这个项目就不能这么干。后来经过一番搜索,就找出另外几种动态调用webservice 的方法。
废话少说,下面是webservice 代码
复制代码 代码如下:

view code
using system;
using system.collections.generic;
using system.linq;
using system.web;
using system.web.services;
namespace testwebservice
{
    /// <summary>
    /// service1 的摘要说明
    /// </summary>
    [webservice(namespace = "http://tempuri.org/",description="我的web服务")]
    [webservicebinding(conformsto = wsiprofiles.basicprofile1_1)]
    [system.componentmodel.toolboxitem(false)]
    // 若要允许使用 asp.net ajax 从脚本中调用此 web 服务,请取消对下行的注释。
    // [system.web.script.services.scriptservice]
    public class testwebservice : system.web.services.webservice
    {
        [webmethod]
        public string helloworld()
        {
            return "测试hello world";
        }
        [webmethod]
        public string test()
        {
            return "测试test";
        }

        [webmethod(cacheduration = 60,description = "测试")]
        public list<string> getpersons()
        {
            list<string> list = new list<string>();
            list.add("测试一");
            list.add("测试二");
            list.add("测试三");
            return list;
        } 
    }
}

动态调用示例:
方法一:
看到很多动态调用webservice都只是动态调用地址而已,下面发一个不光是根据地址调用,方法名也可以自己指定的,主要原理是根据指定的webservice地址的wsdl,然后解析模拟生成一个代理类,通过反射调用里面的方法
复制代码 代码如下:

view code
using system;
using system.io;
using system.collections.generic;
using system.linq;
using system.collections;
using system.web;
using system.net;
using system.reflection;
using system.codedom;
using system.codedom.compiler;
using system.web.services;
using system.text;
using system.web.services.description;
using system.web.services.protocols;
using system.xml.serialization;
using system.windows.forms;
namespace consoleapplication1
{
    class program
    {
        static void main(string[] args)
        {
            webclient client = new webclient();
            string url = "http://localhost:3182/service1.asmx?wsdl";//这个地址可以写在config文件里面,这里取出来就行了.在原地址后面加上: ?wsdl
            stream stream = client.openread(url);
            servicedescription description = servicedescription.read(stream);
            servicedescriptionimporter importer = new servicedescriptionimporter();//创建客户端代理代理类。
            importer.protocolname = "soap"; //指定访问协议。
            importer.style = servicedescriptionimportstyle.client; //生成客户端代理。
            importer.codegenerationoptions = codegenerationoptions.generateproperties | codegenerationoptions.generatenewasync;
            importer.addservicedescription(description, null, null); //添加wsdl文档。
            codenamespace nmspace = new codenamespace(); //命名空间
            nmspace.name = "testwebservice";
            codecompileunit unit = new codecompileunit();
            unit.namespaces.add(nmspace);
            servicedescriptionimportwarnings warning = importer.import(nmspace, unit);
            codedomprovider provider = codedomprovider.createprovider("csharp");
            compilerparameters parameter = new compilerparameters();
            parameter.generateexecutable = false;
            parameter.outputassembly = "mytest.dll";//输出程序集的名称
            parameter.referencedassemblies.add("system.dll");
            parameter.referencedassemblies.add("system.xml.dll");
            parameter.referencedassemblies.add("system.web.services.dll");
            parameter.referencedassemblies.add("system.data.dll");
            compilerresults result = provider.compileassemblyfromdom(parameter, unit);
            if (result.errors.haserrors)
            {
                // 显示编译错误信息
            }
            assembly asm = assembly.loadfrom("mytest.dll");//加载前面生成的程序集
            type t = asm.gettype("testwebservice.testwebservice");
            object o = activator.createinstance(t);
            methodinfo method = t.getmethod("getpersons");//getpersons是服务端的方法名称,你想调用服务端的什么方法都可以在这里改,最好封装一下
            string[] item = (string[])method.invoke(o, null);
            //注:method.invoke(o, null)返回的是一个object,如果你服务端返回的是dataset,这里也是用(dataset)method.invoke(o, null)转一下就行了,method.invoke(0,null)这里的null可以传调用方法需要的参数,string[]形式的
            foreach (string str in item)
                console.writeline(str);
            //上面是根据webservice地址,模似生成一个代理类,如果你想看看生成的代码文件是什么样子,可以用以下代码保存下来,默认是保存在bin目录下面
            textwriter writer = file.createtext("mytest.cs");
            provider.generatecodefromcompileunit(unit, writer, null);
            writer.flush();
            writer.close();
        }
    }
}

方法二:利用 wsdl.exe生成webservice代理类:
根据提供的wsdl生成webservice代理类,然后在代码里引用这个类文件。
步骤:
1、在开始菜单找到  microsoft visual studio 2010 下面的visual studio tools , 点击visual studio 命令提示(2010),打开命令行。
2、 在命令行中输入:  wsdl /language:c# /n:testdemo /out:d:/temp/testservice.cs http://jm1.services.gmcc.net/ad/services/ad.asmx?wsdl
这句命令行的意思是:对最后面的服务地址进行编译,在d盘temp 目录下生成testservice文件。
3、 把上面命令编译后的cs文件,复制到我们项目中,在项目代码中可以直接new 一个出来后,可以进行调用。
贴出由命令行编译出来的代码:
复制代码 代码如下:

view code
//------------------------------------------------------------------------------
// <auto-generated>
//     此代码由工具生成。
//     运行时版本:4.0.30319.225
//
//     对此文件的更改可能会导致不正确的行为,并且如果
//     重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
//
// 此源代码由 wsdl 自动生成, version=4.0.30319.1。
//
namespace bingosoft.module.surveyquestionnaire.dal {
    using system;
    using system.diagnostics;
    using system.xml.serialization;
    using system.componentmodel;
    using system.web.services.protocols;
    using system.web.services;
    using system.data;

   
    /// <remarks/>
    [system.codedom.compiler.generatedcodeattribute("wsdl", "4.0.30319.1")]
    [system.diagnostics.debuggerstepthroughattribute()]
    [system.componentmodel.designercategoryattribute("code")]
    [system.web.services.webservicebindingattribute(name="webserviceforilooksoap", namespace="http://tempuri.org/")]
    public partial class webserviceforilook : system.web.services.protocols.soaphttpclientprotocol {

        private system.threading.sendorpostcallback getrecordnumoperationcompleted;

        private system.threading.sendorpostcallback getvotelistoperationcompleted;

        private system.threading.sendorpostcallback voteoperationcompleted;

        private system.threading.sendorpostcallback giveupoperationcompleted;

        private system.threading.sendorpostcallback getquestiontasklistoperationcompleted;

        /// <remarks/>
        public webserviceforilook() {
            this.url = "http://st1.services.gmcc.net/qnaire/services/webserviceforilook.asmx";
        }

        /// <remarks/>
        public event getrecordnumcompletedeventhandler getrecordnumcompleted;

        /// <remarks/>
        public event getvotelistcompletedeventhandler getvotelistcompleted;

        /// <remarks/>
        public event votecompletedeventhandler votecompleted;

        /// <remarks/>
        public event giveupcompletedeventhandler giveupcompleted;

        /// <remarks/>
        public event getquestiontasklistcompletedeventhandler getquestiontasklistcompleted;

        /// <remarks/>
        [system.web.services.protocols.soapdocumentmethodattribute("http://tempuri.org/getrecordnum", requestnamespace="http://tempuri.org/", responsenamespace="http://tempuri.org/", use=system.web.services.description.soapbindinguse.literal, parameterstyle=system.web.services.protocols.soapparameterstyle.wrapped)]
        public int[] getrecordnum(string appcode, string userid) {
            object[] results = this.invoke("getrecordnum", new object[] {
                        appcode,
                        userid});
            return ((int[])(results[0]));
        }

        /// <remarks/>
        public system.iasyncresult begingetrecordnum(string appcode, string userid, system.asynccallback callback, object asyncstate) {
            return this.begininvoke("getrecordnum", new object[] {
                        appcode,
                        userid}, callback, asyncstate);
        }

        /// <remarks/>
        public int[] endgetrecordnum(system.iasyncresult asyncresult) {
            object[] results = this.endinvoke(asyncresult);
            return ((int[])(results[0]));
        }

        /// <remarks/>
        public void getrecordnumasync(string appcode, string userid) {
            this.getrecordnumasync(appcode, userid, null);
        }

        /// <remarks/>
        public void getrecordnumasync(string appcode, string userid, object userstate) {
            if ((this.getrecordnumoperationcompleted == null)) {
                this.getrecordnumoperationcompleted = new system.threading.sendorpostcallback(this.ongetrecordnumoperationcompleted);
            }
            this.invokeasync("getrecordnum", new object[] {
                        appcode,
                        userid}, this.getrecordnumoperationcompleted, userstate);
        }

        private void ongetrecordnumoperationcompleted(object arg) {
            if ((this.getrecordnumcompleted != null)) {
                system.web.services.protocols.invokecompletedeventargs invokeargs = ((system.web.services.protocols.invokecompletedeventargs)(arg));
                this.getrecordnumcompleted(this, new getrecordnumcompletedeventargs(invokeargs.results, invokeargs.error, invokeargs.cancelled, invokeargs.userstate));
            }
        }

        /// <remarks/>
        [system.web.services.protocols.soapdocumentmethodattribute("http://tempuri.org/getvotelist", requestnamespace="http://tempuri.org/", responsenamespace="http://tempuri.org/", use=system.web.services.description.soapbindinguse.literal, parameterstyle=system.web.services.protocols.soapparameterstyle.wrapped)]
        public system.data.dataset getvotelist(string appcode, string userid) {
            object[] results = this.invoke("getvotelist", new object[] {
                        appcode,
                        userid});
            return ((system.data.dataset)(results[0]));
        }

        /// <remarks/>
        public system.iasyncresult begingetvotelist(string appcode, string userid, system.asynccallback callback, object asyncstate) {
            return this.begininvoke("getvotelist", new object[] {
                        appcode,
                        userid}, callback, asyncstate);
        }

        /// <remarks/>
        public system.data.dataset endgetvotelist(system.iasyncresult asyncresult) {
            object[] results = this.endinvoke(asyncresult);
            return ((system.data.dataset)(results[0]));
        }

        /// <remarks/>
        public void getvotelistasync(string appcode, string userid) {
            this.getvotelistasync(appcode, userid, null);
        }

        /// <remarks/>
        public void getvotelistasync(string appcode, string userid, object userstate) {
            if ((this.getvotelistoperationcompleted == null)) {
                this.getvotelistoperationcompleted = new system.threading.sendorpostcallback(this.ongetvotelistoperationcompleted);
            }
            this.invokeasync("getvotelist", new object[] {
                        appcode,
                        userid}, this.getvotelistoperationcompleted, userstate);
        }

        private void ongetvotelistoperationcompleted(object arg) {
            if ((this.getvotelistcompleted != null)) {
                system.web.services.protocols.invokecompletedeventargs invokeargs = ((system.web.services.protocols.invokecompletedeventargs)(arg));
                this.getvotelistcompleted(this, new getvotelistcompletedeventargs(invokeargs.results, invokeargs.error, invokeargs.cancelled, invokeargs.userstate));
            }
        }

        /// <remarks/>
        [system.web.services.protocols.soapdocumentmethodattribute("http://tempuri.org/vote", requestnamespace="http://tempuri.org/", responsenamespace="http://tempuri.org/", use=system.web.services.description.soapbindinguse.literal, parameterstyle=system.web.services.protocols.soapparameterstyle.wrapped)]
        public bool vote(string appcode, string userid, string qtaskid, string answer) {
            object[] results = this.invoke("vote", new object[] {
                        appcode,
                        userid,
                        qtaskid,
                        answer});
            return ((bool)(results[0]));
        }

        /// <remarks/>
        public system.iasyncresult beginvote(string appcode, string userid, string qtaskid, string answer, system.asynccallback callback, object asyncstate) {
            return this.begininvoke("vote", new object[] {
                        appcode,
                        userid,
                        qtaskid,
                        answer}, callback, asyncstate);
        }

        /// <remarks/>
        public bool endvote(system.iasyncresult asyncresult) {
            object[] results = this.endinvoke(asyncresult);
            return ((bool)(results[0]));
        }

        /// <remarks/>
        public void voteasync(string appcode, string userid, string qtaskid, string answer) {
            this.voteasync(appcode, userid, qtaskid, answer, null);
        }

        /// <remarks/>
        public void voteasync(string appcode, string userid, string qtaskid, string answer, object userstate) {
            if ((this.voteoperationcompleted == null)) {
                this.voteoperationcompleted = new system.threading.sendorpostcallback(this.onvoteoperationcompleted);
            }
            this.invokeasync("vote", new object[] {
                        appcode,
                        userid,
                        qtaskid,
                        answer}, this.voteoperationcompleted, userstate);
        }

        private void onvoteoperationcompleted(object arg) {
            if ((this.votecompleted != null)) {
                system.web.services.protocols.invokecompletedeventargs invokeargs = ((system.web.services.protocols.invokecompletedeventargs)(arg));
                this.votecompleted(this, new votecompletedeventargs(invokeargs.results, invokeargs.error, invokeargs.cancelled, invokeargs.userstate));
            }
        }

        /// <remarks/>
        [system.web.services.protocols.soapdocumentmethodattribute("http://tempuri.org/giveup", requestnamespace="http://tempuri.org/", responsenamespace="http://tempuri.org/", use=system.web.services.description.soapbindinguse.literal, parameterstyle=system.web.services.protocols.soapparameterstyle.wrapped)]
        public bool giveup(string appcode, string userid, string qtaskid) {
            object[] results = this.invoke("giveup", new object[] {
                        appcode,
                        userid,
                        qtaskid});
            return ((bool)(results[0]));
        }

        /// <remarks/>
        public system.iasyncresult begingiveup(string appcode, string userid, string qtaskid, system.asynccallback callback, object asyncstate) {
            return this.begininvoke("giveup", new object[] {
                        appcode,
                        userid,
                        qtaskid}, callback, asyncstate);
        }

        /// <remarks/>
        public bool endgiveup(system.iasyncresult asyncresult) {
            object[] results = this.endinvoke(asyncresult);
            return ((bool)(results[0]));
        }

        /// <remarks/>
        public void giveupasync(string appcode, string userid, string qtaskid) {
            this.giveupasync(appcode, userid, qtaskid, null);
        }

        /// <remarks/>
        public void giveupasync(string appcode, string userid, string qtaskid, object userstate) {
            if ((this.giveupoperationcompleted == null)) {
                this.giveupoperationcompleted = new system.threading.sendorpostcallback(this.ongiveupoperationcompleted);
            }
            this.invokeasync("giveup", new object[] {
                        appcode,
                        userid,
                        qtaskid}, this.giveupoperationcompleted, userstate);
        }

        private void ongiveupoperationcompleted(object arg) {
            if ((this.giveupcompleted != null)) {
                system.web.services.protocols.invokecompletedeventargs invokeargs = ((system.web.services.protocols.invokecompletedeventargs)(arg));
                this.giveupcompleted(this, new giveupcompletedeventargs(invokeargs.results, invokeargs.error, invokeargs.cancelled, invokeargs.userstate));
            }
        }

        /// <remarks/>
        [system.web.services.protocols.soapdocumentmethodattribute("http://tempuri.org/getquestiontasklist", requestnamespace="http://tempuri.org/", responsenamespace="http://tempuri.org/", use=system.web.services.description.soapbindinguse.literal, parameterstyle=system.web.services.protocols.soapparameterstyle.wrapped)]
        public system.data.dataset getquestiontasklist(string appcode, string userid) {
            object[] results = this.invoke("getquestiontasklist", new object[] {
                        appcode,
                        userid});
            return ((system.data.dataset)(results[0]));
        }

        /// <remarks/>
        public system.iasyncresult begingetquestiontasklist(string appcode, string userid, system.asynccallback callback, object asyncstate) {
            return this.begininvoke("getquestiontasklist", new object[] {
                        appcode,
                        userid}, callback, asyncstate);
        }

        /// <remarks/>
        public system.data.dataset endgetquestiontasklist(system.iasyncresult asyncresult) {
            object[] results = this.endinvoke(asyncresult);
            return ((system.data.dataset)(results[0]));
        }

        /// <remarks/>
        public void getquestiontasklistasync(string appcode, string userid) {
            this.getquestiontasklistasync(appcode, userid, null);
        }

        /// <remarks/>
        public void getquestiontasklistasync(string appcode, string userid, object userstate) {
            if ((this.getquestiontasklistoperationcompleted == null)) {
                this.getquestiontasklistoperationcompleted = new system.threading.sendorpostcallback(this.ongetquestiontasklistoperationcompleted);
            }
            this.invokeasync("getquestiontasklist", new object[] {
                        appcode,
                        userid}, this.getquestiontasklistoperationcompleted, userstate);
        }

        private void ongetquestiontasklistoperationcompleted(object arg) {
            if ((this.getquestiontasklistcompleted != null)) {
                system.web.services.protocols.invokecompletedeventargs invokeargs = ((system.web.services.protocols.invokecompletedeventargs)(arg));
                this.getquestiontasklistcompleted(this, new getquestiontasklistcompletedeventargs(invokeargs.results, invokeargs.error, invokeargs.cancelled, invokeargs.userstate));
            }
        }

        /// <remarks/>
        public new void cancelasync(object userstate) {
            base.cancelasync(userstate);
        }
    }

    /// <remarks/>
    [system.codedom.compiler.generatedcodeattribute("wsdl", "4.0.30319.1")]
    public delegate void getrecordnumcompletedeventhandler(object sender, getrecordnumcompletedeventargs e);

    /// <remarks/>
    [system.codedom.compiler.generatedcodeattribute("wsdl", "4.0.30319.1")]
    [system.diagnostics.debuggerstepthroughattribute()]
    [system.componentmodel.designercategoryattribute("code")]
    public partial class getrecordnumcompletedeventargs : system.componentmodel.asynccompletedeventargs {

        private object[] results;

        internal getrecordnumcompletedeventargs(object[] results, system.exception exception, bool cancelled, object userstate) :
                base(exception, cancelled, userstate) {
            this.results = results;
        }

        /// <remarks/>
        public int[] result {
            get {
                this.raiseexceptionifnecessary();
                return ((int[])(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [system.codedom.compiler.generatedcodeattribute("wsdl", "4.0.30319.1")]
    public delegate void getvotelistcompletedeventhandler(object sender, getvotelistcompletedeventargs e);

    /// <remarks/>
    [system.codedom.compiler.generatedcodeattribute("wsdl", "4.0.30319.1")]
    [system.diagnostics.debuggerstepthroughattribute()]
    [system.componentmodel.designercategoryattribute("code")]
    public partial class getvotelistcompletedeventargs : system.componentmodel.asynccompletedeventargs {

        private object[] results;

        internal getvotelistcompletedeventargs(object[] results, system.exception exception, bool cancelled, object userstate) :
                base(exception, cancelled, userstate) {
            this.results = results;
        }

        /// <remarks/>
        public system.data.dataset result {
            get {
                this.raiseexceptionifnecessary();
                return ((system.data.dataset)(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [system.codedom.compiler.generatedcodeattribute("wsdl", "4.0.30319.1")]
    public delegate void votecompletedeventhandler(object sender, votecompletedeventargs e);

    /// <remarks/>
    [system.codedom.compiler.generatedcodeattribute("wsdl", "4.0.30319.1")]
    [system.diagnostics.debuggerstepthroughattribute()]
    [system.componentmodel.designercategoryattribute("code")]
    public partial class votecompletedeventargs : system.componentmodel.asynccompletedeventargs {

        private object[] results;

        internal votecompletedeventargs(object[] results, system.exception exception, bool cancelled, object userstate) :
                base(exception, cancelled, userstate) {
            this.results = results;
        }

        /// <remarks/>
        public bool result {
            get {
                this.raiseexceptionifnecessary();
                return ((bool)(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [system.codedom.compiler.generatedcodeattribute("wsdl", "4.0.30319.1")]
    public delegate void giveupcompletedeventhandler(object sender, giveupcompletedeventargs e);

    /// <remarks/>
    [system.codedom.compiler.generatedcodeattribute("wsdl", "4.0.30319.1")]
    [system.diagnostics.debuggerstepthroughattribute()]
    [system.componentmodel.designercategoryattribute("code")]
    public partial class giveupcompletedeventargs : system.componentmodel.asynccompletedeventargs {

        private object[] results;

        internal giveupcompletedeventargs(object[] results, system.exception exception, bool cancelled, object userstate) :
                base(exception, cancelled, userstate) {
            this.results = results;
        }

        /// <remarks/>
        public bool result {
            get {
                this.raiseexceptionifnecessary();
                return ((bool)(this.results[0]));
            }
        }
    }

    /// <remarks/>
    [system.codedom.compiler.generatedcodeattribute("wsdl", "4.0.30319.1")]
    public delegate void getquestiontasklistcompletedeventhandler(object sender, getquestiontasklistcompletedeventargs e);

    /// <remarks/>
    [system.codedom.compiler.generatedcodeattribute("wsdl", "4.0.30319.1")]
    [system.diagnostics.debuggerstepthroughattribute()]
    [system.componentmodel.designercategoryattribute("code")]
    public partial class getquestiontasklistcompletedeventargs : system.componentmodel.asynccompletedeventargs {

        private object[] results;

        internal getquestiontasklistcompletedeventargs(object[] results, system.exception exception, bool cancelled, object userstate) :
                base(exception, cancelled, userstate) {
            this.results = results;
        }

        /// <remarks/>
        public system.data.dataset result {
            get {
                this.raiseexceptionifnecessary();
                return ((system.data.dataset)(this.results[0]));
            }
        }
    }
}

方法三:利用http 协议的get和post
这是最为灵活的方法。
复制代码 代码如下:

view code
using system;
using system.collections;
using system.io;
using system.net;
using system.text;
using system.xml;
using system.xml.serialization;
namespace bingosoft.ria.common
{
    /// <summary>
    ///  利用webrequest/webresponse进行webservice调用的类
    /// </summary>
    public class webservicecaller
    {
        #region tip:使用说明
        //webservices 应该支持get和post调用,在web.config应该增加以下代码
        //<webservices>
        //  <protocols>
        //    <add name="httpget"/>
        //    <add name="httppost"/>
        //  </protocols>
        //</webservices>
        //调用示例:
        //hashtable ht = new hashtable();  //hashtable 为webservice所需要的参数集
        //ht.add("str", "test");
        //ht.add("b", "true");
        //xmldocument xx = websvccaller.querysoapwebservice("http://localhost:81/service.asmx", "helloworld", ht);
        //messagebox.show(xx.outerxml);
        #endregion
        /// <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_x_x("soap", "body", "http://schemas.xmlsoap.org/soap/envelope/");
            xmlelement soapbody = doc.createelement("soap", "body", "http://schemas.xmlsoap.org/soap/envelope/");
            //xmlelement soapmethod = doc.createelement_x_x(methodname);
            xmlelement soapmethod = doc.createelement(methodname);
            soapmethod.setattribute("xmlns", xmlns);
            foreach (string k in pars.keys)
            {
                //xmlelement soappar = doc.createelement_x_x(k);
                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("&");
                }
                //sb.append(httputility.urlencode(k) + "=" + httputility.urlencode(pars[k].tostring()));
            }
            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();//缓存xmlnamespace,避免重复调用getnamespace
    }
}

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网