http://blog.csdn.net/u012995964/article/details/54573143

本文记录C#中通过反射动态的调用带有SoapHeader验证的WebServices服务,基于 Windows8.1、Visual Studio 2013、IIS8 环境实现。 
关于WebService创建、部署及静态调用等内容,可以见:C#静态调用带有SoapHeader验证的WebServices

创建动态调用类

创建一个客户端控制台程序,并新建类DynamicInvokeService.cs , 文件内容如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.IO;
using System.Web.Services.Description;
using System.CodeDom;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection; namespace DynamicInvoke
{
/// <summary>
/// Web Service服务类
/// </summary>
public class WSHelper
{
/// < summary>
/// 动态调用web服务 (不含有SoapHeader)
/// < /summary>
/// < param name="url">WSDL服务地址< /param>
/// < param name="methodname">方法名< /param>
/// < param name="args">参数< /param>
/// < returns>< /returns>
public static object InvokeWebService(string url, string methodname, object[] args)
{
return WSHelper.InvokeWebService(url, null, methodname, null, args);
}
/// <summary>
/// 动态调用web服务(含有SoapHeader)
/// </summary>
/// <param name="url"></param>
/// <param name="methodname"></param>
/// <param name="soapHeader"></param>
/// <param name="args"></param>
/// <returns></returns>
public static object InvokeWebService(string url, string methodname, SoapHeader soapHeader, object[] args)
{
return WSHelper.InvokeWebService(url, null, methodname, soapHeader, args);
}
/// < summary>
/// 动态调用web服务
/// < /summary>
/// < param name="url">WSDL服务地址< /param>
/// < param name="classname">类名< /param>
/// < param name="methodname">方法名< /param>
/// < param name="args">参数< /param>
/// < returns>< /returns>
public static object InvokeWebService(string url, string classname, string methodname, SoapHeader soapHeader, object[] args)
{
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
if ((classname == null) || (classname == ""))
{
classname = WSHelper.GetWsClassName(url);
}
try
{
//获取WSDL
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(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);
CSharpCodeProvider icc = new CSharpCodeProvider(); //设定编译参数
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 (cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
{http://localhost:38076/Properties/
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
} //保存生产的代理类,默认是保存在bin目录下面
TextWriter writer = File.CreateText("MyWebServices.cs");
icc.GenerateCodeFromCompileUnit(ccu, writer, null);
writer.Flush();
writer.Close(); //生成代理实例
System.Reflection.Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(@namespace + "." + classname, true, true);
object obj = Activator.CreateInstance(t); #region 设置SoapHeader
FieldInfo client = null;
object clientkey = null;
if (soapHeader != null)
{
client = t.GetField(soapHeader.ClassName + "Value");
//获取客户端验证对象 soap类
Type typeClient = assembly.GetType(@namespace + "." + soapHeader.ClassName);
//为验证对象赋值 soap实例
clientkey = Activator.CreateInstance(typeClient);
//遍历属性
foreach (KeyValuePair<string, object> property in soapHeader.Properties)
{
typeClient.GetField(property.Key).SetValue(clientkey, property.Value);
// typeClient.GetProperty(property.Key).SetValue(clientkey, property.Value, null);
}
}
#endregion if (soapHeader != null)
{
//设置Soap头
client.SetValue(obj, clientkey);
//pro.SetValue(obj, soapHeader, null);
} //调用指定的方法
System.Reflection.MethodInfo mi = t.GetMethod(methodname);
//方法名错误(找不到方法),给出提示
if (null == mi)
{
return "方法名不存在,请检查方法名是否正确!";
}
return mi.Invoke(obj, args);
// PropertyInfo propertyInfo = type.GetProperty(propertyname);
//return propertyInfo.GetValue(obj, null);
}
catch (Exception ex)
{
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
}
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - ].Split('.');
return pps[];
} /// <summary>
/// 构建SOAP头,用于SoapHeader验证
/// </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);
}
}
}
}

注意代码中有如下代码:

    //保存生产的代理类,默认是保存在bin目录下面
TextWriter writer = File.CreateText("MyWebServices.cs");
icc.GenerateCodeFromCompileUnit(ccu, writer, null);
writer.Flush();
writer.Close();

此代码可以保存生成的代理类,可以在工程目录下的bin目录下查看文件。


测试端代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DynamicInvokeService
{
class Program
{
static void Main(string[] args)
{
string url = "http://192.168.1.109:81/WebService1.asmx";
//string url = "http://192.168.1.109:82/WebService2.asmx"; Dictionary<string, object> properties = new Dictionary<string, object>();
properties.Add("UserName", "admin");
properties.Add("PassWord", "admin123"); DynamicInvoke.WSHelper.SoapHeader soapHeader = new DynamicInvoke.WSHelper.SoapHeader("MySoapHeader", properties); Object obj1 = DynamicInvoke.WSHelper.InvokeWebService(url, "HelloWorld", null);
Object obj2 = DynamicInvoke.WSHelper.InvokeWebService(url, "HelloWorld", soapHeader, null);
Object obj3 = DynamicInvoke.WSHelper.InvokeWebService(url, "getNum", new Object[] { , });
Object obj4 = DynamicInvoke.WSHelper.InvokeWebService(url, "getNum", soapHeader, new Object[] { , });
Object obj5 = DynamicInvoke.WSHelper.InvokeWebService(url, "getList", null);
Object obj6 = DynamicInvoke.WSHelper.InvokeWebService(url, "getList", soapHeader, null); Console.WriteLine("无SoapHeader调用HelloWorld:" + obj1);
Console.WriteLine("有SoapHeader调用HelloWorld:" + obj2);
Console.WriteLine("无SoapHeader调用getNum:" + obj3);
Console.WriteLine("有SoapHeader调用getNum:" + obj4);
Console.WriteLine("无SoapHeader调用无验证方法getList:" + obj5.GetType().IsArray);
Console.WriteLine("有SoapHeader调用无验证方法getList:" + obj6); Console.ReadKey();
}
}
}

运行后测试结果显示如下:

源码:C#动态调用带有SoapHeader验证的WebServices

C#动态调用带有SoapHeader验证的WebServices的更多相关文章

  1. C#静态调用带有SoapHeader验证的WebServices

    转自:http://blog.csdn.net/u012995964/article/details/54562111 本文记录带有SoapHeader验证的WebServices服务创建.部署及C# ...

  2. 带SoapHeader验证的WebServices

    一般在项目中,制作的都是基于SOAP协议的webservices,其描述语言是WSDL.但是有时候在项目中,需要保证webservices的安全,需要对其进行进行验证,那么我们就要实现SoapHead ...

  3. HTML中调用带有SoapHeader头的WebService的两种方法

    第一种: function CallWebMethodWithHeader() { var soapXML = "<soap:Envelope xmlns:xsi='http://ww ...

  4. 动态调用Webservice 支持Soapheader身份验证(转)

    封装的WebserviceHelp类: using System; using System.CodeDom; using System.CodeDom.Compiler; using System. ...

  5. C#调用Java的WebService添加SOAPHeader验证(2)

    C#调用Java的WebService添加SOAPHeader验证 上一篇链接如上,更像是 Net下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) 来处理xml, ...

  6. C#调用Java的WebService添加SOAPHeader验证

    C#调用Java的WebService添加SOAPHeader验证(2) 1.问题描述 调用的Java的webservice string Invoke(string func, string req ...

  7. 11月10日上午ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库

    1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...

  8. c# 动态调用.net编写的webservices接口

    创建类WebServiceHelper: public class WebServiceHelper { #region 动态调用WebService动态调用地址 /// < summary&g ...

  9. ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库

    1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...

随机推荐

  1. Tomcat非root身份运行制作Linux系统服务管理

    理论知识怱略,马上开始实战 一.首先准备好tomcat 启动.关闭.重启Shell脚本: 以下Shell脚本主要修改值 tomcatPath:tomcat目录 runUser:以哪个身份运行 此处测试 ...

  2. CSS3 的动画属性

    通过 CSS3,我们能够创建动画,这可以在许多网页中取代动画图片.Flash 动画以及 JavaScript. ㈠@keyframes 规则 ⑴浏览器支持 Firefox 支持替代的 @-moz-ke ...

  3. spring boot 项目打包后无法通过命令行传入参数

    java -jar .\tk-provider.jar --spring.profiles.active=test 本想用测试环境的配置文件运行项目可项目启动时一直是使用dev配置文件运行. java ...

  4. Android 属性动画监听事件与一个菜单的例子

    简单监听事件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3 ...

  5. [CF1172E]Nauuo and ODT:Link-Cut Tree

    分析 lxl大毒瘤. 感谢Ouuan等CNOIER提供了这么好的比赛. 这里只是把官方题解复述一遍,可以直接去看官方题解:点我. 考虑将问题转化为对于每个颜色,求出没有经过这个颜色的节点的路径有多少条 ...

  6. iview之avatar组件

    avatar组件是一个获取网络路径图片的组件 它再vue中使用的话build时不会被打包,路径仍然为原来的路径 所以相对路径不会有效 如下: <Avatar style="margin ...

  7. HDU 5818 Joint Stacks (优先队列)

    Joint Stacks 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5818 Description A stack is a data stru ...

  8. 本机向window服务器传送数据

    我们需要在远程服务器中安装 FileZilla_Server,在本机安装 FileZilla 客户端 FileZilla 服务器下载地址:https://pan.baidu.com/s/1o7Aen2 ...

  9. C++入门经典-例3.17-使用while循环进行计算

    1:代码如下: // 3.17.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...

  10. PriorityQueue源码阅读

    最小堆:优先级权重越小 离顶点越近 案例 实现一个top max n publish static int[] topN(int[] nums, int l){ int[] result = new ...