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方法而烦恼. ...
随机推荐
- Spring配置文件中使用表达式
在配置文件中使用Java类 <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieR ...
- PDO 用法学习
PDO: php data object数据库访问抽象层 基于驱动:1.安装扩展 php_pdo.dll2.安装驱动 php_pdo_mysql.dll linux 编译时参数:--with-pdo= ...
- C# 使用 StructLayoutAttribute 时 C# /C++ 内存空间分配与成员对齐问题
1. 使用场景 公共语言运行时控制数据字段的类或结构在托管内存中的物理布局.但是,如果想要将类型传递到非托管代码,需要使用 StructLayout 属性. 2. 内存分配问题. 如果不显示的设置内存 ...
- TableView 隐藏多余的分割线
- (void)setExtraCellLineHidden: (UITableView *)tableView { UIView *view = [UIView new]; view.backgro ...
- 【Java EE 学习 28 上】【oracle学习第二天】【子查询】【集合运算】【几种数据库对象】
一.子查询 1.为什么要使用子查询:问题不能一步求解或者一个查询不能通过一步查询得到. 2.分类:单行子查询和多行子查询. 3.子查询的本质:一个查询中包含了另外一个或者多个查询. 4.使用子查询的规 ...
- iOS- 制作U盘安装Mac OS X 系统
需要: 1.下载Yomitate.app or Capitan.app 跳转到官网或者第三方. 2.准备一台Mac 电脑 3.准备一个8G U盘. 安装: 步骤1.将Yomitate.app 拖到应用 ...
- java返回一个简单的日历
import java.text.*; //首先得导包 import java.util.*; public class hw2 { /** * 计算日期差 返回的天数 * @param dstr1 ...
- Difinition Of Done
A Story is Sprint ready (Rally Defined) when............. The story has well defined and testable ac ...
- iOS 自定义的CodeSnippets添加按下tab键切换到指定输入位置
在需要使用tab来选中并输入内容的地方,添加: <#输入待覆盖的内容#>
- 数论 - Vanya and Computer Game
Vanya and his friend Vova play a computer game where they need to destroy n monsters to pass a level ...