韩言福地

只有想不到的,没有办不到的。 - HY Auspicious Place

关键字:
首页 点击这里给我发消息

webservice的配置动态调用方法 [转]

浏览量:262 更新时间:2011-8-9 17:21:01

在C#程序设计中,经常碰到调用webservice问题,一般都是在程序中进行引用后调用,但是如果webservice地址发生变化,调用webservice的程序就会出现问题,我们可以在webconfig文件预先配置好webservice的引用地址,通过方法实现动态调用,实现方式如下:
 首选定义一个动态Web服务代理类:
  

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Xml;

using System.Web.Services.Description;

using System.CodeDom;

using System.CodeDom.Compiler;

using System.Reflection;

namespace PDBizTalkGetTargetAddress

{

    ///

    ///动态Web服务代理类

    ///

    ///

    /// Agent agent = new Agent("http://sample.com/services/SampleService.asmx");

    ///

    public class Agent

    {

        private object agent;

        private Type agentType;

        private const string CODE_NAMESPACE = "Beyondbit.WebServiceAgent.Dynamic";

        ///

        ///创建新的代理

        ///

        ///webserviced uri

        public Agent(string serviceUri)

        {

            XmlTextReader reader = new XmlTextReader(serviceUri + "?wsdl");

            ServiceDescription sd = ServiceDescription.Read(reader);

            ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();

            sdi.AddServiceDescription(sd, null, null);

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

        }

        ///

        ///调用指定的方法

        ///

        ///方法名,大小写敏感

        ///参数,按照参数顺序赋值

        ///Web服务的返回值

        public object Invoke(string methodName, params object[] args)

        {

            MethodInfo mi = agentType.GetMethod(methodName);

            return this.Invoke(mi, args);

        }

        ///

        ///调用指定方法

        ///

        ///方法信息

        ///参数,按照参数顺序赋值

        ///Web服务的返回值

        public object Invoke(MethodInfo method, params object[] args)

        {

            return method.Invoke(agent, args);

        }

        ///

        ///调用指定的方法

        ///

        ///方法名,大小写敏感

        ///参数

        ///Web服务的返回值

        public object Invoke(string methodName, object arg0)

        {

            MethodInfo mi = agentType.GetMethod(methodName);

            return this.Invoke(mi, new object[] { arg0 });

        }

        ///

        ///调用指定的方法

        ///

        ///方法名,大小写敏感

        ///参数

        ///参数

        ///Web服务的返回值

        public object Invoke(string methodName, object arg0, object arg1)

        {

            MethodInfo mi = agentType.GetMethod(methodName);

            return this.Invoke(mi, new object[] { arg0, arg1 });

        }

        ///

        ///调用指定的方法

        ///

        ///方法名,大小写敏感

        ///参数

        ///参数

        ///参数

        ///Web服务的返回值

        public object Invoke(string methodName, object arg0, object arg1, object arg2)

        {

            MethodInfo mi = agentType.GetMethod(methodName);

            return this.Invoke(mi, new object[] { arg0, arg1, arg2 });

        }

        ///

        ///调用指定的方法

        ///

        ///方法信息

        ///参数

        ///Web服务的返回值

        public object Invoke(MethodInfo method, object arg0)

        {

            return this.Invoke(method, new object[] { arg0 });

        }

        ///

        ///调用指定的方法

        ///

        ///方法信息

        ///参数

        ///参数

        ///Web服务的返回值

        public object Invoke(MethodInfo method, object arg0, object arg1)

        {

            return this.Invoke(method, new object[] { arg0, arg1 });

        }

        ///

        ///调用指定的方法

        ///

        ///方法信息

        ///参数

        ///参数

        ///参数

        ///Web服务的返回值

        public object Invoke(MethodInfo method, object arg0, object arg1, object arg2)

        {

            return this.Invoke(method, new object[] { arg0, arg1, arg2 });

        }

        ///

        ///获取所有公共方法

        ///

        public MethodInfo[] Methods

        {

            get

            {

                return agentType.GetMethods();

            }

        }

    }

}
 

调用方法:
  public void sendStr(string message,string messs)
     {
             string SMWebserviceURL = System.Configuration.ConfigurationManager.AppSettings["URL"].ToString();
             Agent agent = new Agent(SMWebserviceURL);
             object[] Par = new object[8];
             Par[0] = message;
             Par[1] = messs;
             agent.Invoke("SendMessage", Par);
         }
     }