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方法而烦恼. ...
随机推荐
- sharepoint OWA问题解决
请检查DNS 检查域名解析 cmd----nslookup---输入IP或者域名(计算机名)可以看到
- Opera Browser -- Access Restricted Sites using Free VPN /Free VPN Services List
Opera Browser -- Access Restricted Sites using Free VPN: currently the feature is available in Oper ...
- JDK7 tomcat6 各种环境变量配置
JDK JAVA_HOME:jdk路径,bin目录上一层 Path:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin CLASSPATH:.;%JAVA_HOME%\lib;%J ...
- Linux虚拟机添加新硬盘的全程图解
查看网的文章,我将在vm虚拟机LinuxRedhat中添加一个新的硬盘, 过程大致如下: 1.选择"VM"----"setting"并打开,将光标定位在hard ...
- Pyqt adb 获取Android手机屏幕
adb的全称为Android Debug Bridge,就是起到调试桥的作用.adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会da ...
- [数学]内接多边形求pi
- hdu 5073
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5073 思路:一开始忘了排序,wa了好几发...选择区间长度为N - K的连续的数, 然后其余的K个数都 ...
- ios10新特性-UserNotification
引言:iOS的通知分本地通知和远程通知,iOS10之前采用的是UILocationNotification类,远程通知有苹果服务器进行转发,本地通知和远程通知其回调的处理都是通过AppDelegate ...
- BestCoder Round #86
A题 Price List 巨水..........水的不敢相信. #include <cstdio> typedef long long LL; int main() { int T; ...
- ios8 设置单元格分割线无效
原来: [self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];//分隔线紧贴左右边框 || [self.tableView s ...