动态调用WebService 类
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.Services.Description;
using System.Xml.Serialization;
using System.Net;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
using System.IO;
namespace XYH.Common
{
??? public class WebServiceClass
??? {
??????? private Log log = new Log(AppDomain.CurrentDomain.BaseDirectory + @"/up.txt");
???????
??????? public Object GetWebServiceObje(params string[] msgInfos)
??????? {
??????????? try
??????????? {
??????????????? WebClient client = new WebClient();
??????????????? //这个地址在Config文件里面,这里取出来就行了.在原地址后面加上: ?WSDL
??????????????? String url = ConfigManager.GetValue("WebServiceUrl");
??????????????? Stream stream = client.OpenRead(url);
??????????????? ServiceDescription description = ServiceDescription.Read(stream);
??????????????? //创建客户端代理代理类。
??????????????? ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
??????????????? //指定访问协议。
??????????????? importer.ProtocolName = "Soap";
??????????????? //生成客户端代理。
??????????????? importer.Style = ServiceDescriptionImportStyle.Client;
??????????????? importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
??????????????? //添加WSDL文档。
??????????????? importer.AddServiceDescription(description,null,null);
??????????????? //命名空间
??????????????? CodeNamespace nmspace = new CodeNamespace();
??????????????? // 写在配置文件里
??????????????? nmspace.Name = ConfigManager.GetValue("Namespace");
??????????????? CodeCompileUnit unit = new CodeCompileUnit();
??????????????? unit.Namespaces.Add(nmspace);
??????????????? ServiceDescriptionImportWarnings warning = importer.Import(nmspace,unit);
??????????????? CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
??????????????? CompilerParameters parameter = new CompilerParameters();
??????????????? parameter.GenerateExecutable = false;
??????????????? //输出程序集的名称,在配置文件中配置
??????????????? string outDllName = ConfigManager.GetValue("OutDllName");
??????????????? parameter.OutputAssembly = outDllName;
??????????????? parameter.ReferencedAssemblies.Add("System.dll");
??????????????? parameter.ReferencedAssemblies.Add("System.XML.dll");
??????????????? parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
??????????????? parameter.ReferencedAssemblies.Add("System.Data.dll");
??????????????? CompilerResults result = provider.CompileAssemblyFromDom(parameter,unit);
??????????????? if (result.Errors.HasErrors)
??????????????? {
??????????????????? // 显示编译错误信息
??????????????????? log.log("动态调用webService错误:" + result.Errors.ToString());
??????????????? }
??????????????? //加载前面生成的程序集
??????????????? Assembly asm = Assembly.LoadFrom(outDllName);
??????????????? string webServiceClassName = ConfigManager.GetValue("WebServiceClassName");
??????????????? Type typeObj = asm.GetType(webServiceClassName);
??????????????? object obj = Activator.CreateInstance(typeObj);
??????????????? int count = msgInfos.Length;
??????????????? object[] objParams = new object[count];
??????????????? int i = 0;
??????????????? foreach (string str in msgInfos)
??????????????? {
??????????????????? objParams[i] = (object)str;
??????????????????? i++;
??????????????????? log.log("参数"+i+": "+str);
??????????????? }
??????????????? /// 从配置文件获取方法名称
??????????????? string methodName = ConfigManager.GetValue("WebServiceMethodName");
??????????????? object objResult = typeObj.InvokeMember(methodName,BindingFlags.Default | BindingFlags.InvokeMethod,obj,objParams);
??????????????? if (objResult == null)
??????????????????? log.log("调用失败");
??????????????? log.log("调用成功" + objResult.ToString());
??????????????? return objResult;
??????????? }
??????????? catch (Exception ex)
??????????? {
??????????????? log.log("异常错误:" + ex.ToString());
??????????? }
??????????? return null;
??????? }
??? }
}
配置文件
? <appSettings>
?? <!-- webservice地址-->
?? <add key="WebServiceUrl" value ="http://localhost:1952/WebSite/Service.asmx?WSDL"/>?? <add key="Namespace" value ="DataReceptionDisposal.BLL.WebService"/>?? <add key="OutDllName" value ="Lib//DataReceptionDisposal.BLL.WebService.dll"/>?? <add key="WebServiceClassName" value ="DataReceptionDisposal.BLL.WebService.Service"/>?? <add key="WebServiceMethodName" value ="Show"/>? </appSettings>