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

动态调用WebService的工具类(做个记录,备忘)

发布时间:2020-12-17 02:03:05 所属栏目:安全 来源:网络整理
导读:代码 using ?System; using ?System.Collections.Generic; using ?System.Text; using ?System.Net; using ?System.Web.Services.Description; using ?System.CodeDom; using ?System.CodeDom.Compiler; using ?Microsoft.CSharp; namespace ?Gren.Framework

代码
using ?System;
using ?System.Collections.Generic;
using ?System.Text;

using ?System.Net;
using ?System.Web.Services.Description;
using ?System.CodeDom;
using ?System.CodeDom.Compiler;
using ?Microsoft.CSharp;

namespace ?Gren.Framework
{
????
/// ? <summary>
????
/// ?动态调用WebService的工具类
????
/// ? </summary>
???? public ? class ?WebServiceUtils
????{
????????
private ? string ?url;
????????
private ? string ?methodName;
????????
private ? object []?args;

????????
private ? string ?username;
????????
private ? string ?password;
????????
private ? string ?domain;
????????
private ? bool ?needCredential;

????????
/// ? <summary>
????????
/// ?web服务的地址
????????
/// ? </summary>
???????? public ? string ?Url
????????{
????????????
get ?{? return ?url;?}
????????????
set ?{?url? = ?value;?}
????????}

????????
/// ? <summary>
????????
/// ?web服务的方法名
????????
/// ? </summary>
???????? public ? string ?MethodName
????????{
????????????
get ?{? return ?methodName;?}
????????????
set ?{?methodName? = ?value;?}
????????}

????????
/// ? <summary>
????????
/// ?web服务的方法参数
????????
/// ? </summary>
???????? public ? object []?Args
????????{
????????????
get ?{? return ?args;?}
????????????
set ?{?args? = ?value;?}
????????}

????????
/// ? <summary>
????????
/// ?用户名
????????
/// ? </summary>
???????? public ? string ?Username
????????{
????????????
get ?{? return ?username;?}
????????????
set ?{?username? = ?value;?}
????????}

????????
/// ? <summary>
????????
/// ?密码
????????
/// ? </summary>
???????? public ? string ?Password
????????{
????????????
get ?{? return ?password;?}
????????????
set ?{?password? = ?value;?}
????????}

????????
/// ? <summary>
????????
/// ?域名
????????
/// ? </summary>
???????? public ? string ?Domain
????????{
????????????
get ?{? return ?domain;?}
????????????
set ?{?domain? = ?value;?}
????????}

????????
/// ? <summary>
????????
/// ?是否需要身份验证
????????
/// ? </summary>
???????? public ? bool ?NeedCredential
????????{
????????????
get ?{? return ?needCredential;?}
????????????
set ?{?needCredential? = ?value;?}
????????}

????????
public ?WebServiceUtils()
????????{?
????????????
this .url? = ? string .Empty;
????????????
this .methodName? = ? string .Empty;
????????????
this .args? = ? null ;
????????????
this .username? = ? string .Empty;
????????????
this .password? = ? string .Empty;
????????????
this .domain? = ? string .Empty;
????????????
this .needCredential? = ? false ;
????????}

????????
/// ? <summary>
????????
/// ?调用WebService
????????
/// ? </summary>
???????? public ? object ?Response()
????????{
????????????
object ?obj? = ? null ;

????????????Type?t?
= ? typeof (WebServiceProxy);
????????????
????????????AppDomain?otherDomain?
= ?AppDomain.CreateDomain( " WebServieDoamin " );

????????????
try
????????????{
????????????????WebServiceProxy?proxy?
= ?(WebServiceProxy)otherDomain.CreateInstanceAndUnwrap(t.Assembly.FullName,?t.FullName);
????????????????proxy.Url?
= ? this .url;
????????????????proxy.MethodName?
= ? this .methodName;
????????????????proxy.Args?
= ? this .args;
????????????????proxy.Username?
= ? this .username;
????????????????proxy.Password?
= ? this .password;
????????????????proxy.Domain?
= ? this .domain;
????????????????proxy.NeedCredential?
= ? this .needCredential;

????????????????obj?
= ?proxy.InvokeWebService();
????????????}
????????????
finally
????????????{
????????????????AppDomain.Unload(otherDomain);
????????????}

????????????
return ?obj;
????????}?
????}


????
/// ? <summary>
????
/// ?WebService代理类,不直接使用
????
/// ? </summary>
???? public ? class ?WebServiceProxy?:?MarshalByRefObject
????{
????????
private ? string ?url;
????????
private ? string ?methodName;
????????
private ? object []?args;

????????
private ? string ?username;
????????
private ? string ?password;
????????
private ? string ?domain;
????????
private ? bool ?needCredential;

????????
/// ? <summary>
????????
/// ?web服务的地址
????????
/// ? </summary>
???????? public ? string ?Url
????????{
????????????
get ?{? return ?url;?}
????????????
set ?{?url? = ?value;?}
????????}

????????
/// ? <summary>
????????
/// ?web服务的方法名
????????
/// ? </summary>
???????? public ? string ?MethodName
????????{
????????????
get ?{? return ?methodName;?}
????????????
set ?{?methodName? = ?value;?}
????????}

????????
/// ? <summary>
????????
/// ?web服务的方法参数
????????
/// ? </summary>
???????? public ? object []?Args
????????{
????????????
get ?{? return ?args;?}
????????????
set ?{?args? = ?value;?}
????????}

????????
/// ? <summary>
????????
/// ?用户名
????????
/// ? </summary>
???????? public ? string ?Username
????????{
????????????
get ?{? return ?username;?}
????????????
set ?{?username? = ?value;?}
????????}

????????
/// ? <summary>
????????
/// ?密码
????????
/// ? </summary>
???????? public ? string ?Password
????????{
????????????
get ?{? return ?password;?}
????????????
set ?{?password? = ?value;?}
????????}

????????
/// ? <summary>
????????
/// ?域名
????????
/// ? </summary>
???????? public ? string ?Domain
????????{
????????????
get ?{? return ?domain;?}
????????????
set ?{?domain? = ?value;?}
????????}

????????
/// ? <summary>
????????
/// ?是否需要身份验证
????????
/// ? </summary>
???????? public ? bool ?NeedCredential
????????{
????????????
get ?{? return ?needCredential;?}
????????????
set ?{?needCredential? = ?value;?}
????????}

????????
private ? string ?GetWsClassName( string ?wsUrl)
????????{
????????????
string []?parts? = ?wsUrl.Split( ' / ' );
????????????
string []?pps? = ?parts[parts.Length? - ? 1 ].Split( ' . ' );

????????????
return ?pps[ 0 ];
????????}

????????
public ? object ?InvokeWebService()
????????{
????????????
string ?@namespace? = ? " EnterpriseServerBase.WebService.DynamicWebCalling " ;
????????????
????????????
string ?classname? = ? this .GetWsClassName( this .url);

????????????
try
????????????{
????????????????NetworkCredential?myCredential?
= ? new ?NetworkCredential( this .username,? this .password,? this .domain);

????????????????
// 获取WSDL
????????????????WebClient?wc? = ? new ?WebClient();

????????????????
if ?( this .needCredential)
????????????????{
????????????????????wc.Credentials?
= ?myCredential;
????????????????}

????????????????System.IO.Stream?stream?
= ?wc.OpenRead( this .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);

????????????????CodeDomProvider?csc?
= ?CodeDomProvider.CreateProvider( " C# " );

????????????????
// 设定编译参数
????????????????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? = ?csc.CompileAssemblyFromDom(cplist,?ccu);
????????????????
if ?(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);

????????????????
if ?( this .needCredential)
????????????????{
????????????????????System.Reflection.PropertyInfo?pi?
= ?t.GetProperty( " Credentials " );
????????????????????pi.SetValue(obj,?myCredential,?
null );
????????????????}
????????????????
????????????????System.Reflection.MethodInfo?mi?
= ?t.GetMethod( this .methodName);

????????????????
return ?mi.Invoke(obj,?args);
????????????}
????????????
catch ?(Exception?ex)
????????????{
????????????????
throw ? new ?Exception(ex.InnerException.Message,? new ?Exception(ex.InnerException.StackTrace));????????????}????????}????????????}}

(编辑:李大同)

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

    推荐文章
      热点阅读