加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

动态调用WebService 的相关方法

发布时间:2020-12-17 00:27:11 所属栏目:安全 来源:网络整理
导读:来源:网络,不过修改了一个小地方,原来的 CSharpCodeProvider csc = new CSharpCodeProvider(); ICodeCompiler icc = csc.CreateCompiler(); 会提示已经过时, 现在修改为? CodeDomProvider csc= CodeDomProvider.CreateProvider("CSharp"); 调用: string

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

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];
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读