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

一般情况下winform调用webservice时步骤

1添加服务引用---高级----添加web引用------填写url--添加web引用即可完成对webservice的引用

让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务。

如果需要动态调用WebService,要实现这样的功能:

publicstaticobjectInvokeWebService(stringurl,  stringmethodname,object[] args)

其中,url是Web服务的地址,methodname是要调用服务方法名,args是要调用Web服务所需的参数,返回值就是web服务返回的结果了。

要实现这样的功能,你需要这几个方面的技能:反射、CodeDom、编程使用C#编译器、WebService。在了解这些知识后,就可以容易的实现web服务的动态调用了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Web.Services.Description;
using Microsoft.CSharp;
namespace NetbankTMP
{
    public static class WebServiceHelper
    {
        /// <summary>
        /// 动态调用WebService
        /// </summary>
        /// <param name="url">WebService地址</param>
        /// <param name="methodname">方法名(模块名)</param>
        /// <param name="args">参数列表,无参数为null</param>
        /// <returns>object</returns>
        public static object InvokeWebService(string url, string methodname, object[] args)
        {
            return InvokeWebService(url, null, methodname, args);
        }
        /// <summary>
        /// 动态调用WebService
        /// </summary>
        /// <param name="url">WebService地址</param>
        /// <param name="classname">类名</param>
        /// <param name="methodname">方法名(模块名)</param>
        /// <param name="args">参数列表</param>
        /// <returns>object</returns>
        public static object InvokeWebService(string url, string classname, string methodname, object[] args)
         {
             string @namespace = "fangqm.Netbank.WebService.webservice";
             if (classname == null || classname == "")
             {
                 classname = WebServiceHelper.GetClassName(url);
             }
            //获取服务描述语言(WSDL)
              WebClient wc = new WebClient();
             Stream stream = wc.OpenRead(url+"?WSDL");//【1】
            ServiceDescription sd = ServiceDescription.Read(stream);//【2】
             ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();//【3】
             sdi.AddServiceDescription(sd, "", "");
             CodeNamespace cn = new CodeNamespace(@namespace);//【4】
             //生成客户端代理类代码
             CodeCompileUnit ccu = new CodeCompileUnit();//【5】
            ccu.Namespaces.Add(cn);
             sdi.Import(cn, ccu);
            CSharpCodeProvider csc = new CSharpCodeProvider();//【6】
             ICodeCompiler icc = csc.CreateCompiler();//【7】
             //设定编译器的参数
             CompilerParameters cplist = new CompilerParameters();//【8】
             cplist.GenerateExecutable = false;
             cplist.GenerateInMemory = true;
             cplist.ReferencedAssemblies.Add("System.dll");
             cplist.ReferencedAssemblies.Add("System.XML.dll");
             cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
             cplist.ReferencedAssemblies.Add("System.Data.dll");
             //编译代理类
             CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);//【9】
             if (true == cr.Errors.HasErrors)
            {
 System.Text.StringBuilder sb = new StringBuilder();
                foreach (CompilerError ce in cr.Errors)
                 {
                     sb.Append(ce.ToString());
                     sb.Append(System.Environment.NewLine);
                 }
                 throw new Exception(sb.ToString());
             }

            //生成代理实例,并调用方法
             System.Reflection.Assembly assembly = cr.CompiledAssembly;
             Type t = assembly.GetType(@namespace+"."+ classname, true, true);
             object bj = Activator.CreateInstance(t);//【10】
             System.Reflection.MethodInfo mi = t.GetMethod(methodname);//【11】
             return mi.Invoke(obj, args);

         }
        private static string GetClassName(string url)
        {
            //假如URL为"http://localhost/InvokeService/Service1.asmx"
            //最终的返回值为 Service1
            string[] parts = url.Split(‘/‘);
            string[] pps = parts[parts.Length - 1].Split(‘.‘);
            return pps[0];
        }
    }
}

上面的注释已经很好的说明了各代码段的功能,下面给个例子看看,这个例子是通过访问http://www.webservicex.net/globalweather.asmx服务来获取各大城市的天气状况。

             stringurl="http://www.webservicex.net/globalweather.asmx";

            string[] args=newstring[2] ;

             args[0]=this.textBox_CityName.Text ;

             args[1]="China";

            objectresult=WebServiceHelper.InvokeWebService(url ,"GetWeather",args) ;

            this.label_Result.Text=result.ToString() ;

如果没有参数,则参数为null

上述的例子中,调用web服务使用了两个参数,第一个是城市的名字,第二个是国家的名字,Web服务返回的是XML文档,可以从其中解析出温度、风力等天气情况。

关于这段代码的注释

【2】    ServiceDescription类提供一种方法,以创建和格式化用于描述 XML Web services 的有效的 Web 服务描述语言 (WSDL) 文档文件,该文件是完整的,具有适当的命名空间、元素和特性。无法继承此类。

ServiceDescription.Read 方法 (Stream) 通过直接从 Stream实例加载 XML 来初始化ServiceDescription类的实例。

【3】    ServiceDescriptionImporter 类 公开一种为 XML Web services 生成客户端代理类的方法。

ServiceDescriptionImporter.AddServiceDescription 方法将指定的ServiceDescription添加到要导入的ServiceDescriptions值的集合中。

【4】   CodeNamespace表示命名空间声明。

【5】   CodeCompileUnit会提供一个CodeDOM程式圆形的容器,CodeCompileUnit含有一个集合,可以储存含有CodeDOM原始程式码原形,专案参考的组件集合以及专案组件属性集合的CodeNamespace物件。

【6】   CSharpCodeProvider类提供存取C#程式码产生器和程式码编译器的执行个体。

【7】   取得C#程式码编译器的执行个体

【8】   创建编译器的参数实例

【9】   CompilerResults表示从编译器返回的编译结果。使用指定的编译器设定,根据CodeCompileUnit物件之指定阵列所包含的System.CodeDom树状结构,编译一个组件。

【10】 Activator类包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。无法继承此类Activator.CreateInstance 方法  使用与指定参数匹配程度最高的构造函数创建指定类型的实例。

【11】 MethodInfo 的实例可以通过调用GetMethods或者Type对象或派生自Type的对象的GetMethod方法来获取,还可以通过调用表示泛型方法定义的 MethodInfo 的MakeGenericMethod方法来获取。

时间: 2024-11-03 20:54:40

C#中Winform动态调用Webservice的方法(转)的相关文章

winform 动态调用webservice

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

动态调用webservice的方法

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

动态调用WebService时动态获取返回Class中的属性

直接给代码: var ret = HTTPS.WSHelper.InvokeWebService("WebService URL", "MethodName", object[] args);var type = ret.GetType();var propertyinfo = type.GetProperty("result");if (propertyinfo == null){       throw new Exception("

C# 动态调用WebService

Reference from : http://blog.csdn.net/chuxiamuxiang/article/details/5731988 在C#程序中,若要调用WebService,一般是采用"添加Web引用"的方式来实现的.但如果此WebService的URL是在程序运行过程中才能获得的,那怎么办呢?那就必须是"动态"调用这个WebService了. 网上有不少关于这方面的例子,总结了一下,主要有两种:(1)每次都动态调用,(2)将WebServic

[转]Net 下采用GET/POST/SOAP方式动态调用WebService C#实现

本文转自:http://www.cnblogs.com/splendidme/archive/2011/10/05/2199501.html 一直以来,我们都为动态调用WebService方法而烦恼.在.Net环境下,最常用的方法就是采用代理类来调用WebService,可以通过改变代理类的Url属性来实现动态调用,但当xmlns改变时就会出错,似乎要重新绑定Webservice并重新编译后才能再次运行.我无意中通过百度搜索找了一个采用GET/POST/SOAP方式动态调用WebService的

动态调用WebService(C#) (非常实用)

前言 站在开发者的角度,WebService 技术确实是不再“时髦”.甚至很多人会说,我们不再用它.当然,为了使软件可以更简洁,更有层次,更易于实现缓存等机制,我是非常建议将 SOAP 转为 RESTful 架构风格的.但到目前为止,WebService 在一些Public Institution 中使用还是十分广泛的. 这里主要讨论一下关于WebService的调用问题.关于WebService 的调用分为静态调用和动态调用两种,外加直接Http请求方式 静态调用 静态调用的方式是通过“Add

C# 动态调用 WebService (转)

通常我们在程序中需要调用WebService时,都是通过"添加Web引用",让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名.参数绑定在一起了,这是VS.NET自动为我们生成Web服务代理的限制.如果哪一天发布Web服务的URL改变了,则我们需要重新让VS.NET生成代理,并重新编译.在某些情况下,这可能是不能忍受的,我们需要动态调用WebService的能力.比如我们可以把Web服务的URL保存在配置文件中,

【转】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

Web Service学习笔记:动态调用WebService

原文:Web Service学习笔记:动态调用WebService 多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我们可能需要在程序运行期间动态调用一个未知的服务.在 .NET Framework 的 System.Web.Services.Description 命名空间中有我们需要的东西. 具体步骤: 1. 从目标 URL 下载 WSDL 数据. 2. 使用 ServiceDescription 创建和格式化 WSDL