记一次动态调用WebService
这次的使用参考博客园中的ID是 生命不息,折腾不止 http://www.cnblogs.com/leolion/p/4757320.html ,感谢分享
博客园让自己慢慢的成长,少不了这些无私奉献的大牛,很是感谢。
动态调用的具体步骤为:
1)从目标 URL 下载 WSDL 数据;
2)使用 ServiceDescription 创建和格式化 WSDL 文档文件;
3)使用 ServiceDescriptionImporter 创建客户端代理类;
4)使用 CodeDom 动态创建客户端代理类程序集;
5)利用反射调用相关 WebService 方法。
开始咯
Web.config中的配置,里边的代理类名称好像必须的和WebSevice中的服务名称一样。
<appSettings>
<!--WebService地址-->
<add key="WebServiceUrl" value="http://localhost:3933/WebService/InterfaceService.asmx" />
<!--WebService输出dll文件名称-->
<add key="OutputDllFilename" value="TestWebService.dll" />
<!--WebService代理类名称-->
<add key="ProxyClassName" value="InterfaceService" />
</appSettings>
创建一个枚举类,把需要映射WebService的方法名称放进去,调用方法的时候用起来方便
namespace WebConnWebService
{
/// <summary>
/// 方法枚举
/// </summary>
public enum EMethod
{
HelloWorld,
CancelOrder,
GetAllProductInfo,
GetOrderInfo ,
GetProductInfo ,
OrderSubmit,
QueryOrderDetails
}
}
新建类WSHelper.cs,代码如下,精髓
public class WSHelper
{/// <summary>
/// 输出的dll文件名称
/// </summary>
private static string m_OutputDllFilename; /// <summary>
/// WebService代理类名称
/// </summary>
private static string m_ProxyClassName; /// <summary>
/// WebService代理类实例
/// </summary>
private static object m_ObjInvoke; /// <summary>
/// 接口方法字典
/// </summary>
private static Dictionary<EMethod, MethodInfo> m_MethodDic = new Dictionary<EMethod, MethodInfo>(); /// <summary>
/// 创建WebService,生成客户端代理程序集文件
/// </summary>
/// <param name="error">错误信息</param>
/// <returns>返回:true或false</returns>
public static bool CreateWebService(out string error)
{
try
{
error = string.Empty;
m_OutputDllFilename = ConfigurationManager.AppSettings["OutputDllFilename"];
m_ProxyClassName = ConfigurationManager.AppSettings["ProxyClassName"];
string webServiceUrl = ConfigurationManager.AppSettings["WebServiceUrl"];
webServiceUrl += "?WSDL"; // 如果程序集已存在,直接使用
if (File.Exists(Path.Combine(Environment.CurrentDirectory, m_OutputDllFilename)))
{
BuildMethods();
return true;
} //使用 WebClient 下载 WSDL 信息。
WebClient web = new WebClient();
Stream stream = web.OpenRead(webServiceUrl); //创建和格式化 WSDL 文档。
if (stream != null)
{
// 格式化WSDL
ServiceDescription description = ServiceDescription.Read(stream); // 创建客户端代理类。
ServiceDescriptionImporter importer = new ServiceDescriptionImporter
{
ProtocolName = "Soap",
Style = ServiceDescriptionImportStyle.Client,
CodeGenerationOptions =
CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync
}; // 添加 WSDL 文档。
importer.AddServiceDescription(description, null, null); //使用 CodeDom 编译客户端代理类。
CodeNamespace nmspace = new CodeNamespace();
CodeCompileUnit unit = new CodeCompileUnit();
unit.Namespaces.Add(nmspace); ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); CompilerParameters parameter = new CompilerParameters
{
GenerateExecutable = false,
// 指定输出dll文件名。
OutputAssembly = m_OutputDllFilename
}; parameter.ReferencedAssemblies.Add("System.dll");
parameter.ReferencedAssemblies.Add("System.XML.dll");
parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
parameter.ReferencedAssemblies.Add("System.Data.dll"); // 编译输出程序集
CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit); // 使用 Reflection 调用 WebService。
if (!result.Errors.HasErrors)
{
BuildMethods();
return true;
}
else
{
error = "反射生成dll文件时异常";
}
stream.Close();
stream.Dispose();
}
else
{
error = "打开WebServiceUrl失败";
}
}
catch (Exception ex)
{
error = ex.Message;
}
return false;
} /// <summary>
/// 反射构建Methods
/// </summary>
private static void BuildMethods()
{
Assembly asm = Assembly.LoadFrom(m_OutputDllFilename);
//var types = asm.GetTypes();
Type asmType = asm.GetType(m_ProxyClassName);
m_ObjInvoke = Activator.CreateInstance(asmType); //var methods = asmType.GetMethods();
var methods = Enum.GetNames(typeof(EMethod)).ToList();
foreach (var item in methods)
{
var methodInfo = asmType.GetMethod(item);
if (methodInfo != null)
{
var method = (EMethod)Enum.Parse(typeof(EMethod), item);
if (!m_MethodDic.ContainsKey(method))
{
m_MethodDic.Add(method, methodInfo);
}
}
}
} /// <summary>
/// 获取请求响应
/// </summary>
/// <param name="method">方法</param>
/// <param name="para">参数</param>
/// <returns>返回:Json串</returns>
public static string GetResponseString(EMethod method, params object[] para)
{
string result = null;
if (m_MethodDic.ContainsKey(method))
{
var temp = m_MethodDic[method].Invoke(m_ObjInvoke, para);
if (temp != null)
{
result = temp.ToString();
}
}
return result;
}
}
好了接下来就是调用,简单的测试一下了
protected void Page_Load(object sender, EventArgs e)
{
string error;
bool succ = WSHelper.CreateWebService(out error);//先下载wsdl到本地如果本地已下载直接调用本地已下载好的dll,在把方法放到内存中以便调用
// SOAP 请求响应方式
//TextBox1.Text = WSHelper.GetResponseString(EMethod.Add, Convert.ToInt32(TextBox1.Text), Convert.ToInt32(TextBox2.Text));
TextBox1.Text = WSHelper.GetResponseString(EMethod.HelloWorld);
}
前台显示
758.png)

记一次动态调用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> ...
- C# 动态调用webservice
最近项目中,用到动态调用webservice的内容,此处记录下来,留着以后COPY(我们只需要在XML,config文件,或者数据库中配置webservice连接地址和方法名即可使用): using ...
- 动态调用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. ...
随机推荐
- shell local
Shell函数定义的变量默认是global的,其作用域从"函数被调用时执行变量定义的地方"开始,到shell结束 http://blog.chinaunix.net/xmlrpc. ...
- Words in Coding Theory
Lemma d(x.y) wt(c,0) self-dual self-orthogonal even prime wt(C) matrix column permute permutation ge ...
- (转)C# WinForm获取当前路径汇总
Winform获取应用程序的当前路径的方法集合,具体如下,值得收藏本文来源 :http://www.cnblogs.com/greatverve/archive/2011/12/15/winform- ...
- HTML控件-Select
从今天开始,编写对于html控件的特性的探索文章,会广泛的引用网络的资源,所以本文的版权属于广大人民群众,欢迎转载,也同样禁止商业应用. [高手勿喷,标签页点击红色叉叉] select控件有一个特性: ...
- MacPE+WinPE-黑苹果之路
装黑苹果过程中,安装.备份.恢复都需要启动到MAC,总是从硬盘启动对于硬盘数据风险太大,琢磨着安装个pe用来维护,此外手上的winpe,也想着一并实现,免得搞两个u盘.找了个网页开工,http://b ...
- Missing artifact com.sun:tools:jar:1.5.0:system 补充
转自:http://blog.csdn.net/sweblish/article/details/6662586 解决方案一: 原来,是${java.home}在作怪,eclipse 没有使用 JAV ...
- Ubuntu上部署Ghost博客
所有文章搬运自我的个人主页:sheilasun.me 刚刚成功把自己的ghost博客部署到Linode VPS上了,在这里回顾并顺便整理一下从购买域名到部署代码到服务器的整个过程. 购买域名 万网或者 ...
- 这些优化 Drupal 网站速度的超简单办法,你忽略了多少?
“怎么样能让我的 Drupal 网站更快一些?”是我们最常遇到的一个问题.站点速度确实非常重要,因为它会影响你的 SEO排名效果.访客是否停留以及你自己管理网站所需要的时间. 今天我们就来看看那些通过 ...
- openerp权限设置总结
Openerp权限设置 最近一直在弄openerp权限问题,现在终于懂了一些.主要对模块下的security 目录下的文件:xxx_security.xml.ir.model.access.csv进行 ...
- Oracle密码过期the password has expired
oracle11G新特征,半年会提醒一次修改新密码 正常情况:只要输入原先帐号密码,回车即可. 不正常情况:输入新密码帐号,回车,提示验证错误,这时就需要切换到没过期的管理员用户,高权限也行,输入 ...