C# 调用WebService的方法

原文:C# 调用WebService的方法

很少用C#动态的去调用Web Service,一般都是通过添加引用的方式,这样的话是自动成了代理,那么动态代理调用就是我们通过代码去调用这个WSDL,然后自己去生成客户端代理。更多的内容可以看下面的两个地址:http://blog.csdn.net/limlimlim/article/details/8651043

http://www.cnblogs.com/VisualStudio/archive/2008/10/29/1322228.html

1.动态调用的url后面注意一定要加上?WSDL
  例如:string _url = "http://服务器IP:端口/CITI_TRANS_WH/wsTransData_InWH.asmx?WSDL";

---------------------------------------------------------------------------------------------------
2.WebService中传递List泛型对象
 [WebMethod]
 public List<TestModel> TestTransDataByClass(int _max)

 注意TestModel必须是可以序列化的类

 //必须可序列化
 [Serializable]
 public class TestModel
 {
     public int No
     {
         get;
         set;
     }
     public string Des
     {
         get;
         set;
     }
 }
---------------------------------------------------------------------------------------------------
3.WebService中不能直接传递输出dictionary<string,object>这样的泛型对象,必须自定义一个类来输出,这个类同样也是可以序列化的
    [Serializable]
    public class MyDictionary
    {
        public List<TestModel> Table1
        {
            get;
            set;
        }

        public List<TestModel2> Table2
        {
            get;
            set;
        }
    }
---------------------------------------------------------------------------------------------------
4.动态调用WebService的类封装
    public static class InvokeWebServiceDynamic
    {
        /// <summary>
        /// 动态调用WebService
        /// </summary>
        /// <param name="_url">web服务url地址</param>
        /// <param name="_methodName">web服务中的方法</param>
        /// <param name="_params">传递给方法的参数</param>
        /// <returns></returns>
        public static object InvokeWebMethod(string _url ,string _methodName,
                                params object[] _params)
        {
            WebClient client = new WebClient();
            //String url = "http://localhost:3182/Service1.asmx?WSDL";//这个地址可以写在Config文件里面
            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.wsTransData_InWH"); //前面的命名空间.类名,类必须是webservice中定义的
            object o = Activator.CreateInstance(t);
            MethodInfo method = t.GetMethod(_methodName);//GetPersons是服务端的方法名称,你想调用服务端的什么方法都可以在这里改,最好封装一下
            object item = method.Invoke(o, _params); //注:method.Invoke(o, null)返回的是一个Object,如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(o, null)转一下就行了
            //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();
            return item;
        }
    }
---------------------------------------------------------------------------------------------------
5.通过反射提取web方法返回的自定义类数据
  说明:
  <1>.WebService方法TestTransDataByDic返回自定义的MyDictionary对象
  <2>.它包含两个属性table1,table2
  <3>.类定义代码如下
   [Serializable]
   public class MyDictionary
   {
     public List<TestModel> Table1
     {
         get;
         set;
     }

     public List<TestModel2> Table2
     {
         get;
         set;
     }
   }

 <4>.客户端调用代码

        private void InvokeDic_Click(object sender, EventArgs e)
        {
            //要注意加?WSDL
            //string _url = "http://localhost:58764/wsTransData_InWH.asmx?WSDL";
            int _count = int.Parse(txtCount.Text);
            object o = InvokeWebServiceDynamic.InvokeWebMethod(_url, "TestTransDataByDic",
                            new object[] { _count });
            PropertyInfo _propertyTable1 = o.GetType().GetProperty("Table1");
            PropertyInfo _propertyTable2 = o.GetType().GetProperty("Table2");

            //读取Table1属性中的数据
            object[] _table1Items = (object[])_propertyTable1.GetValue(o, null);
            if(_table1Items.Length>0)
            {
                lstData1.Visible = false;
                lstData1.Items.Clear();
        //反射出对象TestModel的属性
                PropertyInfo _propertyNo = _table1Items[0].GetType().GetProperty("No");
                PropertyInfo _propertyDes = _table1Items[0].GetType().GetProperty("Des");
                for (int i = 0; i < _table1Items.Length; i++)
                {
                  //根据属性取值
                    string _no = _propertyNo.GetValue(_table1Items[i], null).ToString();
                    string _des = _propertyDes.GetValue(_table1Items[i], null).ToString();
                    string _format = string.Format("第{0}条:{1}", _no, _des);
                    lstData1.Items.Add(_format);
                }

                lstData1.Visible = true;
            }

            //读取Table2属性中的数据
            object[] _table2Items = (object[])_propertyTable2.GetValue(o, null);
            if (_table2Items.Length > 0)
            {
                lstData2.Visible = false;
                lstData2.Items.Clear();
        //反射出对象TestModel2的属性
                PropertyInfo _propertyMyFNo = _table2Items[0].GetType().GetProperty("MyFNo");
                PropertyInfo _propertyMyFDes = _table2Items[0].GetType().GetProperty("MyFDes");

                for (int i = 0; i < _table1Items.Length; i++)
                {
                  //根据属性取值
                    string _no = _propertyMyFNo.GetValue(_table2Items[i], null).ToString();
                    string _des = _propertyMyFDes.GetValue(_table2Items[i], null).ToString();
                    string _format = string.Format("第{0}条:{1}", _no, _des);
                    lstData2.Items.Add(_format);
                }

                lstData2.Visible = true;
            }
            MessageBox.Show("OK");
        }

---------------------------------------------------------------------------------------------------
6.客户端传递序列化对象给webserice方法

        /// <summary>
        ///
        /// </summary>
        /// <param name="_dicGet">是一个客户端传过来的序列化的对象</param>
        /// <returns></returns>
        [WebMethod]
        public string TestInsertData(byte[] _dicGet)
        {
            //反序列化对象
            object _dicGetOK = SqlHelper.DeserializeObject(_dicGet);
            return "ok";
        }

注意:

<1>.创建一个.NET类库,把要传输的对象做成一个结构或类放在类库(假设为ClassLib.dll)中。如:

<2>.然后在客户端程序和webservice项目中都引用ClassLib.dll

<3>.上面两步的目的是让客户端序列化的对象,在webservice服务端能正常反序列化,不会出现反序列化时找不到命名空间的问题

---------------------------------------------------------------------------------------------------
7.修改webserivce最大传输的长度

<?xml version="1.0" encoding="utf-8"?>

<!--
  有关如何配置 ASP.NET 应用程序的详细消息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
  <connectionStrings>
    <add name="ConStr" connectionString="$(ReplacableToken_ConStr-Web.config Connection String_0)"/>
  </connectionStrings>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
        <httpRuntime maxRequestLength="2147483647" />
    </system.web>

</configuration>

 8.修改webservice的超时时间

<?xml version="1.0" encoding="utf-8"?>

<!--
  有关如何配置 ASP.NET 应用程序的详细消息,请访问
  executionTimeout="120"  超时时间120秒
  maxRequestLength="2147483647" 最大请求长度
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
  <connectionStrings>
    <add name="ConStr" connectionString="Data Source=192.128.58.248;Initial catalog=Citibank_test;Uid=sa;pwd=kicpassword"/>
  </connectionStrings>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
        <httpRuntime maxRequestLength="2147483647" executionTimeout="240" />
    </system.web>

</configuration>

 9.序列化,反序列化方法

        public static byte[] SerializeObject(object pObj)
        {
            if (pObj == null)
                return null;
            System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(memoryStream, pObj);
            memoryStream.Position = 0;
            byte[] read = new byte[memoryStream.Length];
            memoryStream.Read(read, 0, read.Length);
            memoryStream.Close();
            return read;
        }

        public static object DeserializeObject(byte[] pBytes)
        {
            object newOjb = null;
            if (pBytes == null)
            {
                return newOjb;
            }

            System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(pBytes);
            memoryStream.Position = 0;
            BinaryFormatter formatter = new BinaryFormatter();
            newOjb = formatter.Deserialize(memoryStream);
            memoryStream.Close();

            return newOjb;
        }
时间: 2024-10-17 11:19:22

C# 调用WebService的方法的相关文章

Flex调用WebService的方法

flex是不能直接访问数据库的,所以可以采用服务的形式进行调用数据,HTTPService.WebServices是比较常用的两种方法,因为接触WebService比较多所以给出其调用方法. import mx.controls.Alert; import mx.events.FlexEvent; import mx.rpc.events.ResultEvent; import mx.rpc.events.FaultEvent; import mx.rpc.soap.LoadEvent; imp

java调用webservice接口方法

webservice的 发布一般都是运用WSDL(web service descriptive language)文件的款式来发布的,在WSDL文件里边,包含这个webservice暴露在外面可供运用的接口.今日查找到了非常好的 webservice provider列表 http://www.webservicex.net/WCF/default.aspx 这上面列出了70多个包含许多方面的free webservice provider,utilities->global weather就

动态调用webservice的方法

动态WebService方法 调用Webservice的方法一般是通过右击项目-->添加服务引用-->输入Webservice地址-->前往-->确定,这样可以顺利调用服,但是需要注意的一点是:如果上面的方法是在非启动项项目(比如某个类库)中添加的,在该项目下会自动生成一个app.config文件,而在主配置文件web.config中并没有自动添加上该webservice的标记,这样运行会出现错误,说找不到配置信息等等……所有还需要把app.config中的<system.s

调用webservice客户端方法 runtime modeler error: Wrapper class &#215;&#215;&#215; is not found. Have you run APT to generate them?

用wsimport生成webservice的客户端以后,调用客户端生成方法时总是出现 runtime modeler error: Wrapper class stardand.nrcms.ncking.com.Login is not found. Have you run APT to generate them?这个错误; 这个公司的接口我原来是做过的,现在不同的是,换了个地址,和原来的环境是一样的,jdk1.6.20,然后加入了myeclipse里边的jax-ws 2.1 Runtime

【转】C# 调用WebService的方法

很少用C#动态的去调用Web Service,一般都是通过添加引用的方式,这样的话是自动成了代理,那么动态代理调用就是我们通过代码去调用这个WSDL,然后自己去生成客户端代理.更多的内容可以看下面的两个地址: http://blog.csdn.net/limlimlim/article/details/8651043 http://www.cnblogs.com/VisualStudio/archive/2008/10/29/1322228.html 1.动态调用的url后面注意一定要加上?WS

C#中Winform动态调用Webservice的方法(转)

一般情况下winform调用webservice时步骤 1添加服务引用---高级----添加web引用------填写url--添加web引用即可完成对webservice的引用 让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务. 如果需要动态调用WebService,要实现这样的功能: publicstaticobjectInvokeWebService(stringurl,  stringmethodname,object[] args) 其中,url是Web服务的地址,me

Java调用WebService的方法总结

1.使用命令wsimport自动生成java代码 wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.  wsimport.exe位于JAVA_HOME\bin目录下. 常用参数为: •-d<目录>  - 将生成.class文件.默认参数. •-s<目录> - 将生成.java文件. •-p<生成的新包名> -将生成的类,放于指定的包下. •(wsdlurl) - http://server:port/service?wsdl,必须的参数. 示

C# 通过Get、Post、Soap调用WebService的方法

实现代码来源于网络,我只是作了一些修改! using System; using System.Web; using System.Xml; using System.Collections; using System.Net; using System.Text; using System.IO; using System.Xml.Serialization; /// <summary> /// 利用WebRequest/WebResponse进行WebService调用的类 /// <

Salesforce不登录调用Webservice的方法

Salesforce中提供了WebService的调用方式,在系统内部使用的时候,比如通过VF上的JS,或者通过标准页面上的按钮进行调用,可以方便的实现很多功能.同时,Salesforce中的WebService可以也以rest方式提供给第三方系统进行可控的数据交互.但是,鉴于Salesforce的License价格虚高,并且有些第三方,例如微信后台是无法进行身份认证的时候,通过public site开放WebSerivce用rest方式调用就非常有必要了. 首先,要在Webservice的首行