C# 动态调用webservice
最近项目中,用到动态调用webservice的内容,此处记录下来,留着以后COPY(我们只需要在XML,config文件,或者数据库中配置webservice连接地址和方法名即可使用);
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Reflection;
using System.Text;
using System.Web.Services.Description;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
using Microsoft.CSharp; namespace consoleTest
{
public class DynWebServiceUtil
{
private const string WS_WSDL = "?WSDL";
private const string WS_DLL_SYSTEM = "System.dll";
private const string WS_DLL_XML = "System.XML.dll";
private const string WS_DLL_WS = "System.Web.Services.dll";
private const string WS_DLL_DATA = "System.Data.dll";
private const string WS_NAMESPACE = "EnterpriseServerBase.WebService.DynamicWebCalling"; // 保存已编译生成的webservice代理
private static IDictionary<string, HttpWebClientProtocol> mWebServiceList; /// <summary>
/// 静态构造函数
/// </summary>
static DynWebServiceUtil()
{
mWebServiceList = new Dictionary<string, HttpWebClientProtocol>();
} /// <summary>
/// 动态调用web服务
/// </summary>
/// <param name="url">地址</param>
/// <param name="methodName">方法名</param>
/// <param name="args">方法参数</param>
/// <returns>方法返回值</returns>
public static object InvokeWebService(string url, string methodName, object[] args)
{
string strProxyIp = ConfigurationManager.AppSettings["ProxyIp"];
string strProxyPort = ConfigurationManager.AppSettings["ProxyPort"];
WebProxy webProxy = string.IsNullOrEmpty(strProxyIp) || string.IsNullOrEmpty(strProxyPort)
? null : new WebProxy(strProxyIp, int.Parse(strProxyPort));
return InvokeWebService(url, methodName, args, webProxy);
} /// <summary>
/// 动态调用web服务
/// </summary>
/// <param name="url">地址</param>
/// <param name="methodName">方法名</param>
/// <param name="args">方法参数</param>
/// <param name="webProxy">外网代理服务器</param>
/// <returns>方法返回值</returns>
public static object InvokeWebService(string url, string methodName, object[] args, WebProxy webProxy)
{
return InvokeWebService(url, null, methodName, args, webProxy);
} /// <summary>
/// 动态调用web服务
/// </summary>
/// <param name="url">地址</param>
/// <param name="className">类名</param>
/// <param name="methodName">方法名</param>
/// <param name="args">方法参数</param>
/// <param name="webProxy">外网代理服务器</param>
/// <returns>方法返回值</returns>
public static object InvokeWebService(string url,
string className, string methodName, object[] args, WebProxy webProxy)
{
ServicePointManager.Expect100Continue = false;
HttpWebClientProtocol wsProxy = GetWebService(url, className, webProxy);
MethodInfo mi = wsProxy.GetType().GetMethod(methodName); try
{
return mi.Invoke(wsProxy, args);
}
catch (TargetInvocationException exTI)
{
throw new DynWebServiceMethodInvocationException(
exTI.InnerException.Message,
new Exception(exTI.InnerException.StackTrace));
}
} /// <summary>
/// 取得类名
/// </summary>
/// <param name="wsUrl">地址</param>
/// <returns>类名</returns>
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - ].Split('.'); return pps[];
} /// <summary>
/// 取得webservice代理类
/// </summary>
/// <param name="url">地址</param>
/// <param name="className">类名</param>
/// <param name="webProxy">外网代理服务器</param>
/// <returns>webservice代理类</returns>
private static HttpWebClientProtocol GetWebService(string url, string className, WebProxy webProxy)
{
string strUrl = url.ToLower();
HttpWebClientProtocol wsProxy = null;
if (mWebServiceList.ContainsKey(strUrl))
{
wsProxy = mWebServiceList[strUrl];
}
else
{
if (string.IsNullOrEmpty(className))
{
className = GetWsClassName(url);
} // 获取WSDL
WebClient wc = new WebClient(); // 访问url是否需要通过代理服务器
if (webProxy != null)
{
wc.Proxy = webProxy;
} Stream stream = wc.OpenRead(url + WS_WSDL);
ServiceDescription sd = ServiceDescription.Read(stream);
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, null, null); // 生成客户端代理类代码
CodeCompileUnit ccu = new CodeCompileUnit();
CodeNamespace cn = new CodeNamespace(WS_NAMESPACE);
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu); // 设定编译参数
CompilerParameters cplist = new CompilerParameters();
cplist.GenerateExecutable = false;
cplist.GenerateInMemory = true;
cplist.ReferencedAssemblies.Add(WS_DLL_SYSTEM);
cplist.ReferencedAssemblies.Add(WS_DLL_XML);
cplist.ReferencedAssemblies.Add(WS_DLL_WS);
cplist.ReferencedAssemblies.Add(WS_DLL_DATA); // 编译代理类
CSharpCodeProvider csc = new CSharpCodeProvider();
CompilerResults cr = csc.CompileAssemblyFromDom(cplist, ccu);
if (cr.Errors.HasErrors)
{
StringBuilder sb = new StringBuilder();
foreach (CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(Environment.NewLine);
} throw new DynWebServiceCompileException(sb.ToString());
} // end of if (cr.Errors.HasErrors) // 生成代理实例
Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(WS_NAMESPACE + "." + className, true, true);
wsProxy = (HttpWebClientProtocol)Activator.CreateInstance(t);
mWebServiceList[strUrl] = wsProxy;
} // enf of if (mWebServiceList.ContainsKey(strUrl)) // 访问url是否需要通过代理服务器
if (webProxy != null)
{
wsProxy.Proxy = webProxy;
} return wsProxy;
} }
} 调用:
DynWebServiceUtil.InvokeWebService(
string.Format("{0}", tbWebService.Rows[0]["SERVICE_URL"]),
string.Format("{0}", tbWebService.Rows[0]["SERVICE_METHOD_NAME"]),
new object[] { "asnno"})
C# 动态调用webservice的更多相关文章
- Atitit 动态调用webservice与客户端代理方式调用
Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke 直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...
- 动态调用WebService(C#) (非常实用)
通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...
- 动态调用webservice(部分转载)
动态调用webservice,做个笔记: public class WSHelper { /// < summary> /// 动态调用web服务 /// < /summary> ...
- 动态调用webservice及WCF服务
动态调用web服务,该方法只针对Web service, WCF的服务不行,如果是WCF的就通过工具直接生产代理类,把代理类配置到调用的项目中,通过配置客户端的终结点动态的取实现: 通过Svcutil ...
- C# .NET 动态调用webservice的三种方式
转载自 百度文库 http://wenku.baidu.com/link?url=Q2q50wohf5W6UX44zqotXFEe_XOMaib4UtI3BigaNwipOHKNETloMF4ax4W ...
- WebService – 2.动态调用WebService
在本节课程中,将演示如何通过程序动态添加.调用.编译.执行WebService并返回结果. WebService动态调用示意图 WebService相关知识 代码文档对象模型CodeDom的使用 编程 ...
- 用C#通过反射实现动态调用WebService 告别Web引用
我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...
- 动态调用Webservice 支持Soapheader身份验证(转)
封装的WebserviceHelp类: using System; using System.CodeDom; using System.CodeDom.Compiler; using System. ...
- [转]Net 下采用GET/POST/SOAP方式动态调用WebService C#实现
本文转自:http://www.cnblogs.com/splendidme/archive/2011/10/05/2199501.html 一直以来,我们都为动态调用WebService方法而烦恼. ...
随机推荐
- PHP程序员进阶学习书籍参考指南
PHP程序员进阶学习书籍参考指南 @heiyeluren lastmodify: 2016/2/18 [初阶](基础知识及入门) 01. <PHP与MySQL程序设计(第4版)> ...
- JAVA Hibernate工作原理及为什么要用
hibernate 简介:hibernate是一个开源框架,它是对象关联关系映射的框架,它对JDBC做了轻量级的封装,而我们java程序员可以使用面向对象的思想来操纵数据库.hibernate核心接口 ...
- .NET LINQ概述
LINQ 语言集成查询 (LINQ) 是 Visual Studio 2008 中引入的一组功能,它在对象领域和数据领域之间架起了一座桥梁.可为 C# 和 Visual Basic 语言语法 ...
- jQuery可拖拽排序列表jquery-sortable-lists
jquery-sortable-lists可以通过鼠标进行拖动排列树型菜单,可以定义某个列表元素是否拖动,拖动后回调,点击可以折叠树型结点,可以用来在后台模仿wordpress后台拖动菜单,实现多级菜 ...
- 【tornado】系列项目(二)基于领域驱动模型的区域后台管理+前端easyui实现
本项目是一个系列项目,最终的目的是开发出一个类似京东商城的网站.本文主要介绍后台管理中的区域管理,以及前端基于easyui插件的使用.本次增删改查因数据量少,因此采用模态对话框方式进行,关于数据量大采 ...
- vue
vue.js 插件 setting--> plugins 搜索vue,下载安装如果想要高亮显示*.vue文件,可以在File Types 选项里找到HTML,然后在下方手动添加*.vue,这样就 ...
- iOS--异步下载
#import "ViewController.h"#import "UIImageView+WebCache.h"@interface ViewControl ...
- containing block
1(position:static和relative) 它的包含块由它最近的块级.单元格(table cell)或者行内块(inline-block)祖先元素创建. 2.position:fixed ...
- HDU-1203(01背包)
I NEED A OFFER! Problem Description Speakless 很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了.要申请国外的 ...
- 如何更好地学习dubbo源代码(转)
很荣幸,作为这样一款业界使用率和好评率出众的RPC框架的维护者,今天这个文章主要是想帮助那些热爱开源的同学,更好的来研究dubbo的源代码. 一.Dubbo整体架构 1.Dubbo与Spring的整合 ...