最近项目中,用到动态调用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的更多相关文章

  1. Atitit 动态调用webservice与客户端代理方式调用

    Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke  直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...

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

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

  3. 动态调用webservice(部分转载)

    动态调用webservice,做个笔记: public class WSHelper { /// < summary> /// 动态调用web服务 /// < /summary> ...

  4. 动态调用webservice及WCF服务

    动态调用web服务,该方法只针对Web service, WCF的服务不行,如果是WCF的就通过工具直接生产代理类,把代理类配置到调用的项目中,通过配置客户端的终结点动态的取实现: 通过Svcutil ...

  5. C# .NET 动态调用webservice的三种方式

    转载自 百度文库 http://wenku.baidu.com/link?url=Q2q50wohf5W6UX44zqotXFEe_XOMaib4UtI3BigaNwipOHKNETloMF4ax4W ...

  6. WebService – 2.动态调用WebService

    在本节课程中,将演示如何通过程序动态添加.调用.编译.执行WebService并返回结果. WebService动态调用示意图 WebService相关知识 代码文档对象模型CodeDom的使用 编程 ...

  7. 用C#通过反射实现动态调用WebService 告别Web引用

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  8. 动态调用Webservice 支持Soapheader身份验证(转)

    封装的WebserviceHelp类: using System; using System.CodeDom; using System.CodeDom.Compiler; using System. ...

  9. [转]Net 下采用GET/POST/SOAP方式动态调用WebService C#实现

    本文转自:http://www.cnblogs.com/splendidme/archive/2011/10/05/2199501.html 一直以来,我们都为动态调用WebService方法而烦恼. ...

随机推荐

  1. nginx配置301重定向

    1. 简介 301重定向可以传递权重,相比其他重定向,只有301是最正式的,不会被搜索引擎判断为作弊 2. 栗子 savokiss.com 301到 savokiss.me 3. nginx默认配置方 ...

  2. Longest Absolute File Path

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  3. 【安装Express】CentOS7 下安装NodeJs+Express+MongoDB+Redis

    上一篇介绍了一下怎么安装Nodejs,那么这一篇就说说怎么安装express,express有个中文站点非常非常方便,http://www.expressjs.com.cn/创建express框架的站 ...

  4. 更改python的编码问题:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 56: ordinal not in range(128)

    as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py # encoding=utf8 import sys reload(s ...

  5. 无法打开之前cuda的vs项目,打开之后变灰色

    解决办法: 打开convolution_vs2010.vcxproj文件,将之前cuda 5.5全部改成cuda7.5. 就可以打开了.

  6. http协议和web应用有状态和无状态浅析

    http协议和web应用有状态和无状态浅析 (2013-10-14 10:38:06) 转载▼ 标签: it   我们通常说的web应用程序的无状态性的含义是什么呢? 直观的说,“每次的请求都是独立的 ...

  7. ASP.NET MVC中的错误处理

    ASP.NET MVC中的错误的错误处理跨越了两个主要领域:程序异常和路由异常的处理.前者是关于在控制器和视图中捕获错误的;而后者更多是有关重定向和HTTP错误的. 1.在WebConfig中把过滤器 ...

  8. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  9. hdfs中block的使用情况,副本所在情况等等

    hadoop fsck /user/hive/warehouse/dataplat.db/hive_datacppa2xsourcendchinaraw/partitiondate=2016-11-2 ...

  10. oj Rapid Typing

    import bs4 import requests import urllib2 import time import base64 session=requests.Session() respo ...