- 浏览: 436701 次
- 性别:
- 来自: 唐山
文章分类
最新评论
-
hautbbs:
谢谢分享!
ASP.NET 导出Excel 和csv -
hautbbs:
感谢分享!
ASP.NET 导出Excel乱码的终极解决 -
wyf:
zcl920 写道只能说 看不懂。要发就发全 取一段出来 有什 ...
图片上绘制文字换行处理 -
zcl920:
只能说 看不懂。要发就发全 取一段出来 有什么用。
图片上绘制文字换行处理 -
380086154:
有用,谢谢。
js比较日期
通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务。这样是使工作简单了,但是却和提供Web服务的URL、方法名、参数绑定在一起了,这是VS.NET自动为我们生成Web服务代理的限制。如果哪一天发布Web服务的URL改变了,则我们需要重新让VS.NET生成代理,并重新编译。在某些情况下,这可能是不能忍受的,我们需要动态调用WebService的能力。比如我们可以把Web服务的URL保存在配置文件中,这样,当服务URL改变时,只需要修改配置文件就可以了。
说了这么多,实际上我们要实现这样的功能:
public static object InvokeWebService(string url, string methodname, object[] args)
其中,url是Web服务的地址,methodname是要调用服务方法名,args是要调用Web服务所需的参数,返回值就是web服务返回的结果了。
要实现这样的功能,你需要这几个方面的技能:反射、CodeDom、编程使用C#编译器、WebService。在了解这些知识后,就可以容易的实现web服务的动态调用了:
#region InvokeWebService //动态调用web服务 public static object InvokeWebService(string url, string methodname, object[] args) { return WebServiceHelper.InvokeWebService(url ,null ,methodname ,args) ; } public static object InvokeWebService(string url, string classname, string methodname, object[] args) { string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling" ; if((classname == null) ||(classname == "")) { classname = WebServiceHelper.GetWsClassName(url) ; } try { //获取WSDL WebClient wc = new WebClient(); Stream stream = wc.OpenRead(url+"?WSDL"); ServiceDescription sd = ServiceDescription.Read(stream); ServiceDescriptionImporter sdi = new ServiceDescriptionImporter(); sdi.AddServiceDescription(sd,"",""); CodeNamespace cn = new CodeNamespace(@namespace); //生成客户端代理类代码 CodeCompileUnit ccu = new CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn ,ccu); CSharpCodeProvider csc = new CSharpCodeProvider(); ICodeCompiler icc = csc.CreateCompiler(); //设定编译参数 CompilerParameters cplist = new CompilerParameters(); cplist.GenerateExecutable = false; cplist.GenerateInMemory = true; cplist.ReferencedAssemblies.Add("System.dll"); cplist.ReferencedAssemblies.Add("System.XML.dll"); cplist.ReferencedAssemblies.Add("System.Web.Services.dll"); cplist.ReferencedAssemblies.Add("System.Data.dll"); //编译代理类 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu); if(true == cr.Errors.HasErrors) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach(System.CodeDom.Compiler.CompilerError ce in cr.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } //生成代理实例,并调用方法 System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(@namespace+"."+classname,true,true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(methodname); return mi.Invoke(obj,args); } catch(Exception ex) { throw new Exception(ex.InnerException.Message,new Exception(ex.InnerException.StackTrace)); } } private static string GetWsClassName(string wsUrl) { string[] parts = wsUrl.Split('/') ; string[] pps = parts[parts.Length-1].Split('.') ; return pps[0] ; } #endregion
上面的注释已经很好的说明了各代码段的功能,下面给个例子看看,这个例子是通过访问http://www.webservicex.net/globalweather.asmx 服务来获取各大城市的天气状况。
string url = "http://www.webservicex.net/globalweather.asmx" ; string[] args = new string[2] ; args[0] = this.textBox_CityName.Text ; args[1] = "China" ; object result = WebServiceHelper.InvokeWebService(url ,"GetWeather" ,args) ; this.label_Result.Text = result.ToString() ;
上述的例子中,调用web服务使用了两个参数,第一个是城市的名字,第二个是国家的名字,Web服务返回的是XML文档,可以从其中解析出温度、风力等天气情况。
最后说一下,C#虽然仍属于静态语言之列,但是其动态能力也是很强大的,不信,你可以看看Spring.net的AOP实现,这种“无侵入”的AOP实现比通常的.NET声明式AOP实现(一般是通过AOP Attribute)要漂亮的多。
发表评论
-
登录时记住用户名密码的实现方式
2019-06-12 15:11 3039登录的时候记住用户 ... -
CAS 实现单点登录 .NET MVC
2016-05-24 17:14 1133http://www.cnblogs.com/woxpp/p ... -
.NET开发邮件发送功能的全面教程(含邮件组件源码)
2015-03-31 09:43 1174原文地址:http://www.cnblogs.com/he ... -
开发Web组合
2015-01-04 11:39 6141、数据库操作 ORM-Dapper 2、前台界面布局采 ... -
基于 Bootstrap 构建的网站
2014-12-14 14:12 640文档,下载地址:http://v3.bootcss.com ... -
iis8 默认不支持svc解决方法
2014-09-18 18:57 782以下内容对于使用WIN2012 部署V9的时候使用。 ... -
C# 连接Oracle(利用ODP.net,不安装oracle客户端)
2014-07-11 09:37 1698C# 连接Oracle(利用ODP.net,不安装oracl ... -
C# Attribute 特性,过期特性
2014-05-27 15:18 1852通过下列过程将属性应用到代码元素。 通过从 .NE ... -
.NET画实时直方图
2011-12-30 09:37 922using System; using System.Col ... -
设置combobx选中项
2011-12-21 15:20 1036cbRole.SelectedIndex = cbRole.I ... -
文档树状结构化目录管理方法
2011-12-20 09:50 2199本文适用于附件(各类文档、图片和压缩包等,下同)比较多的 ... -
.StringTemplate替换模板
2011-11-03 10:19 1251官方下载 www.StringTemplate. ... -
WCF-IErrorHandler
2011-10-11 16:30 1058使用 IErrorHandler 接口,我们可以更深入地 ... -
ADODB.Stream instead of Scripting.FileSystemObject.
2011-07-04 08:55 1247In a Silverlight 4 OOB App (eve ... -
Scripting.FileSystemObject对象的详细技巧指南
2011-07-03 23:39 1052Scripting.FileSystemObject对象的 ... -
Stream 和 byte[] 之间的转换
2011-07-02 16:52 1078/* - - - - - - - - - - - - - ... -
常用正则表达式
2011-06-15 20:17 798正则表达式用于字符 ... -
DynamicMethod 类
2011-05-11 22:51 1165public delegate String MyMetho ... -
一个通用的快速反射方法(A General Fast Method Invoker)
2011-04-13 22:01 1530普通反射方法 MethodInfo methodIn ... -
C#操作IIS(转)可以写一个工具自己配置网站
2011-03-24 21:08 2271using System; using System.Dir ...
相关推荐
C# _.NET_动态调用webservice的三种方式 在本文中,我们将讨论如何动态调用WebService的三种方式。在某些情况下,我们可能需要在程序运行期间动态调用一个未知的服务。这可以通过使用.NET Framework的System.Web....
本文将深入探讨如何在C#中实现动态调用WebService服务,主要涉及"反射"和"动态调用"这两个核心概念。 首先,我们要理解什么是WebService。WebService是一种基于开放标准(如SOAP、WSDL和UDDI)的,可以在不同操作...
### C#.NET 动态调用WebService的三种方式详解 #### 概述 在日常的.NET开发工作中,我们经常需要与远程服务器上的服务进行交互,其中WebService作为一种常见的服务交互方式被广泛采用。多数情况下,我们会选择通过...
动态调用WebService服务是C#中的一个关键技能,它允许程序员在运行时与远程Web服务进行交互,而无需预先知道服务的具体接口或方法。本文将深入探讨如何在C#中实现这一功能,并提供相关知识点。 首先,理解...
在深入了解如何使用`HttpWebRequest`调用WebService之前,我们先简要回顾一下相关的基础知识。 ##### 1.1 WebService简介 WebService是一种基于XML和HTTP协议的应用程序接口(API),它允许不同平台、不同语言编写的...
本文将详细讲解如何利用C#动态调用WebService,以便在IIS(Internet Information Services)环境中实现更灵活的应用配置。 首先,我们要理解什么是WebService。WebService是一种基于XML的开放标准,它允许不同系统...
调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...
最近项目中遇到需要去掉老系统的webservice服务中的insert方法,找了很久,发现这样最简单,实测有效!!!
例如,你可以创建一个名为`WebServiceInvoker`的类,包含一个`Invoke`方法,该方法接受Web服务的URL、方法名和参数,然后完成上述步骤来动态调用Web服务。 在压缩包文件`WebServiceInvoke`中,可能包含了示例代码或...
C#调用WebService实例和开发,对于初学者来说,在vs2012环境中,大家有可能不知道Web References文件夹是如何来的,它是通过右击项目,选择其中的”添加服务引用“。
在WinForm应用程序中调用WebService是一项常见的任务,它允许客户端应用程序与远程服务器上的服务进行交互,从而实现数据交换和功能扩展。以下是如何在WinForm中实现这一操作的详细步骤及涉及的相关知识点: 1. **...
本主题聚焦于如何使用C#动态地调用WebService,以实现反向代理功能,从而避免每次需要手动引入WebService的Web引用或URL。这是一种提高代码可维护性和灵活性的方法。 在传统的C# WebService调用中,我们通常会通过...
本示例中,我们将探讨如何利用C#调用WebService来获取天气预报信息。这个过程涉及到网络通信、XML数据解析以及对第三方API的集成。 首先,我们需要理解WebService的工作原理。WebService是一种基于HTTP协议的远程...
在本文中,我们将深入探讨如何使用C#语言在Windows Forms(WinForm)应用程序中调用Web服务,以实现一个经典的示例:获取互联网上的天气预报信息。这个例子适合于使用Visual Studio 2005或2008开发环境。 首先,让...
本篇文章将深入探讨如何在C#中静态调用Web Service,以便通过Web Service来访问数据库。Web Service是一种基于互联网的软件服务,允许不同系统间的应用程序进行交互。在描述的场景中,我们构建了一个IIS(Internet ...
C#动态调用webservice服务 先初始化类 WebServiceCall.WebServiceCall webservicecall1 = new WebServiceCall.WebServiceCall(); 然后调用方法 WebService()
在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而动态调用Web服务和复杂对象的序列化、反序列化是开发过程中常见的技术环节。本文将深入探讨这两个主题。 首先,让我们理解什么是动态调用Web服务。Web...
【C#动态调用WebService】 在C#编程中,动态调用WebService是一种常见的需求,它允许程序在运行时根据需要创建并调用WebService接口,而无需预先编译固定的引用。这种方式提高了程序的灵活性,特别是在服务地址或...
本主题的核心是"拼接XML调用WebService",这通常指的是通过构建XML字符串来构造请求,然后发送该请求到一个Web Service接口以获取响应。以下是对这个过程的详细解释: 1. **XML基础**:XML是一种结构化标记语言,它...