zoukankan      html  css  js  c++  java
  • .Net动态调用webservice

    1.CSharp实现类

    代码
    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 WindowsApplication1
    {
        
    /// <summary>
        
    ///动态调用WebService
        
    /// </summary>
        public class WsCaller
        {
            
    /// <summary>
            
    /// 获取WebService类型
            
    /// </summary>
            
    /// <param name="wsUrl">WebService地址</param>
            
    /// <returns></returns>
            private static string GetWsClassName(string wsUrl)
            {
                
    string[] parts = wsUrl.Split('/');
                
    string[] pps = parts[parts.Length - 1].Split('.');

                
    return pps[0];
            }

            
    /// <summary>
            
    /// 调用WebService
            
    /// </summary>
            
    /// <param name="wsUrl">WebService地址</param>
            
    /// <param name="methodName">方法名称</param>
            
    /// <param name="args">参数列表</param>
            
    /// <returns></returns>
            public static object InvokeWebService(string wsUrl, string methodName, object[] args)
            {
                
    return InvokeWebService(wsUrl, null, methodName, args);
            }

            
    /// <summary>
            
    /// 调用WebService
            
    /// </summary>
            
    /// <param name="wsUrl">WebService地址</param>
            
    /// <param name="className">类名</param>
            
    /// <param name="methodName">方法名称</param>
            
    /// <param name="args">参数列表</param>
            
    /// <returns></returns>
            public static object InvokeWebService(string wsUrl, string className, string methodName, object[] args)
            {
                
    string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
                
    if ((className == null|| (className == ""))
                {
                    className 
    = GetWsClassName(wsUrl);
                }

                
    try
                {
                    
    //获取WSDL
                    WebClient wc = new WebClient();
                    Stream stream 
    = wc.OpenRead(wsUrl + "?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 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 (Exception ex)
                {
                    
    throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
                }
            }
        }
    }

    2.调用测试

       A:建立Java编写的WebService,公布的一个方法为:HelloWorld,返回值为HelloWorld

          发布地址为:http://127.0.0.1:8090/HelloWorld/services/Service

       B:建立CSharp编写的WebService,公布的一个方法为:HelloWorld,返回值为HelloWorld

          发布地址为:http://127.0.0.1/WebService/Service.asmx

       调用方法代码如下:  

                try
                {
                    string url = "http://127.0.0.1:8090/HelloWorld/services/Service";
                    //string url = "http://localhost/WebService/Service.asmx";
                    //string[] args = new string[1];
                    //args[0] = "P000001";
                    object result = WsCaller.InvokeWebService(url, "HelloWorld", null);
                    this.textBox1.Text = result.ToString();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
             调用成功,返回值均可看到结果:HelloWorld!


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhoen/archive/2009/08/06/4419862.aspx

  • 相关阅读:
    UVA 408 (13.07.28)
    linux概念之用户,组及权限
    Java实现 蓝桥杯 历届试题 网络寻路
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 九宫重排
    Java实现 蓝桥杯 历届试题 九宫重排
  • 原文地址:https://www.cnblogs.com/Memory/p/1655811.html
Copyright © 2011-2022 走看看