不添加引用,动态调用WebService

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不添加引用,动态调用WebService相关的知识,希望对你有一定的参考价值。

 这两天给公司写一个调用接口的程序,接口采用WebService!
 本打算将这个工具写成通用的,但是微软给出的调用WebService的方法必须添加该WebService引用,
这样的方式不免太过于死板,无法动态调用,于是在网上查了很多相关解决办法!自己封装成了一个函数,发布出来,做个纪念!

using System.Net;
using System.IO;
using System.Web.Services.Description;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
using System;
using System.Xml.Serialization;
namespace WebServiceToOracle.Common
{
    /// <summary>
    /// Web服务操作类
    /// Author:梁
    /// Time:2014-4-17
    /// </summary>
    public class WebServiceHelper
    {
        /// <summary>
        /// 动态调用WebService
        /// </summary>
        /// <param name="url">WebService地址</param>
        /// <param name="function">欲调用的WebService接口函数</param>
        /// <param name="parameters">接口参数</param>
        /// <returns>接口数据</returns>
        public static string DynamicInvocationWebService(string url,string function,string[] parameters) 
        {
            WebClient client = new WebClient();
            if (url.IndexOf("?WSDL") == -1) 
            {
                url = url + "?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;
            //添加WSDL文档。
            importer.AddServiceDescription(description, null, null);
            //命名空间
            CodeNamespace nmspace = new CodeNamespace();
            nmspace.Name = "SearchAmountOfProduct";
            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 = "DynamicInvocationWebService.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("DynamicInvocationWebService.dll");
            Type t = asm.GetType("SearchAmountOfProduct.SearchAmountOfProduct");
            object o = Activator.CreateInstance(t);
            MethodInfo method = t.GetMethod(function);
            String item = (String)method.Invoke(o, parameters);
            return item;
        }
    }
}
 

  

以上是关于不添加引用,动态调用WebService的主要内容,如果未能解决你的问题,请参考以下文章

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

动态调用WebService接口的几种方式

vb.net如何动态调用WebService接口啊

C# 动态加载WebService

winform调用webservice假死怎么解决

动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法 (转)