C#动态调用Web服务的3种方法

我们在开发C# WinForm时,有时会调用Web服务,服务是本地的当前好办,只要在Project中的Web References中引入就可以在代码中直接创建一个Web服务对象来引用,其实其原理是C#帮你自动创建客户端代理类的方式调用WebService,但如果调用的服务是动态的,比如说在几个IIS中都有相同的一个服务,在运行时输入具体的IP才确定调用哪个服务,那要怎么样实现呢。

C#动态调用Web服务方法一: 手动的添加一个Web引用,然后修改下本地的代理类。最后实现Web Service的URI部署到配置文件里。 具体做法如下:

以下代码是显示如何配置动态的Web Service,以服务单元C(类名为Web_SVSGC)为例:

(1)首先在Web引用中的本地代理类中添加一个构造函数,这个构造函数是以Web Service的URL为参数的重载方法。

复制  保存

  1. Namespace Web_SVSGC  
  2.     '< remarks/> 
  3.     < System.Diagnostics.DebuggerStepThroughAttribute(),  _     System.ComponentModel.DesignerCategoryAttribute("code"),  _     System.Web.Services.WebServiceBindingAttribute(Name:="SVSGCSoap", [Namespace]:="http://tempuri.org/QYJSERVICE/SVSGC"),  _     System.Xml.Serialization.XmlIncludeAttribute(GetType(Attribute))>  _  
  4.     Public Class SVSGC  
  5.         Inherits System.Web.Services.Protocols.SoapHttpClientProtocol  
  6.     '< remarks/> 
  7.         Public Sub New()  
  8.             MyBase.New  
  9.             Me.Url = "http://localhost/QYJSERVICE/WEBSERVICE/SERVICE/SVSGC.asmx" 
  10.         End Sub  
  11.  
  12.         '添加一个带参数的构造函数。  
  13.         Public Sub New(ByVal strUrl As String)   
  14.             MyBase.New()   
  15.             Me.Url = strUrl   
  16.         End Sub  
  17.  

(2)将Web Service的url配置在调用Web Service的应用程序的配置文件中。(其中的value可以随时修改。)

复制  保存

  1. < configuration> 
  2.     < appSettings> 
  3.               < add key="SVSGA_URL" value="http://192.168.108.188/ QDN/SERVICE/SVSGA.asmx" QDN/SERVICE/SVSGA.asmx" /> 
  4.     < /appSettings> 
  5. < /configuration>< configuration> 
  6.     < appSettings> 
  7.               < add key="SVSGA_URL" value="http://192.168.108.188/ QDN/SERVICE/SVSGA.asmx" QDN/SERVICE/SVSGA.asmx" /> 
  8.     < /appSettings> 
  9. < /configuration> 

(3)调用时,根据配置文件的Url动态的生成Web Service。

复制  保存       

  1. '要调用的Web Service的URL  
  2.         Dim strWebSvsUrl As String  
  3.         '声明一个要调用的Web Service  
  4.         Dim objSVSGC As WebSvs_GC. SVSGC  
  5.         '调用Web Service的远程方法的返回值  
  6.         Dim strReturnValue As String  
  7.         Try  
  8.             '从配置文件中取得Web Service的URL  
  9.             strWebSvsUrl = _   
  10.             System.Configuration.ConfigurationSettings.AppSettings("SVSGC_URL")   
  11.             '生成一个Web Service实例  
  12.             objSVSGC = New WebSvs_GC.SVSGC (strWebSvsUrl)  
  13.             '调用这个Web Service里的远程方法  
  14.             strReturnValue = objSVSGC.HelloWorld()  
  15.         Catch ex As Exception  
  16.         End Try 

C#动态调用Web服务方法二:完全动态处理,传入服务服务网址,方法名和参数即可.

  1. using System;   
  2. using System.Net;   
  3. using System.IO;   
  4. using System.CodeDom;   
  5. using Microsoft.CSharp;   
  6. using System.CodeDom.Compiler;   
  7. using System.Web.Services.Description;   
  8. using System.Web.Services.Protocols;   
  9.  
  10. namespace HB.Common   
  11. {   
  12.     /* 调用方式   
  13.      *   string url = "http://www.webservicex.net/globalweather.asmx" ;   
  14.      *   string[] args = new string[2] ;   
  15.      *   args[0] = "Hangzhou";   
  16.      *   args[1] = "China" ;   
  17.      *   object result = WebServiceHelper.InvokeWebService(url ,"GetWeather" ,args) ;   
  18.      *   Response.Write(result.ToString());   
  19.      */   
  20.     public class WebServiceHelper   
  21.     {   
  22.         #region InvokeWebService   
  23.         /// < summary>   
  24.         /// 动态调用web服务   
  25.         /// < /summary>   
  26.         /// < param name="url">WSDL服务地址< /param>   
  27.         /// < param name="methodname">方法名< /param>   
  28.         /// < param name="args">参数< /param>   
  29.         /// < returns>< /returns>   
  30.         public static object InvokeWebService(string url, string methodname, object[] args)   
  31.         {   
  32.             return WebServiceHelper.InvokeWebService(url, null, methodname, args);   
  33.         }   
  34.  
  35.         /// < summary>   
  36.         /// 动态调用web服务   
  37.         /// < /summary>   
  38.         /// < param name="url">WSDL服务地址< /param>   
  39.         /// < param name="classname">类名< /param>   
  40.         /// < param name="methodname">方法名< /param>   
  41.         /// < param name="args">参数< /param>   
  42.         /// < returns>< /returns>   
  43.         public static object InvokeWebService(string url, string classname, string methodname, object[] args)   
  44.         {   
  45.             string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";   
  46.             if ((classname == null) || (classname == ""))   
  47.             {   
  48.                 classname = WebServiceHelper.GetWsClassName(url);   
  49.             }   
  50.  
  51.             try   
  52.             {   
  53.                 //获取WSDL   
  54.                 WebClient wc = new WebClient();   
  55.                 Stream stream = wc.OpenRead(url + "?WSDL");   
  56.                 ServiceDescription sd = ServiceDescription.Read(stream);   
  57.                 ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();   
  58.                 sdi.AddServiceDescription(sd, """");   
  59.                 CodeNamespace cn = new CodeNamespace(@namespace);   
  60.  
  61.                 //生成客户端代理类代码   
  62.                 CodeCompileUnit ccu = new CodeCompileUnit();   
  63.                 ccu.Namespaces.Add(cn);   
  64.                 sdi.Import(cn, ccu);   
  65.                 CSharpCodeProvider icc = new CSharpCodeProvider();   
  66.  
  67.                 //设定编译参数   
  68.                 CompilerParameters cplist = new CompilerParameters();   
  69.                 cplist.GenerateExecutable = false;   
  70.                 cplist.GenerateInMemory = true;   
  71.                 cplist.ReferencedAssemblies.Add("System.dll");   
  72.                 cplist.ReferencedAssemblies.Add("System.XML.dll");   
  73.                 cplist.ReferencedAssemblies.Add("System.Web.Services.dll");   
  74.                 cplist.ReferencedAssemblies.Add("System.Data.dll");   
  75.  
  76.                 //编译代理类   
  77.                 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);   
  78.                 if (true == cr.Errors.HasErrors)   
  79.                 {   
  80.                     System.Text.StringBuilder sb = new System.Text.StringBuilder();   
  81.                     foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)   
  82.                     {   
  83.                         sb.Append(ce.ToString());   
  84.                         sb.Append(System.Environment.NewLine);   
  85.                     }   
  86.                     throw new Exception(sb.ToString());   
  87.                 }   
  88.  
  89.                 //生成代理实例,并调用方法   
  90.                 System.Reflection.Assembly assembly = cr.CompiledAssembly;   
  91.                 Type t = assembly.GetType(@namespace + "." + classname, truetrue);   
  92.                 object obj = Activator.CreateInstance(t);   
  93.                 System.Reflection.MethodInfo mi = t.GetMethod(methodname);   
  94.  
  95.                 return mi.Invoke(obj, args);   
  96.  
  97.                 /*   
  98.                 PropertyInfo propertyInfo = type.GetProperty(propertyname);   
  99.                 return propertyInfo.GetValue(obj, null);   
  100.                 */   
  101.             }   
  102.             catch (Exception ex)   
  103.             {   
  104.                 throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));   
  105.             }   
  106.         }   
  107.  
  108.         private static string GetWsClassName(string wsUrl)   
  109.         {   
  110.             string[] parts = wsUrl.Split('/');   
  111.             string[] pps = parts[parts.Length - 1].Split('.');   
  112.  
  113.             return pps[0];   
  114.         }   
  115.         #endregion   
  116.     }   

返回时如果不是字符串,即强制转换,如返回是DataSet,则

  1. string url = "http://www.webservicex.net/globalweather.asmx" ;   
  2. string[] args = new string[2] ;   
  3. args[0] = "Hangzhou";   
  4. args[1] = "China" ;   
  5. object result = WebServiceHelper.InvokeWebService(url ,"GetWeather" ,args) ;   
  6. DataSet DSRe=(DataSet)result;  

C#动态调用Web服务方法三:URL Behavior 属性

如果知道服务的方法和参数,只是调用的URL网址会随时变化,那么可以手工创建一个服务,添加上对应的的方法和传入参数,然后引入到项目中,就可以直接开发,在创建服务的实例化时,才修改对应的URL即可.

例如服务中有个方法叫GetTax,那么就可以这样改:

  1. GetTax.GetTax GetTax1 = new GetTax.GetTax();   
  2. GetTax1.Url = "http://" + WebIp1 + "/pub_wa_gspsp1/gettax.asmx";        //动态引入服务器   
  3.                    
  4. DataSet DS1 = GetTax1.GetTaxMx(Bm1, OldBz, Fpl, SLx, StaDa, EndDa);   //调用服务器返回开票数据 

转载于:https://www.cnblogs.com/gaolijun1986/archive/2011/07/29/2120644.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

合并数据 - 方法总结(concat、append、merge、join、combine_first)- Python代码

描述 分析一个业务的时候往往涉及到很多数据&#xff0c;比如企业融资信息、投资机构信息、行业标签、招聘数据、政策数据等&#xff0c;这些数据分别存储在不同的表中。通过堆叠合并和主键合并等多种合并方式&#xff0c;可以将这些表中需要的数据信息合并在一张表中供分析使…

LeetCode 592. 分数加减运算(字符串+最大公约数)

1. 题目 给定一个表示分数加减运算表达式的字符串&#xff0c;你需要返回一个字符串形式的计算结果。 这个结果应该是不可约分的分数&#xff0c;即最简分数。 如果最终结果是一个整数&#xff0c;例如 2&#xff0c;你需要将它转换成分数形式&#xff0c;其分母为 1。 所以在…

18、Linux下编程风格

在前面曾总结过微软环境下编程的规范【1】&#xff0c;但是在linux下&#xff0c;没有自动补起&#xff0c;以及没有像VS那样高级好用的可视化开发工具&#xff0c;如果变量&#xff0c;函数定义太复杂&#xff0c;敲的也累&#xff0c;下面总结linux下编程风格&#xff0c;资料…

获取数据 - 将Excel文件读入矩阵matrix中 - Python代码

机器学习中&#xff0c;很多算法的计算逻辑是基于数学的&#xff0c;免不了求特征值和特征向量这种事情&#xff0c;因此&#xff0c;在数据预处理的时候&#xff0c;将数据源中的数据转储成矩阵格式是很有必要的。 原数据&#xff1a; 代码&#xff1a; import numpy as np…

LeetCode 713. 乘积小于K的子数组(滑动窗口)

1. 题目 给定一个正整数数组 nums。 找出该数组内乘积小于 k 的连续的子数组的个数。 示例 1: 输入: nums [10,5,2,6], k 100 输出: 8 解释: 8个乘积小于100的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。 需要注意的是 [10,5,2] 并不是乘积小于…

Visual Studio 2010 调试 C 语言程序

转&#xff1a;http://woyouxian.net/c/using_visual_studio_write_pure_ansi_c_program.html 本篇文章讲述如何用微软的 Visual Studio 编写纯C语言程序&#xff0c;这里的纯C语言&#xff0c;指的是 ANSI C 语言。 要在 Visual Studio 里创建一个 ANSI C语言程序&#xff0c;…

字符串处理 - DataFrame文本数据的量化 - Python代码

在数据建模的过程中&#xff0c;对于文本数据&#xff0c;比如婚姻情况、性别、居住地等。这给只接受数值型的模型造成了很大的干扰&#xff0c;因此在数据采集到数据建模的过程中&#xff0c;我们需要一个过程&#xff0c;叫量化。 比如这样一个源数据&#xff1a; 收入身高…

Silverlight 4之旅(三)数据绑定(中)

在上篇文章中我们已经看过了绑定的基础知识&#xff0c;以及绑定数据源的选择问题。在本篇文章中我们看下绑定时Target的现实的问题。 自定义显示 很多时候我们的DataSource存储的数据并不可以直接用来显示&#xff0c;比如说我们对于Bool类型&#xff0c;需要显示为“是”或则…

LeetCode 第 28 场双周赛(505/2144,前23.6%)

文章目录1. 比赛结果2. 题目1. LeetCode 5420. 商品折扣后的最终价格 easy2. LeetCode 5422. 子矩形查询 medium3. LeetCode 5423. 找两个和为目标值且不重叠的子数组 medium4. LeetCode 5421. 安排邮筒 hard1. 比赛结果 两题选手&#x1f602;&#xff0c;前两题很水&#xf…

决策树模型 - (ID3算法、C4.5算法) - Python代码实现

目录 算法简介 信息熵(Entropy) 信息增益(Information gain) - ID3算法 信息增益率(gain ratio) - C4.5算法 源数据 代码实现 - ID3算法 代码实现 - C4.5算法 画决策树代码-treePlotter 算法简介 决策数(Decision Tree)在机器学习中也是比较常见的一种算法&#xff0c…

SGA介绍

以前一直看的马马虎虎&#xff0c;这次重新整理了下sga设置&#xff0c;组件等。当然这些涉及到了很多的参考&#xff0c;主要的参考的网址&#xff1a;http://www.hellodba.com/reader.php?ID104&langCNhttp://8xmax.blog.163.com/blog/static/1633631020084781125726/ h…

重复值处理 - 清洗 DataFrame 中的各种重复类型 - Python代码

目录 所有列是否完全重复 指定某一列是否重复 根据多列判断是否重复&#xff0c;防止误删数据 其他数据预处理方法 通过八爪鱼或者火车头等采集器从全网抓取的数据中&#xff0c;总会存在各种各样的重复数据&#xff0c;为保证数据在使用过程中的准确性&#xff0c;总要先进…

LeetCode 1480. 一维数组的动态和(前缀和)

1. 题目 给你一个数组 nums 。数组「动态和」的计算公式为&#xff1a;runningSum[i] sum(nums[0]…nums[i]) 。 请返回 nums 的动态和。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,4] 输出&#xff1a;[1,3,6,10] 解释&#xff1a;动态和计算过程为 [1, 12, 123, …

bitmap 转 drawable

BitmapDrawable drawable new BitmapDrawable(bitmap); layout.setBackgroundDrawable(drawable);转载于:https://www.cnblogs.com/sode/archive/2011/08/10/2133799.html

机器学习与建模 - 聚类、分类、回归的区别

一句话概括&#xff1a; 1. 聚类&#xff1a;无监督学习&#xff0c;学习结果将产生几个集合&#xff0c;集合中的元素彼此相似&#xff1b; 2. 分类&#xff1a;有监督学习&#xff0c;学习结果将产生几个函数&#xff0c;通过函数划分为几个集合&#xff0c;数据对象是离散…

LeetCode 1481. 不同整数的最少数目(计数+排序+贪心)

1. 题目 给你一个整数数组 arr 和一个整数 k 。现需要从数组中恰好移除 k 个元素&#xff0c;请找出移除后数组中不同整数的最少数目。 示例 1&#xff1a; 输入&#xff1a;arr [5,5,4], k 1 输出&#xff1a;1 解释&#xff1a;移除 1 个 4 &#xff0c;数组中只剩下 5 一…

Silverlight带关闭动画的内容控件,可移动的内容控件(一)

本例给大家介绍两个自定义控件&#xff0c;一个有显示和关闭两种状态&#xff0c;在状态切换时有动画效果。另外一个是可以拖动的内容控件&#xff0c;可以制作能拖动的面板。 A&#xff0e;带关闭动画的内容控件。 .xaml View Code <ResourceDictionary xmlns"htt…

模型评价 - 判断数据模型拟合效果的三种方法

数据建模的目的就是获得从自变量映射到因变量的函数&#xff0c;在建模的探索过程中&#xff0c;不同的方式总会得出不同的函数模型&#xff0c;而这些函数大多是由一些参数构成的&#xff0c;比如 y f&#xff08; x; w0, w1, w2, w3, ...&#xff09;。 平方损失函数 为了选…

Autodesk云计算系列视频 --- 云计算与Civil 3D

前面的视频介绍了云计算与AutoCAD/Revit/Inventor的结合&#xff0c;这一节是云计算与Civil 3D的结合例子&#xff1a; 演示中使用的云计算程序源代码可以从下面链接下载&#xff1a; The sample code used in the demonstration is available here. 转载于:https://www.cnblo…

模型评价 - 机器学习与建模中怎么克服过拟合问题?

上一篇博客链接&#xff1a; 机器学习与建模中 - 判断数据模型拟合效果的三种方法 在上一篇博客中&#xff0c;我们谈到了使用损失函数来判断模型的拟合效果。但是拟合效果比较好的模型不一定是最好的模型&#xff0c;建模的最终目的是为了预测&#xff0c;因此预测最精准的模…