不添加引用,动态调用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;
        }
    }
}
 

  

转载于:https://www.cnblogs.com/fuhua/p/5877807.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值