C#动态调用WebService
上代码

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web.Services.Description;

namespace Jerry_Libr_Framework.WebServiceOperator
{
    public class CreateWebServiceDLL
    {
        public readonly string Url;
        public CreateWebServiceDLL(string url)
        {
            Url = url;
        }
        //动态调用WebService的方法

        //1. 从目标url下载wsdl数据
        //2. 使用ServiceDescription创建和格式化WSDL文档文件
        //3. 使用ServiceDescriptionImporter动态创建客户端代理类
        //4. 使用CodeDom动态创建代理类程序集
        //5. 利用反射调用相关WebService的方法

        /***************************代码实现*************************************************************/


        public void CreateDLLFromUrl()
        {
            //1. 从目标url下载wsdl数据
            WebClient webClient = new WebClient();
            HttpWebRequest.DefaultWebProxy = new WebProxy($"{Url}:80", true);
            Stream stream = webClient.OpenRead($"{Url}?WSDL");

            //2. 使用ServiceDescription创建和格式化WSDL文档文件
            ServiceDescription serviceDescription = ServiceDescription.Read(stream);

            //3. 使用ServiceDescriptionImporter动态创建客户端代理类
            ServiceDescriptionImporter descriptionImporter = new ServiceDescriptionImporter();
            descriptionImporter.ProtocolName = "SOAP";//设置访问协议
            descriptionImporter.Style = ServiceDescriptionImportStyle.Client;//表示生成客户端代理类

            descriptionImporter.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties | System.Xml.Serialization.CodeGenerationOptions.GenerateNewAsync;//标准和异步

            descriptionImporter.AddServiceDescription(serviceDescription, null, null);


            //4. 使用CodeDom动态创建代理类程序集
            CodeNamespace codeNamespace = new CodeNamespace("Jerry_Libr_Framework.WebServiceOperator");//指定名称空间,默认为全局名称空间

            CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
            codeCompileUnit.Namespaces.Add(codeNamespace);

            ServiceDescriptionImportWarnings warnings = descriptionImporter.Import(codeNamespace, codeCompileUnit);

            CodeDomProvider codeDomProvider = CodeDomProvider.CreateProvider("CSharp");//使用C#

            CompilerParameters compilerParameters = new CompilerParameters();
            compilerParameters.GenerateExecutable = false;//不生成可执行文件
            //compilerParameters.GenerateInMemory = true;
            compilerParameters.OutputAssembly = "SfisWebService.dll";
            compilerParameters.ReferencedAssemblies.Add("System.dll");
            compilerParameters.ReferencedAssemblies.Add("System.XML.dll");
            compilerParameters.ReferencedAssemblies.Add("System.Web.Services.dll");
            compilerParameters.ReferencedAssemblies.Add("System.Data.dll");

           CompilerResults results= codeDomProvider.CompileAssemblyFromDom(compilerParameters, codeCompileUnit);
            //5. 利用反射调用相关WebService的方法

            if (!results.Errors.HasErrors)
            {
                Assembly assembly =Assembly.LoadFrom("SfisWebService.dll");

                Type type = assembly.GetType("Jerry_Libr_Framework.WebServiceOperator.SFISTSPWebService");

                object o = Activator.CreateInstance(type);
                foreach (MethodInfo m in type.GetMethods())
                {
                    if (m.IsPublic)
                    {
                        Console.WriteLine(m.Name);
                    }
                }
                //Console.WriteLine(type.GetMethod("GetDatabaseInformation").Invoke(o, null));
            }
        }
    }
}
10-05 14:39