微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

动态调用WebService 的相关方法

来源:网络,不过修改一个小地方,原来的

CSharpCodeProvider csc = new CSharpCodeProvider();
ICodeCompiler icc = csc.CreateCompiler();

提示已经过时,

现在修改为  CodeDomProvider csc= CodeDomProvider.CreateProvider("CSharp");


调用

string pcUrl = "http://localhost:8089/test.asmx";
            string pcclassName = "";
            string pcmethodName = "GetData";
            object[] objs =  new object[1];
            objs[0] = "2013";
            DataSet ds = DynamicWebServiceCall.InvokeWebService(pcUrl,pcclassName,pcmethodName,objs) as DataSet;

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

/// <summary>
/// 动态调用WebService 的相关方法
/// </summary>
public sealed class DynamicWebServiceCall
{
    /// <summary>
    /// 动态调用WebService 的方法
    /// </summary>
    /// <param name="pcUrl">WebService 的访问路径 http://localhost:8080/WebServiceTest.asmx </param>
    /// <param name="pcclassName">要调用的类名</param>
    /// <param name="pcmethodName">方法名</param>
    /// <param name="args">方法参数</param>
    /// <returns></returns>
    public static object InvokeWebService(string pcUrl,string pcmethodName,object[] args)
    {
        return InvokeWebService(pcUrl,"",args);
    }
    /// <summary>
    /// 动态调用WebService 的方法
    /// </summary>
    /// <param name="pcUrl">WebService 的访问路径 http://localhost:8080/  或 http://localhost:8080/WebServiceTest.asmx </param>
    /// <param name="pcclassName">要调用的类名,当Url里已经传动了类名的时候,这里设置为“”</param>
    /// <param name="pcmethodName">方法名</param>
    /// <param name="args">方法参数</param>
    /// <returns></returns>
    public static object InvokeWebService(string pcUrl,string pcclassName,object[] args)
    {
        object loRetVal = null;

        try
        {
            if (!string.IsNullOrEmpty(pcclassName))
            {
                pcUrl += pcclassName;
            }
            else
            {
                pcclassName = GetWsClassName(pcUrl);
            }

            Assembly loAssemble = CreateDynWebServiceAssemble(pcUrl);
            if (loAssemble != null)
            {
                string lcNameSpace = "Sonic.Web.WebService.DynamicWebService";
                Type t = loAssemble.GetType(lcNameSpace + "." + pcclassName,true,true);
                object obj = Activator.CreateInstance(t);
                MethodInfo loMethodInfo = t.getmethod(pcmethodName);
                if (loMethodInfo != null)
                    loRetVal = loMethodInfo.Invoke(obj,args);
            }
        }
        catch (Exception e)
        {
            loRetVal = null;
            throw e;
        }
        return loRetVal;
    }

    /// <summary>
    /// 动态创建WebService的Assembly
    /// </summary>
    /// <param name="pcUrl">WebService 的访问路径 入 http://localhost:8080/WebServiceTest.asmx</param>
    /// <returns></returns>
    private static Assembly CreateDynWebServiceAssemble(string pcUrl)
    {
        Assembly loRetVal = null;
        string lcNameSpace = "Sonic.Web.WebService.DynamicWebService";
        try
        {
            //获取WSDL
            WebClient loWC = new WebClient();
            Stream stream = loWC.OpenRead(pcUrl + "?WSDL");

            ServiceDescription sd = ServiceDescription.Read(stream);
            ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
            sdi.AddServiceDescription(sd,"");
            CodeNamespace cn = new CodeNamespace(lcNameSpace);

            //生成客户端代理类代码
            CodeCompileUnit ccu = new CodeCompileUnit();
            ccu.Namespaces.Add(cn);
            sdi.Import(cn,ccu);
            //CSharpCodeProvider csc = new CSharpCodeProvider();
            //ICodeCompiler icc = csc.CreateCompiler(); //已过时
            CodeDomProvider csc = CodeDomProvider.CreateProvider("CSharp");

            //设定编译参数
            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 = csc.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());
            }

            //生成代理实例,并调用方法
            loRetVal = cr.CompiledAssembly;
        }
        catch (Exception e)
        {
            loRetVal = null;
            throw e;
        }

        return loRetVal;
    }

    private static string GetWsClassName(string wsUrl)
    {
        string[] parts = wsUrl.Split('/');
        string[] pps = parts[parts.Length - 1].Split('.');

        return pps[0];
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐