加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

动态调用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 ; ????????????} ????????} ????} }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读