动态调用web服务,当有实体类的时候 (只用于一个)

public class CCBWebSeviceHelper
{

public static int rowCount = 0;
/// < summary>
/// 动态调用web服务,当有实体类的时候 (只用于一个)
/// < /summary>
/// < param name="url">WSDL服务地址< /param>
/// < param name="classname">类名< /param>
/// < param name="classname">实体类类名(当有多个实体类时更改方法,进行循环获取实体类再赋值给调用的方法参数object[])< /param>
/// < param name="methodname">方法名< /param>
/// < param name="args">参数,请根据服务端参数字段顺序对传入参数数组赋值< /param>
/// < returns>< /returns>
public static object InvokeWebService(string url, string classname, string entityname, string methodname, object[] args)
{
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";

if ((classname == null) || (classname == ""))
{
classname = 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 (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 entitType = assembly.GetType(@namespace + "." + entityname, true, true);
object entitObj = Activator.CreateInstance(entitType);

System.Reflection.FieldInfo[] fields = entitType.GetFields();

for (int i = 0; i < args.Count(); i++)
{
fields[i].SetValue(entitObj, args[i]);
}

//传入实体类参数
object[] methodArgs = { entitObj };
Type t = assembly.GetType(@namespace + "." + classname, true, true);

object obj = Activator.CreateInstance(t);
System.Reflection.MethodInfo mi = t.GetMethod(methodname);

return mi.Invoke(obj, methodArgs);
//System.Reflection.PropertyInfo propertyInfo = t.GetProperty(propertyname);
//return propertyInfo.GetValue(obj, null);
}
catch (Exception ex)
{
rowCount++;
object o;
if (rowCount == 3)
{
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
else
{
o = InvokeWebService(url, classname, entityname, methodname, args);
}
return o;
}
}
/// < 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, object[] args)
{
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";

if ((classname == null) || (classname == ""))
{
classname = 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 (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);
//System.Reflection.PropertyInfo propertyInfo = t.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 - 1].Split(‘.‘);
return pps[0];
}
}

时间: 2024-10-07 13:00:49

动态调用web服务,当有实体类的时候 (只用于一个)的相关文章

CXF调用web服务

1.进入apache-cxf-2.7.6\bin目录,按住shift键,鼠标右键点击选择:  在此处打开命令窗口 2.输入 wsdl2java url ,url是对外发布的端口  ,    发布web服务示例: http://www.cnblogs.com/taobd/p/6691871.html 3.把生成的java文件复制到项目,示例如下: 1 package cn.bd.client; 2 import java.util.Date; 3 import javax.xml.bind.ann

使用ASP.NET AJAX 从脚本中调用Web 服务的应用方法

技能点:通过编写WebService,在页面js中调用WebService来进行数据查询. 网站开发,有些时候需要使用js在页面动态生成一些内容,但还有些数据要通过查询数据库才能获取的. 但由于诸如主键id等一些关键数据在后台不易获取,或在后台获取数据后不易直接在前台通过js使用. 这种情况下,使用js+ajax的方式来实现,效果也是不错的. 1.编写webservice: 1 using System; 2 using System.Collections.Generic; 3 using S

asp.net(c#)用Ajax调用web 服务实现省市县三级联动

1.先说说硬件配置,我最开始是在Win7(I7 4770,8G RAM,2T硬盘)里装ubuntu10.10 64位系统(4G RAM,200G 硬盘)进行源码编译,大概花了3个多小时.而且还多次出现outofmemoryerror 错误.最后将硬件升级为I7 4770.16G内存.2T硬盘,不装虚拟机,直接跑Ubuntu 10.10系统,Swap分区为16G,编译一次大概花了40分钟,没有报任何错误. 所以不推荐在虚拟机里面跑. 2.根据官方文档配置编译环境: 官方文档说的是在"发布包/Sof

VS2013创建和调用Web服务

说到Web服务,我们主要有两种途径去创建和调用它,一种是基于Java的web服务,主要是JAX为主的:另一种是ASP.NET的方式去实现:相比之下,笔者更喜欢后者的实现方式,所以推出了Visual Studio的webservice教程. 第一步:先创建一个工程 第二步:选择Visual C#下面的Web项目,基于.NET4.5 第三步:创建服务方法 第四步:发布这个项目 第五步:配置发布选项 第六步:发布选项配置完成之后点击Finish 第七步:配置IIS,一般人的电脑上都没有预先配置这个,所

在 SQL Server 的存储过程中调用 Web 服务

介绍 一个老朋友计划开发一个应用,基于 .NET 和 Socket,但需要在存储过程中调用 Web 服务. 在这篇文章中我们将分享这个应用的经验,讲述如何在存储过程中调用 Web 服务,并传递参数. Step 1 首先我们在 Visual Studio 中创建一个 Web 服务项目: Step 2 接下来在服务中添加我们需要的方法,在这里我们创建 6 个方法,分别是 Greet (string Param1) ,HelloWord() , Add, subtract, 和 Divide (Num

mvc路由引起异步调用web服务的问题

从一篇blog得知使用脚本可以异步调用Web服务,觉得很新鲜,因为自己很少用到Web服务,所以决定写一写看看什么效果. 首先在UI项目(我使用的是MVC4.0)里创建一个Web服务. 添加Web服务后,默认有一个HelloWorld方法.调用该方法有两种形式,一是服务端通过实例化对象调用,二是前端脚本异步 调用.代码分别是: 1.服务端调用 public ActionResult Index() { WebService1 ws = new WebService1(); var str = ws

hibernate 反向生实体类 and 为什么老是多一个id

hibernate 反向生实体类 and 为什么老是多一个id 2017年04月01日 20:32:51 阅读数:548 原文地址:https://www.cnblogs.com/javaboy2018/p/9119040.html

记录:Web无引用无配置方式动态调用WCF服务

这几年一直用WebApi较多,最近项目中有个需求比较适合使用WCF,以前也用过JQuery直接调用Wcf的,但是说实话真的忘了… 所以这次解决完还是花几分钟记录一下 WCF服务端:宿主在现有Win服务中,在服务启动时添加代码 ,服务代码就不用写了,接口和实现按照契约实现即可 private ServiceHost serviceHost = null; //服务宿主 //启动WCF服务 if (serviceHost != null) { serviceHost.Close(); } servi

vc++调用web服务传输文件

bool webService::UploadFile(LPWSTR appKey, LPWSTR fileName, const int len, unsigned char * buff) { try { //SoapSerializer用于序列化(串行化),创建,封装SOAP消息.用来构建一个向Web服务发送的SOAP消息 ISoapSerializerPtr Serializer; //SoapReader将SOAP消息解析为一个DOM模型,并提供一系列操作该DOM模型的方法 ISoap