现在的位置: 首页 > 综合 > 正文

通过反射动态调用webservices

2012年01月16日 ⁄ 综合 ⁄ 共 3078字 ⁄ 字号 评论关闭

该方法可以使程序不通过web引用的方式去调用webservices方法,直接在代码里调用该方法就能达到动态调用webservices的目的。使用前先引用System.Web.Services动态链接库,是.net自带的dll。

方法如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Web.Services.Description;
using System.CodeDom;
using Microsoft.CSharp;
using System.CodeDom.Compiler;

namespace TestSkin
{
    
class Webservices
    {
        
/// <summary>
        
/// 实例化WebServices
        
/// </summary>
        
/// <param name="url">WebServices地址</param>
        
/// <param name="methodname">调用的方法</param>
        
/// <param name="args">把webservices里需要的参数按顺序放到这个object[]里</param>
        public static object InvokeWebService(string url, string methodname, object[] args)
        {

            //这里的namespace是需引用的webservices的命名空间,在这里是写死的,大家可以加一个参数从外面传进来。
            string @namespace = "client";
            
try
            {
                
//获取WSDL
                WebClient wc = new WebClient();
                Stream stream 
= wc.OpenRead(url + "?WSDL");
                ServiceDescription sd 
= ServiceDescription.Read(stream);
                
string classname = sd.Services[0].Name;
                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 csc 
= new CSharpCodeProvider();
                ICodeCompiler icc 
= csc.CreateCompiler();

                //设定编译参数
                CompilerParameters cplist = 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 
= new System.Text.StringBuilder();
                    
foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                    {
                        sb.Append(ce.ToString());
                        sb.Append(System.Environment.NewLine);
                    }
                    
throw new Exception(sb.ToString());
                }

                //生成代理实例,并调用方法
                System.Reflection.Assembly assembly = cr.CompiledAssembly;
                Type t 
= assembly.GetType(@namespace + "." + classname, truetrue);
                
object obj = Activator.CreateInstance(t);
                System.Reflection.MethodInfo mi 
= t.GetMethod(methodname);

                return mi.Invoke(obj, args);
            }
            
catch
            {
                
return null;
            }
        }
    }
}

抱歉!评论已关闭.