C#编程,动态调用 Web Service 的一种方法。

版权声明:我不生产代码,我只是代码的搬运工。 https://blog.csdn.net/qq_43307934/article/details/85983544

WebService 的调用分为静态调用和动态调用两种

1、静态调用

静态调用的方式是通过“Add Service Reference...”创建客户端代理类。

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

这样是使工作简单了,但是却将提供Web服务的URL、方法名、参数绑定在一起了,这是VS.NET自动为我们生成Web服务代理的限制。

如果发布Web服务的URL改变了,则我们需要重新让VS.NET生成代理,并重新编译。

此方法可参考链接:https://www.cnblogs.com/anbylau2130/p/3481659.html

或者参考:https://blog.csdn.net/han_better/article/details/81503910

方法是:在资源管理器中点击右键,选择【添加服务引用】,点击 【高级】,【添加WEB引用】,调出对话框:

【WEB引用名】 根据需要可以自己改,最后点击 【添加引用】

下面我们来看调用:

即 sum 就是我们得到的值

 2、动态调用 

思路:

1)从目标 URL 下载 WSDL 数据;

2)使用 ServiceDescription 创建和格式化 WSDL 文档文件;

3)使用 ServiceDescriptionImporter 创建客户端代理类;

4)使用 CodeDom 动态创建客户端代理类程序集;

5)利用反射调用相关 WebService 方法。

参考地址:https://blog.csdn.net/ysq5202121/article/details/6942813

   单独创建一个类

  首先增加如下引用:

上述步骤需要引用如下四个名称空间: 
using System.Web.Services.Description; //WS的描述 
//以下几个用于根据描述动态生成代码并动态编译获取程序集 
using System.CodeDom; 
using Microsoft.CSharp; 
using System.CodeDom.Compiler;
 

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Net;
using System.Web.Services.Description;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
namespace WindowsServiceWebDefaultHotCity
{
    /// <summary<
    /// WebService代理类
    /// </summary<
    public class WebServiceAgent
    {
        private object agent;
        private Type agentType;
        //这里的namespace是需引用的webservices的命名空间,在这里是写死的,大家可以加一个参数从外面传进来。
        private const string CODE_NAMESPACE = "Beyondbit.WebServiceAgent.Dynamic";
        /// <summary<
        /// 构造函数
        /// </summary<
        /// <param name="url"<</param<
        public WebServiceAgent(string url)
        {
            XmlTextReader reader = new XmlTextReader(url + "?wsdl");
            //创建和格式化 WSDL 文档
            ServiceDescription sd = ServiceDescription.Read(reader);
            //创建客户端代理代理类
            ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
            sdi.AddServiceDescription(sd, null, null);
            //使用 CodeDom 编译客户端代理类
            CodeNamespace cn = new CodeNamespace(CODE_NAMESPACE);
            CodeCompileUnit ccu = new CodeCompileUnit();
            ccu.Namespaces.Add(cn);
            sdi.Import(cn, ccu);
            Microsoft.CSharp.CSharpCodeProvider icc = new Microsoft.CSharp.CSharpCodeProvider();
            CompilerParameters cp = new CompilerParameters();
            CompilerResults cr = icc.CompileAssemblyFromDom(cp, ccu);
            agentType = cr.CompiledAssembly.GetTypes()[0];
            agent = Activator.CreateInstance(agentType);
        }
        ///<summary<
        ///调用指定的方法
        ///</summary<
        ///<param name="methodName"<方法名,大小写敏感</param<
        ///<param name="args"<参数,按照参数顺序赋值</param<
        ///<returns<Web服务的返回值</returns<
        public object Invoke(string methodName, params object[] args)
        {
            MethodInfo mi = agentType.GetMethod(methodName);
            return this.Invoke(mi, args);
        }
        ///<summary<
        ///调用指定方法
        ///</summary<
        ///<param name="method"<方法信息</param<
        ///<param name="args"<参数,按照参数顺序赋值</param<
        ///<returns<Web服务的返回值</returns<
        public object Invoke(MethodInfo method, params object[] args)
        {
            return method.Invoke(agent, args);
        }
        public MethodInfo[] Methods
        {
            get
            {
                return agentType.GetMethods();
            }
        }
    }
}

调用:

          //指定地址,因为是动态的,可从文件中读取,或者动态指定。例如:
          private string _url = "http://www.baidu.com";
            

          //创建实例,将服务需要的参数保存
            object[] args = new object[3];
            args[0] = "第一个参数";
            args[1] = "第二个参数";
            args[2] = "第三个参数";

            WindowsServiceWebDefaultHotCity.WebServiceAgent agent = new         WindowsServiceWebDefaultHotCity.WebServiceAgent(_url);
       
            string text=agent.Invoke("服务名", args).ToString();

这个方法到此结束。

3、根据WSDL文件生成WebService服务端代码

根据提供的wsdl生成webservice代理类,然后在代码里引用这个类文件。

步骤:

1、在开始菜单找到  Microsoft Visual Studio  下面的Visual Studio Tools , 点击Visual Studio 命令提示,打开命令行。

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 一个出来后,可以进行调用。

参考地址:https://blog.csdn.net/slimboy123/article/details/4344914

或者:

参考地址:https://www.cnblogs.com/anbylau2130/p/3481804.html

4、其它方法

参考地址:https://www.cnblogs.com/leolion/p/4757320.html

猜你喜欢

转载自blog.csdn.net/qq_43307934/article/details/85983544