Winform 动态调用WebService
发布时间:2020-12-17 00:17:31 所属栏目:安全 来源:网络整理
导读:一般情况下winform调用webservice时步骤 1添加服务引用---高级----添加web引用------填写url--添加web引用即可完成对webservice的引用 让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务。 如果需要动态调用WebService,要实现这样的功能: public st
一般情况下winform调用webservice时步骤
1添加服务引用---高级----添加web引用------填写url--添加web引用即可完成对webservice的引用
让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务。
如果需要动态调用WebService,要实现这样的功能:
public static object Invoke
其中,url是Web服务的地址,methodname是要调用服务方法名,args是要调用Web服务所需的参数,返回值就是web服务返回的结果了。
?
using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; using System.CodeDom; using System.CodeDom.Compiler; using System.Web.Services.Description; using Microsoft.CSharp; using System.Reflection; namespace VionDataHandler { ? ? public static class WebServiceHelper ? ? { ? ? ? ? /// <summary> ? ? ? ? /// 动态调用WebService ? ? ? ? /// </summary> ? ? ? ? /// <param name="url">WebService地址</param> ? ? ? ? /// <param name="methodname">方法名(模块名)</param> ? ? ? ? /// <param name="args">参数列表,无参数为null</param> ? ? ? ? /// <returns>object</returns> ? ? ? ? public static object InvokeWebService(string url,string methodname,object[] args) ? ? ? ? { ? ? ? ? ? ? return InvokeWebService(url,null,methodname,args); ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 动态调用WebService ? ? ? ? /// </summary> ? ? ? ? /// <param name="url">WebService地址</param> ? ? ? ? /// <param name="classname">类名</param> ? ? ? ? /// <param name="methodname">方法名(模块名)</param> ? ? ? ? /// <param name="args">参数列表</param> ? ? ? ? /// <returns>object</returns> ? ? ? ? public static object InvokeWebService(string url,string classname,object[] args) ? ? ? ? { ? ? ? ? ? ? string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling"; ? ? ? ? ? ? if (classname == null || classname == "") ? ? ? ? ? ? { ? ? ? ? ? ? ? ? classname = WebServiceHelper.GetClassName(url); ? ? ? ? ? ? } ? ? ? ? ? ? //获取服务描述语言(WSDL) ? ? ? ? ? ? WebClient wc = new WebClient(); ? ? ? ? ? ? Stream stream = wc.OpenRead(url + "?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();//【6】 ? ? ? ? ? ? ICodeCompiler icc = csc.CreateCompiler();//【7】 ? ? ? ? ? ? //设定编译器的参数 ? ? ? ? ? ? CompilerParameters cplist = new CompilerParameters();//【8】 ? ? ? ? ? ? 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);//【9】 ? ? ? ? ? ? ////生成代理实例,并调用方法 ?? ? ? ? ? ? ? //System.Reflection.Assembly assembly1 = cr.CompiledAssembly; ? ? ? ? ? ? ////ExcMsg.WriteLog("----------获取所有的类与方法信息--------" + "。" + "(正常执行!)"); ? ? ? ? ? ? //Type[] allTypes = assembly.GetTypes(); ? ? ? ? ? ? //foreach (Type type in allTypes) ? ? ? ? ? ? //{ ? ? ? ? ? ? // ? ?//ExcMsg.WriteLog("--类:" + type.FullName); ? ? ? ? ? ? // ? ?MethodInfo[] methods = type.GetMethods(); ? ? ? ? ? ? // ? ?foreach (MethodInfo info in methods) ? ? ? ? ? ? // ? ?{ ? ? ? ? ? ? // ? ? ? ?//ExcMsg.WriteLog(string.Format("----方法:{0}",info.Name)); ? ? ? ? ? ? // ? ?} ? ? ? ? ? ? //} ? ? ? ? ? ? if (true == cr.Errors.HasErrors) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? System.Text.StringBuilder sb = new StringBuilder(); ? ? ? ? ? ? ? ? foreach (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[] allTypes = assembly.GetTypes(); ? ? ? ? ? ? //foreach (Type type in allTypes) ? ? ? ? ? ? //{ ? ? ? ? ? ? // ? ?//ExcMsg.WriteLog("--类:" + type.FullName); ? ? ? ? ? ? // ? ?MethodInfo[] methods = type.GetMethods(); ? ? ? ? ? ? // ? ?foreach (MethodInfo info in methods) ? ? ? ? ? ? // ? ?{ ? ? ? ? ? ? // ? ? ? ?//ExcMsg.WriteLog(string.Format("----方法:{0}",info.Name)); ? ? ? ? ? ? // ? ?} ? ? ? ? ? ? //} ? ? ? ? ? ? Type t = assembly.GetType(@namespace + "." + classname,true,true); ? ? ? ? ? ? object obj = Activator.CreateInstance(t);//【10】 ? ? ? ? ? ? MethodInfo mi = t.GetMethod(methodname);//【11】 ? ? ? ? ? ? //getRegionCountry ? ? ? ? ? ? return mi.Invoke(obj,args); ? ? ? ? } ? ? ? ? private static string GetClassName(string url) ? ? ? ? { ? ? ? ? ? ? string[] parts = url.Split('/'); ? ? ? ? ? ? string[] pps = parts[parts.Length - 1].Split('.'); ? ? ? ? ? ? return pps[0]; ? ? ? ? } ? ? } }
?
?
?
【2】 ?
ServiceDescription.Read 方法 (Stream) 通过直接从 Stream实例加载 XML 来初始化ServiceDescription类的实例。
?
ServiceDescriptionImport
?
?
?
?
?
?
?
? 【11】 MethodInfo 的实例可以通过调用GetMethods或者Type对象或派生自Type的对象的GetMethod方法来获取,还可以通过调用表示泛型方法定义的 MethodInfo 的MakeGenericMethod方法来获取。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |