封装的WebserviceHelp类:

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Reflection;
using System.Web.Services.Description;
using Microsoft.CSharp;
using System.Xml.Serialization;namespace MyServiceLibrary
{/// <summary>/// 动态调用WebService(支持SaopHeader)/// </summary>public class WebServiceHelper{/// <summary>   /// 获取WebService的类名   /// </summary>   /// <param name="wsUrl">WebService地址</param>   /// <returns>返回WebService的类名</returns>   private static string GetWsClassName(string wsUrl){string[] parts = wsUrl.Split('/');string[] pps = parts[parts.Length - 1].Split('.');return pps[0];}/// <summary>   /// 调用WebService(不带SoapHeader)/// </summary>   /// <param name="wsUrl">WebService地址</param>   /// <param name="methodName">方法名称</param>   /// <param name="args">参数列表</param>   /// <returns>返回调用结果</returns>   public static object InvokeWebService(string wsUrl, string methodName, object[] args){return InvokeWebService(wsUrl, null, methodName, null, args);}/// <summary>   /// 调用WebService(带SoapHeader)/// </summary>   /// <param name="wsUrl">WebService地址</param>   /// <param name="methodName">方法名称</param>   /// <param name="soapHeader">SOAP头</param>   /// <param name="args">参数列表</param>   /// <returns>返回调用结果</returns>public static object InvokeWebService(string wsUrl, string methodName, SoapHeader soapHeader, object[] args){return InvokeWebService(wsUrl, null, methodName, soapHeader, args);}/// <summary>   /// 调用WebService/// </summary>   /// <param name="wsUrl">WebService地址</param>   /// <param name="className">类名</param>   /// <param name="methodName">方法名称</param>   /// <param name="soapHeader">SOAP头</param>/// <param name="args">参数列表</param>   /// <returns>返回调用结果</returns>   public static object InvokeWebService(string wsUrl, string className, string methodName, SoapHeader soapHeader, object[] args){string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";if ((className == null) || (className == "")){className = GetWsClassName(wsUrl);}try{//获取WSDL   WebClient wc = new WebClient();Stream stream = wc.OpenRead(wsUrl + "?wsdl");ServiceDescription sd = ServiceDescription.Read(stream);//配置代理ServiceDescriptionImporter数据ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();//sdi.ProtocolName = "Soap";//sdi.Style = ServiceDescriptionImportStyle.Server;//sdi.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;sdi.AddServiceDescription(sd, null, null);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();CodeDomProvider icc = CodeDomProvider.CreateProvider("CSharp");//设定编译参数   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);FieldInfo[] arry = t.GetFields();FieldInfo client = null;object clientkey = null;if (soapHeader != null){//Soap头开始   client = t.GetField(soapHeader.ClassName + "Value");//获取客户端验证对象   Type typeClient = assembly.GetType(@namespace + "." + soapHeader.ClassName);//为验证对象赋值   clientkey = Activator.CreateInstance(typeClient);foreach (KeyValuePair<string, object> property in soapHeader.Properties){typeClient.GetField(property.Key).SetValue(clientkey, property.Value);}//Soap头结束
                }//实例类型对象   object obj = Activator.CreateInstance(t);if (soapHeader != null){//设置Soap头
                    client.SetValue(obj, clientkey);}System.Reflection.MethodInfo mi = t.GetMethod(methodName);return mi.Invoke(obj, args);}catch (Exception ex){throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));}}/// <summary>/// SOAP头/// </summary>public class SoapHeader{/// <summary>/// 构造一个SOAP头/// </summary>public SoapHeader(){this.Properties = new Dictionary<string, object>();}/// <summary>/// 构造一个SOAP头/// </summary>/// <param name="className">SOAP头的类名</param>public SoapHeader(string className){this.ClassName = className;this.Properties = new Dictionary<string, object>();}/// <summary>/// 构造一个SOAP头/// </summary>/// <param name="className">SOAP头的类名</param>/// <param name="properties">SOAP头的类属性名及属性值</param>public SoapHeader(string className, Dictionary<string, object> properties){this.ClassName = className;this.Properties = properties;}/// <summary>/// SOAP头的类名/// </summary>public string ClassName { get; set; }/// <summary>/// SOAP头的类属性名及属性值/// </summary>public Dictionary<string, object> Properties { get; set; }/// <summary>/// 为SOAP头增加一个属性及值/// </summary>/// <param name="name">SOAP头的类属性名</param>/// <param name="value">SOAP头的类属性值</param>public void AddProperty(string name, object value){if (this.Properties == null){this.Properties = new Dictionary<string, object>();}Properties.Add(name, value);}}}}

使用方法介绍:
如果soapheader是这种方式:

public class MySoapHeader : System.Web.Services.Protocols.SoapHeader{private string userID = string.Empty;private string userPW = string.Empty;public string UserId{get { return userID; }set { userID = value; }}public string UserPW{get { return userPW; }set { userPW = value; }}
}

调用上面ServiceHelper方式如下:

WebServiceHelper.SoapHeader header = new WebServiceHelper.SoapHeader("MySoapHeader");header.AddProperty("UserId", "admin");header.AddProperty("UserPW", "admin");object r = WebServiceHelper.InvokeWebService("http://localhost:9015/WebService1.asmx","HelloWorld2",header,null);Console.WriteLine(r.ToString());Console.ReadKey();

转载于:https://www.cnblogs.com/xibei666/p/4635859.html

动态调用Webservice 支持Soapheader身份验证(转)相关推荐

  1. 调用WebService时加入身份验证,以拒绝未授权的访问

    调用WebService时加入身份验证,以拒绝未授权的访问 分类: WebService 2010-08-19 16:22 548人阅读 评论(4) 收藏 举报 众所周知,WebService是为企业 ...

  2. android调用webservice发送header身份验证不成功

    ============问题描述============ 我的代码 SoapObject request = new SoapObject( "http://webservices.home ...

  3. ANDROID调用webservice带soapheader验证

    最近的一个项目中调用webservice接口,需要验证soapheader,现将解决方法记录如下:(网上资料出处太多,就不做引用,原作者如看到,如有必要添加请通知) 1.先看接口 POST /webs ...

  4. C# 动态调用WebService

    Reference from : http://blog.csdn.net/chuxiamuxiang/article/details/5731988 在C#程序中,若要调用WebService,一般 ...

  5. C# 动态调用webservice代码

    /// <summary> /// 动态调用WebService /// </summary> /// <param name="url">UR ...

  6. 动态调用WebService方法

    C#动态调用WebService object item = InvokeWebService(this._webServicesUrl, "HelloWorld", new ob ...

  7. 使用AOP动态调用WebService

    在网上搜了一下"动态调用WebService"相信都能搜出上千篇文章,但是都出自同一个版本:使用ServiceDescriptionImporter导入wsdl然后进行动态编译,再 ...

  8. vue 调用webservice_用C#通过反射实现动态调用WebService 告别Web引用(转载)

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  9. vue 调用webservice_动态调用WebService接口的几种方式

    一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...

最新文章

  1. 博客园添加访问人数统计超详细教程
  2. Firefox OS, 向jQuery中XMLHttpRequest构造函数中传参,实现跨域请求数据
  3. USACO 3.2 Stringsobits
  4. 最近开始接触网络电话
  5. Netty-案例 WebSocket与netty实现长连接案例(代码注释详解)
  6. 洛谷P1246C语言,codevs1246 丑数
  7. cassandra数据备份_Cassandra中的数据建模
  8. Ibatis 动态查询
  9. 用计算机用两个珠子能拨出那些数字,人教版一年级数学上册第三单元教案
  10. 微信/支付宝扫码支付流程
  11. Child returned status 1问题解决
  12. Spring核心接口ObjectProvider
  13. 传说中最贵的跑车: 布加迪威龙
  14. 南方cass字体样式设置_统一设置导航条风格和修改字体
  15. 毛永胜计算机教师,中等职业学校网络计算机技术与应用
  16. 简单的SWF视频播放器代码
  17. 探索鼎龙湾德萨斯牛仔小镇,欣赏粤西非遗文化的魅力
  18. Statement接口的基本介绍和使用
  19. Excel 使用vba脚本按条件清除行数据
  20. echarts基本图例

热门文章

  1. php5.3 本地调试,WIN7下PHP 5.3.27和PHPStorm6调试
  2. git 安装_Windows系统Git安装教程(详解Git安装过程)
  3. java shell_jshell – Java Shell
  4. jquery 后代元素_在jQuery中查找元素的所有后代
  5. selenium火狐驱动_在Selenium Firefox驱动程序上运行测试
  6. Python字符串isprintable()
  7. elasticsearch的javaAPI之query
  8. C++ 编写WebService服务
  9. 开课吧Java课堂:如何创建多线程
  10. Java基础篇:类的通用格式