一、什么是WebService?

这里就不再赘述了,想要了解的====》传送门

二、为什么要动态调用WebService接口?

一般在C#开发中调用webService服务中的接口都是通过引用过来就行调用的,步骤如下:

1.找到引用,右击添加服务引用,找到高级,添加web引用,添加之后就可以直接调用里面的方法。

以上这种方法是最简单粗暴的一种方式。当然在开发中总是不那么如意,以上方式是在本机直接可以访问服务的地址,假如在本机不能直接访问WebService,那么就会有些蛋疼。

这种方式就不可取了,那么有什么方式可以不直接访问就可以开发呢?这就要使用动态调用的方式进行调用了。接下来就是如何动态调用WebService了。

三、动态调用WebService的几种方式

方式一:

随便百度一下就可以找到的一种,接下了的代码来源于百度找到的并性能进行优化升级过。

public static classCommonServiceHelper

{///

///静态缓存字典,速度提升至8倍///

private static Dictionary _webServiceConfig = new Dictionary();//获取WSDL

private static readonly WebClient wc = newWebClient();/// < summary>

///动态调用web服务///

/// < param name="url">WSDL服务地址

/// < param name="classname">类名

/// < param name="methodname">方法名

/// < param name="args">参数

/// < returns>

public static object InvokeWebService(this string url, string methodname, object[] args, string classname = "")

{string key = $"{url}_{methodname}";//缓存Key唯一标识

Type webService;if (!_webServiceConfig.ContainsKey(key))

{string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";//classname 一般自己指定 如果有些地址是http://www.webxml.com.cn/WebServices/WeatherWS?wsdl 就会调用失败

if ((classname == null) || (classname == ""))

{

classname=GetWsClassName(url);

}try{

Stream stream=wc.OpenRead(url);

ServiceDescription sd=ServiceDescription.Read(stream);

ServiceDescriptionImporter sdi= newServiceDescriptionImporter();

sdi.AddServiceDescription(sd,"", "");

CodeNamespace cn= newCodeNamespace(@namespace);

CodeCompileUnit ccu= newCodeCompileUnit();

ccu.Namespaces.Add(cn);

sdi.Import(cn, ccu);

CSharpCodeProvider icc= newCSharpCodeProvider();

CompilerParameters cplist= newCompilerParameters

{

GenerateExecutable= false,

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 compiler=icc.CompileAssemblyFromDom(cplist, ccu);

icc.Dispose();if(compiler.Errors.HasErrors)

{

System.Text.StringBuilder sb= newSystem.Text.StringBuilder();foreach (CompilerError ce incompiler.Errors)

{

sb.Append(ce.ToString());

sb.Append(Environment.NewLine);

}throw newException(sb.ToString());

}

System.Reflection.Assembly assembly=compiler.CompiledAssembly;

Type t= assembly.GetType(@namespace + "." + classname, true, true);

webService=t;

_webServiceConfig.Add(key, webService);//加入缓存

}catch(Exception ex)

{throw newException(ex.Message);

}

}else{

webService= _webServiceConfig[key] as Type;//获取缓存的数据

}if (webService != null)

{object obj =Activator.CreateInstance(webService);

System.Reflection.MethodInfo mi=webService.GetMethod(methodname);if (mi != null)

{returnmi.Invoke(obj, args);

}throw new Exception($"找不到{methodname}这个方法,调用失败");

}else{throw new Exception($"WebService 对象为空,调用失败");

}

}///

///获取wsdl类名称///

/// wsdl地址

///

private static string GetWsClassName(stringwsUrl)

{string[] parts = wsUrl.Split('/');string[] pps = parts[parts.Length - 1].Split('.');//classname 一般自己指定 原因是因为在这里

return pps[0];

}///

///清空缓存///

public static voidClearCache()

{

_webServiceConfig.Clear();

}

}

以上方法是第一种,这种方法不是万能的,因为方法是通过反射调用的,多个参数的时候顺序不能乱,方法名称不能写错,对于有些WebService是无法调用的。

方式二:

这种方式针对本机不能访问的WebService非常有效,参数啥的不容易搞混,跟C#直接添加引用之后调用方式一样。

C#添加引用的方式是通过对于WebService的xml进行解析并生成相关代码,根据原理可知,只要有WebService的xml就好办了。

然后进行访问,把页面另存为你可以找得到的地方。我这里直接存储到D盘

把这个xml文件丢到你本地随便一个可以访问的的站点下,这个xml文件要可以正常访问。(这个很重要)

接下来就要使用visual studio 开发人员命令工具,我这里是使用vs2019 ,前面几个版本的vs都可以

在开始菜单里面找到并打开

接下来使用命令生成代码。

命令如下:wsdl  你本地访问的那个xml地址全路径

我这里是放在端口81的站点下

生成的cs类文件跟通过web引用生成的cs文件是一样,这样就可以解决本机不能直接访问WebService不能调用方法的问题。

当然,想要可以执行其中的方法还需要把代码放到对应环境上才能执行。

四、总结

以上是使用两种方式动态调用WebService接口的方式,在实际开发中,遇到不能访问的,一般用第二种比较保险。

vue 调用webservice_动态调用WebService接口的几种方式相关推荐

  1. cxf调用接口的几种方式_Java调用CXF WebService接口的两种方式实例

    1.静态调用 // 创建WebService客户端代理工厂 JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); // 判断是否抛出 ...

  2. axis2 java.net.url_axis2调用.net写的webservice接口实现,指定参数名

    参考文章:https://blog.csdn.net/wangyu2016/article/details/76022928 使用axis2调用调用.net写的webservice接口时出现参数无法传 ...

  3. java使用axis调用.net发布的webservice接口返回对象类型

    本人在java中axis-1.4 调用 .net发布的webService接口 有问题欢迎各路大神讨论 !!! 1.1 基本类型 1.2 对象类型 1.3复杂对象类型(对象类中嵌套对象类) 返回基本类 ...

  4. SoapUI调用webservice接口,http+post方式模仿soapui调用webservice接口

    ` SoapUI调用webservice接口,http+post方式模仿soapui调用webservice接口 项目上调用一个第三方公司提的的webservice短信接口,使用了以下几种接口调用技术 ...

  5. SpringBoot调用.asmx后缀的webservice接口

    目录 一.简介 二.示例 一.简介 最近在项目中,在与其他公司做对接中需要回调一个对方的接口,根据对方提供的接口地址, 发现是webservice的接口,而且接口后缀名为.asmx,因为现在webse ...

  6. python rest api_Python调用REST API接口的几种方式汇总

    相信做过自动化运维的同学都用过REST API接口来完成某些动作.API是一套成熟系统所必需的接口,可以被其他系统或脚本来调用,这也是自动化运维的必修课. 本文主要介绍python中调用REST AP ...

  7. Http调用第三方接口的两种方式实例《超详细!!!》***

    Http调用第三方接口的两种方式<超详细!!!>* 最近在公司做一些调用第三方接口的工作,查阅了一部分的资料和向前辈以及朋友请教,完成了第三方接口的调用,其实主要是通过第三方提供的文档,完 ...

  8. 【转】java调用http接口的几种方式总结

    java调用http接口的几种方式总结 本文参考: https://blog.csdn.net/fightingXia/article/details/71775516 https://www.cnb ...

  9. VB静态调用与动态调用dll详解

    [[请注意]]:在以下语法格式中,请注意 [函数名] 的[大小写]!!! 静态与动态比较: 静态调用简单,动态调用麻烦:静态调用占用资源多,动态调用占用资源少:正所谓鱼和熊掌不可兼得. 静态调用定义: ...

最新文章

  1. 早上突然看明白 shader和材质球的关系
  2. Cucumber入门之_World
  3. skb详细解析【转】
  4. sqlite3打开中文路径数据文件失败解决方法
  5. Android 获取设备ID,手机厂商,运营商,联网方式,获取系统语言,获取时区
  6. 虚拟机CentOS8 网络配置
  7. 深度deepin安装apache tomcat
  8. Java(多)线程中注入Spring的Bean
  9. 如何在github上下载某个项目的单独某个目录
  10. 医学专业考计算机三级,2020年9月中国医科大学计算机等级考试报名通知
  11. 软件开发团队中,凭什么新手当道?| 畅言
  12. 第一次装TFS的曲折经历
  13. 浏览器相关功能系统调用
  14. ***编程DIY (Delphi版) - 第2篇 单实例运行
  15. 非常全面的电脑C盘清理
  16. 【解码芯片MIPI输出 四合一】XS9922B 国产 4通道模拟复合视频解码芯片 对标TP2815
  17. ai的布尔运算在哪_在AI中如何进行布尔运算
  18. Java:面向Web和移动应用的Java开发的增长
  19. 使用GI Agent(XAG)实现GoldenGate的高可用性(一)
  20. 来认识一下这些基于好友关系链和算法推荐的电影发现产品

热门文章

  1. Oracle date数据类型的字段截取年月日
  2. uniapp 顶部滑动状态栏加背景色
  3. 线性单功能PEG试剂甲氧基-聚乙二醇-丙烯酰胺,mPEG-Acrylamide,mPEG-ACA
  4. mysql 约束基本概念 主键约束 外键约束
  5. 专题三 matlab基础
  6. md语法|LaTex数学公式
  7. UE5ControlRig脚部IK匹配地面(FootIK)的简易实现
  8. java直播毕业设计,使用red5,obs,video.js仿bilibili实现一个视频直播网站
  9. win10中System占用内存、CPU过高问题的解决方法
  10. win10重装系统找不到恢复环境