C# .Net动态调用webService

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Net;

using System.IO;

using System.Web.Services.Description;

using System.CodeDom;

using Microsoft.CSharp;

using System.CodeDom.Compiler;

using System.Reflection;

 

 

namespace CraftWebService.todo

{

    public class WSHelper

    {

        ///<summary>          

        ///动态调用web服务        

        ///</summary>         

        ///<param name="url">WSDL服务地址</param>

        ///<param name="methodname">方法名</param>          

        ///<param name="args">参数< /param>          

        ///<returns>< /returns>         

        public static objectInvokeWebService(string url,stringmethodname, object[] args)

        {

            return WSHelper.InvokeWebService(url,null,methodname, args);

        }

        ///<summary>         

        ///动态调用web服务

        ///</summary>         

        ///<param name="url">WSDL服务地址</param>

        ///<param name="classname">类名</param> 

        ///<param name="methodname">方法名</param> 

        ///<param name="args">参数< /param>

        ///<returns>< /returns>

        public static objectInvokeWebService(string url,stringclassname, string methodname,object[]args)

        {

            //string@namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";

            string@namespace = "org";

            if((classname == null) || (classname == ""))

            {

               classname = WSHelper.GetWsClassName(url);

            }

            try

            {                   //获取WSDL  

                WebClient wc=new WebClient();

                Streamstream = wc.OpenRead(url +"?WSDL");

                ServiceDescription sd=ServiceDescription.Read(stream);

                ServiceDescriptionImporter sdi=new ServiceDescriptionImporter();

               sdi.AddServiceDescription(sd, "", "");

                CodeNamespace cn=new CodeNamespace(@namespace);

                //生成客户端代理类代码         

                CodeCompileUnit ccu=new CodeCompileUnit();

               ccu.Namespaces.Add(cn);

               sdi.Import(cn, ccu);

                CSharpCodeProvider icc=new CSharpCodeProvider();

                //设定编译参数                

                CompilerParameterscplist =new CompilerParameters();

               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);

                if (true ==cr.Errors.HasErrors)

                {

                   System.Text.StringBuilder sb =newSystem.Text.StringBuilder();

                    foreach(System.CodeDom.Compiler.CompilerError ceincr.Errors)

                    {

                       sb.Append(ce.ToString());

                       sb.Append(System.Environment.NewLine);

                    }

                    throw new Exception(sb.ToString());

                }

                //生成代理实例,并调用方法  

               System.Reflection.Assemblyassembly = cr.CompiledAssembly;

                Type t =assembly.GetType(@namespace +"." +classname, true, true);

                object obj= Activator.CreateInstance(t);

               System.Reflection.MethodInfo mi= t.GetMethod(methodname);

                returnmi.Invoke(obj, args);

                //PropertyInfo propertyInfo = type.GetProperty(propertyname);    

                //returnpropertyInfo.GetValue(obj, null);

            }

            catch (Exception ex)

            {

                throw new Exception(ex.InnerException.Message,newException(ex.InnerException.StackTrace));

            }

        }

        private static stringGetWsClassName(string wsUrl)

        {

            string[]parts = wsUrl.Split('/');

            string[]pps = parts[parts.Length - 1].Split('.');

            returnpps[0];

        }

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值