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方法而烦恼. ...
随机推荐
- Windows请求连接 Vmware+Ubuntu14被拒绝 的幽怨诉说
最近为了学习Linux,在电脑上装了Vmware然后搭建了Ubuntu14的Linux操作系统 搭建完成以后,我兴冲冲的使用TeraTerm进行友情访问发现被拒绝,我很郁闷. 怎么可以这样呢. 然后调 ...
- libeventReferenceManual阅读笔记
一.01_intro.html Example:A low-level ROT13 server with Libevent 这是一个利用event实现的server实例 Example:A simp ...
- Could not instantiate bean class [java.util.List]: Specified class is an interface] with root cause
最近项目中页面比较复杂,springMVC传参过程中遇到这样一个错误:Could not instantiate bean class [java.util.List]: Specified clas ...
- .NET LINQ 转换数据类型
转换数据类型 转换方法更改输入对象的类型. LINQ 查询中的转换运算可用于各种应用程序.下面是一些示例: Enumerable.AsEnumerable<TSource&g ...
- Android:联系人Contacts之ContentResolver query 参数详解
注:本片整理自 http://blog.csdn.net/wssiqi/article/details/8132603 1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人N ...
- ListView没有分割线怎么办?
<ListView android:layout_width="match_parent" android:layout_height="match_parent& ...
- HTTP 头字段总结
1. Accept: 告诉WEB服务器自己接受什么介质类型,/ 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type.2. Accept-Charset: 浏览器申明自己接 ...
- ACM: FZU 2107 Hua Rong Dao - DFS - 暴力
FZU 2107 Hua Rong Dao Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- 一言不合敲代码(1)——DIV+CSS3制作哆啦A梦头像
先展示一下我的头像吧. 作为一个前端ER,我的头像当然不能是绘画工具画出来的.没错,这个玩意是由HTML+CSS代码实现的,过年的某一天晚上无聊花了一个小时敲出来的.来看看它原本的样子: 为什么会变成 ...
- jQueryt过滤选择器
jQueryt过滤选择器 基本过滤选择器 选择器 描述 返回 示例 重要 :first 返回第一个元素 单个元素 :last 返回最后一个元素 单个元素 :not(selector) ...