vue 调用webservice_动态调用WebService接口的几种方式
一、什么是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接口的几种方式相关推荐
- cxf调用接口的几种方式_Java调用CXF WebService接口的两种方式实例
1.静态调用 // 创建WebService客户端代理工厂 JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); // 判断是否抛出 ...
- axis2 java.net.url_axis2调用.net写的webservice接口实现,指定参数名
参考文章:https://blog.csdn.net/wangyu2016/article/details/76022928 使用axis2调用调用.net写的webservice接口时出现参数无法传 ...
- java使用axis调用.net发布的webservice接口返回对象类型
本人在java中axis-1.4 调用 .net发布的webService接口 有问题欢迎各路大神讨论 !!! 1.1 基本类型 1.2 对象类型 1.3复杂对象类型(对象类中嵌套对象类) 返回基本类 ...
- SoapUI调用webservice接口,http+post方式模仿soapui调用webservice接口
` SoapUI调用webservice接口,http+post方式模仿soapui调用webservice接口 项目上调用一个第三方公司提的的webservice短信接口,使用了以下几种接口调用技术 ...
- SpringBoot调用.asmx后缀的webservice接口
目录 一.简介 二.示例 一.简介 最近在项目中,在与其他公司做对接中需要回调一个对方的接口,根据对方提供的接口地址, 发现是webservice的接口,而且接口后缀名为.asmx,因为现在webse ...
- python rest api_Python调用REST API接口的几种方式汇总
相信做过自动化运维的同学都用过REST API接口来完成某些动作.API是一套成熟系统所必需的接口,可以被其他系统或脚本来调用,这也是自动化运维的必修课. 本文主要介绍python中调用REST AP ...
- Http调用第三方接口的两种方式实例《超详细!!!》***
Http调用第三方接口的两种方式<超详细!!!>* 最近在公司做一些调用第三方接口的工作,查阅了一部分的资料和向前辈以及朋友请教,完成了第三方接口的调用,其实主要是通过第三方提供的文档,完 ...
- 【转】java调用http接口的几种方式总结
java调用http接口的几种方式总结 本文参考: https://blog.csdn.net/fightingXia/article/details/71775516 https://www.cnb ...
- VB静态调用与动态调用dll详解
[[请注意]]:在以下语法格式中,请注意 [函数名] 的[大小写]!!! 静态与动态比较: 静态调用简单,动态调用麻烦:静态调用占用资源多,动态调用占用资源少:正所谓鱼和熊掌不可兼得. 静态调用定义: ...
最新文章
- 早上突然看明白 shader和材质球的关系
- Cucumber入门之_World
- skb详细解析【转】
- sqlite3打开中文路径数据文件失败解决方法
- Android 获取设备ID,手机厂商,运营商,联网方式,获取系统语言,获取时区
- 虚拟机CentOS8 网络配置
- 深度deepin安装apache tomcat
- Java(多)线程中注入Spring的Bean
- 如何在github上下载某个项目的单独某个目录
- 医学专业考计算机三级,2020年9月中国医科大学计算机等级考试报名通知
- 软件开发团队中,凭什么新手当道?| 畅言
- 第一次装TFS的曲折经历
- 浏览器相关功能系统调用
- ***编程DIY (Delphi版) - 第2篇 单实例运行
- 非常全面的电脑C盘清理
- 【解码芯片MIPI输出 四合一】XS9922B 国产 4通道模拟复合视频解码芯片 对标TP2815
- ai的布尔运算在哪_在AI中如何进行布尔运算
- Java:面向Web和移动应用的Java开发的增长
- 使用GI Agent(XAG)实现GoldenGate的高可用性(一)
- 来认识一下这些基于好友关系链和算法推荐的电影发现产品