动态调用Webservice 支持Soapheader身份验证(转)
封装的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身份验证(转)相关推荐
- 调用WebService时加入身份验证,以拒绝未授权的访问
调用WebService时加入身份验证,以拒绝未授权的访问 分类: WebService 2010-08-19 16:22 548人阅读 评论(4) 收藏 举报 众所周知,WebService是为企业 ...
- android调用webservice发送header身份验证不成功
============问题描述============ 我的代码 SoapObject request = new SoapObject( "http://webservices.home ...
- ANDROID调用webservice带soapheader验证
最近的一个项目中调用webservice接口,需要验证soapheader,现将解决方法记录如下:(网上资料出处太多,就不做引用,原作者如看到,如有必要添加请通知) 1.先看接口 POST /webs ...
- C# 动态调用WebService
Reference from : http://blog.csdn.net/chuxiamuxiang/article/details/5731988 在C#程序中,若要调用WebService,一般 ...
- C# 动态调用webservice代码
/// <summary> /// 动态调用WebService /// </summary> /// <param name="url">UR ...
- 动态调用WebService方法
C#动态调用WebService object item = InvokeWebService(this._webServicesUrl, "HelloWorld", new ob ...
- 使用AOP动态调用WebService
在网上搜了一下"动态调用WebService"相信都能搜出上千篇文章,但是都出自同一个版本:使用ServiceDescriptionImporter导入wsdl然后进行动态编译,再 ...
- vue 调用webservice_用C#通过反射实现动态调用WebService 告别Web引用(转载)
我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...
- vue 调用webservice_动态调用WebService接口的几种方式
一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...
最新文章
- 博客园添加访问人数统计超详细教程
- Firefox OS, 向jQuery中XMLHttpRequest构造函数中传参,实现跨域请求数据
- USACO 3.2 Stringsobits
- 最近开始接触网络电话
- Netty-案例 WebSocket与netty实现长连接案例(代码注释详解)
- 洛谷P1246C语言,codevs1246 丑数
- cassandra数据备份_Cassandra中的数据建模
- Ibatis 动态查询
- 用计算机用两个珠子能拨出那些数字,人教版一年级数学上册第三单元教案
- 微信/支付宝扫码支付流程
- Child returned status 1问题解决
- Spring核心接口ObjectProvider
- 传说中最贵的跑车: 布加迪威龙
- 南方cass字体样式设置_统一设置导航条风格和修改字体
- 毛永胜计算机教师,中等职业学校网络计算机技术与应用
- 简单的SWF视频播放器代码
- 探索鼎龙湾德萨斯牛仔小镇,欣赏粤西非遗文化的魅力
- Statement接口的基本介绍和使用
- Excel 使用vba脚本按条件清除行数据
- echarts基本图例
热门文章
- php5.3 本地调试,WIN7下PHP 5.3.27和PHPStorm6调试
- git 安装_Windows系统Git安装教程(详解Git安装过程)
- java shell_jshell – Java Shell
- jquery 后代元素_在jQuery中查找元素的所有后代
- selenium火狐驱动_在Selenium Firefox驱动程序上运行测试
- Python字符串isprintable()
- elasticsearch的javaAPI之query
- C++ 编写WebService服务
- 开课吧Java课堂:如何创建多线程
- Java基础篇:类的通用格式