来源:网络,自己做修改
CSharpCodeProvider csc = new CSharpCodeProvider();
ICodeCompiler icc = csc.CreateCompiler();
会提示已经过时,
现在修改为 CodeDomProvider csc= CodeDomProvider.CreateProvider("CSharp"); 调用:
string pcUrl = "http://localhost:8089/test.asmx";
string pcClassName = "";
string pcMethodName = "GetData";
object[] objs = new object[];
objs[] = "";
DataSet ds = DynamicWebServiceCall.InvokeWebService(pcUrl, pcClassName, pcMethodName, objs) as DataSet; [csharp] view plain copy print?
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Net;
using System.IO;
using System.Web.Services.Description;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp; /// <summary>
/// 动态调用WebService 的相关方法
/// </summary>
public sealed class DynamicWebServiceCall
{
/// <summary>
/// 动态调用WebService 的方法
/// </summary>
/// <param name="pcUrl">WebService 的访问路径 http://localhost:8080/WebServiceTest.asmx </param>
/// <param name="pcClassName">要调用的类名</param>
/// <param name="pcMethodName">方法名</param>
/// <param name="args">方法参数</param>
/// <returns></returns>
public static object InvokeWebService(string pcUrl, string pcMethodName, object[] args)
{
return InvokeWebService(pcUrl, "", pcMethodName, args);
}
/// <summary>
/// 动态调用WebService 的方法
/// </summary>
/// <param name="pcUrl">WebService 的访问路径 http://localhost:8080/ 或 http://localhost:8080/WebServiceTest.asmx </param>
/// <param name="pcClassName">要调用的类名,当Url里已经传动了类名的时候,这里设置为“”</param>
/// <param name="pcMethodName">方法名</param>
/// <param name="args">方法参数</param>
/// <returns></returns>
public static object InvokeWebService(string pcUrl, string pcClassName, string pcMethodName, object[] args)
{
object loRetVal = null; try
{
if (!string.IsNullOrEmpty(pcClassName))
{
pcUrl += pcClassName;
}
else
{
pcClassName = GetWsClassName(pcUrl);
} Assembly loAssemble = CreateDynWebServiceAssemble(pcUrl);
if (loAssemble != null)
{
string lcNameSpace = "Sonic.Web.WebService.DynamicWebService";
Type t = loAssemble.GetType(lcNameSpace + "." + pcClassName, true, true);
object obj = Activator.CreateInstance(t);
MethodInfo loMethodInfo = t.GetMethod(pcMethodName);
if (loMethodInfo != null)
loRetVal = loMethodInfo.Invoke(obj, args);
}
}
catch (Exception e)
{
loRetVal = null;
throw e;
}
return loRetVal;
} /// <summary>
/// 动态创建WebService的Assembly
/// </summary>
/// <param name="pcUrl">WebService 的访问路径 入 http://localhost:8080/WebServiceTest.asmx</param>
/// <returns></returns>
private static Assembly CreateDynWebServiceAssemble(string pcUrl)
{
Assembly loRetVal = null;
string lcNameSpace = "Sonic.Web.WebService.DynamicWebService";
try
{
//获取WSDL
WebClient loWC = new WebClient();
Stream stream = loWC.OpenRead(pcUrl + "?WSDL"); ServiceDescription sd = ServiceDescription.Read(stream);
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(lcNameSpace); //生成客户端代理类代码
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
//CSharpCodeProvider csc = new CSharpCodeProvider();
//ICodeCompiler icc = csc.CreateCompiler(); //已过时
CodeDomProvider csc = 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 = csc.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());
} //生成代理实例,并调用方法
loRetVal = cr.CompiledAssembly;
}
catch (Exception e)
{
loRetVal = null;
throw e;
} return loRetVal;
} private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - ].Split('.'); return pps[];
}
}

Dynamic Invok Webservice的更多相关文章

  1. 用C#访问Dynamic AX的WebService.

    第 1 步:创建 C# WinForm 应用程序 针对本演练,您将创建访问报表服务器 Web 服务的简单控制台应用程序.本演练假定您是在 Visual Studio 环境中进行开发的.测试范例基于VS ...

  2. Atitit webservice发现机制 WS-Discovery标准的规范attilax总结

    Atitit webservice发现机制 WS-Discovery标准的规范attilax总结 1.1. WS-Discovery标准1 1.2. 一.WS-Discovery1 1.2.1.   ...

  3. 不一样的dynamic解析json 万能方法

    写过javascript的人都知道js解析json 1:(JSON) 字符串转换为对象. var str = '{"name":"lsw","hobb ...

  4. cxf设置代理访问webservice接口

    由于业务上的需要,需要访问第三方提供的webservice接口,但由于公司做了对外访问的限制,不设置代理是不能外网的,如果使用http设置代理访问外网还是比较容易的,但使用cxf有点不知道从哪里入手. ...

  5. 动态调用WebService(C#) (非常实用)

    通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...

  6. cxf webservice简单应用

    Server端 server部署到一个端口号为80的tomcat中 CXFController.java package com.lwj.controller; import java.io.IOEx ...

  7. 使用CXF发布WebService

    这里普及一下WebService和cxf的知识.关于webservice和cxf:   WebService.各种提供服务的组件     .企业总线.通讯总线(ESB)CXF:是一个SOA框架,Axi ...

  8. 使用Axis2建立WebService

    Axis是apache重量级的WebService框架,虽然相比Xfire和CXF而言相对比较臃肿,但是企业中最常用的就是Axis,Axis2是Axis的升级版:   建立一个最简单的Axis2  W ...

  9. C# winform 动态调用WebService

    封装的通用方法: using System; using System.Collections.Generic; using System.Text; using System.Xml; using ...

随机推荐

  1. [转载]SVN如何恢复已删除文件或文件夹

    http://blog.sina.com.cn/s/blog_694d806e0100kaqz.html 用TortoiseSVN: 1.在本地working copy中,用TortoiseSVN-& ...

  2. 【开源一个小工具】一键将网页内容推送到Kindle

    最近工作上稍微闲点,这一周利用下班时间写了一个小工具,其实功能挺简单但也小折腾了会. 工具名称:Simple Send to Kindle Github地址:https://github.com/zh ...

  3. No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing

    在Java中,类中的静态方法不能直接调用动态方法.只有将某个内部类修饰为静态类,然后才能够在静态类中调用该类的成员变量与成员方法.所以在不做其他变动的情况下,最简单的解决办法是将public clas ...

  4. hibernate之persistence错误

    错误码: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityM ...

  5. int (*p)[4] 与 int* p[4]

    碰到一道题: ][] = {,,,,,,,,,,,}; ]; ] = (a+); cout<<*(p+)<<endl; cout<<(*ptr+)[]<< ...

  6. Apache 虚拟主机

    httpd支持的虚拟主机类型包括以下三种 基于域名:为每个虚拟主机使用不同的域名.但其对应的IP使相同的. 基于IP地址:为每个虚拟主机使用不同的域名,切各自对应的IP地址也不相同. 基于端口:这种方 ...

  7. Code First03---CodeFirst根据配置同步到数据库的三种方式

    上一节我们说到使用Fluent API对实体的配置,但是有一个问题了,在业务中我们可以用到的实体很多,那是不是每个都需要这样去配置,这样就造成我们重写的OnModelCreating方法很庞大了.所以 ...

  8. MongoDB的学习和使用(固定集合[Capped Collections])

    MongoDB 固定集合(Capped Collections) MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环 ...

  9. Java序列化技术与Protobuff

    http://www.cnblogs.com/fangfan/p/4094175.html http://www.cnblogs.com/fangfan/p/4094175.html 前言: Java ...

  10. linux中wc命令用法

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...