动态调用webservice
发布时间:2020-12-16 23:35:09 所属栏目:安全 来源:网络整理
导读:该方法可以使程序不通过web引用的方式去调用webservices方法,直接在代码里调用该方法就能达到动态调用webservices的目的。使用前先引用System.Web.Services动态链接库,是.net自带的dll。 方法如下: using ?System; using ?System.Collections.Generic; us
该方法可以使程序不通过web引用的方式去调用webservices方法,直接在代码里调用该方法就能达到动态调用webservices的目的。使用前先引用System.Web.Services动态链接库,是.net自带的dll。 方法如下:
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 ?TestSkin { ???? class ?Webservices ????{ ???????? /// ? <summary> ???????? /// ?实例化WebServices ???????? /// ? </summary> ???????? /// ? <param?name="url"> WebServices地址 </param> ???????? /// ? <param?name="methodname"> 调用的方法 </param> ???????? /// ? <param?name="args"> 把webservices里需要的参数按顺序放到这个object[]里 </param> ???????? public ? static ? object ?InvokeWebService( string ?url,? string ?methodname,? object []?args) ????????{ ???????????? // 这里的namespace是需引用的webservices的命名空间,在这里是写死的,大家可以加一个参数从外面传进来。 ???????????? string ?@namespace? = ? " client " ; ???????????? try ????????????{ ???????????????? // 获取WSDL ????????????????WebClient?wc? = ? new ?WebClient(); ????????????????Stream?stream? = ?wc.OpenRead(url? + ? " ?WSDL " ); ????????????????ServiceDescription?sd? = ?ServiceDescription.Read(stream); ???????????????? string ?classname? = ?sd.Services[ 0 ].Name; ????????????????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 ????????????{ ???????????????? return ? null ; ????????????} ????????} ????} } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |