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,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,true,true);
??????????????? 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
????? 发布地址为: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!