当前位置: 首页 > 编程日记 > 正文

.NET调用JAVA的WebService方法

  调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,在网上也有相关资料,但是都整理的不够清晰明了。根据网上的资料,个人也对各种方法进行了尝试,费了不少精力,为此特将自己的解决方法进行总结一下,以备以后需要以及相关朋友参考。

先说说的思路:

1、先用soapUI进行测试,这个工具会自动生成调用某个方法的XML。

2、把soapUI生成的XML作为模版,自己也生成一个一模一样的XML并为参数节点赋好值。

3、将这个XML通过http直接发送给WebService。

4、接收返回的XML进行处理。

这样做最大的好处就是可以自己很轻松的控制XML格式,最开始的时候我是通过添加引用的方式去调用某个方法一直失败,但是用soapUI去测试这个方法又是可以成功调用的,折腾了半天,最后通过抓包的方式对发送的数据进行对比,发现两者发送的XML相差甚远,好了废话不说了,就拿一个小实例来演示这个过程吧。

首先,通过soapUI工具测试调用WebService里公用的WebSercie(http://www.webxml.com.cn/WebServices/WeatherWebService.asmx)中的一个名为getSupportCity的方法,生成的XML如下:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://WebXml.com.cn/"><soapenv:Header/><soapenv:Body><web:getSupportCity><!--Optional:--><web:byProvinceName>北京</web:byProvinceName></web:getSupportCity></soapenv:Body>
</soapenv:Envelope>

上面加粗标示的地方就是我们要修改赋值的地方,大家看到了吧,如果用添加引用自动生成代理类的方式,要产生这样格式的XML有多难控制了吧,但是如果全部用代码来生成也不是一件容易的事,个人用了一个比较巧妙的办法:

在项目中添加一个名为“getSupportCity”的xml文件,将上面的XML粘贴上去,然后再将这个XML文件作为内嵌资源(在这个的文件属性里面的‘生产操作’选择‘嵌入的资源’),使用的时候直接加载这个XML文件,然后按逻辑处理需要修改的地方(其实就是XML文档操作)。使用内嵌资源是为了不让外面看到我们的那个XML文件,以防被修改了什么的。

下面看看调用的代码实现吧:(为了理解方便清晰,我们用跟WebService上一模一样的方法名和参数)

   /// <summary>/// 天气预报/// </summary>/// <param name="id">居民id</param>public static void getPopCheckedInfo(){String ServerUrl = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";//得到WebServer地址Hashtable pars = new Hashtable();//用来存放参数pars["byProvinceName"] = "北京";XmlDocument xml = QuerySoapWebService(ServerUrl, "getSupportCity", pars);//这个是对返回的XML文件处理,我删掉了,处理完后返回一个居民的实体对象          }

 WebSvcCaller.QuerySoapWebService方法代码:

  public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars){HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);request.Method = "POST";request.Accept = @"gzip,deflate";request.ContentType = @"text/xml;charset=utf-8";request.UserAgent = @"Jakarta Commons-HttpClient/3.1";request.Credentials = CredentialCache.DefaultCredentials;request.Timeout = 10000;byte[] data = EncodeParsToSoap(Pars, MethodName);WriteRequestData(request, data);//将处理成字节组的XML写到流中发送到服务端XmlDocument doc = new XmlDocument();doc = ReadXmlResponse(request.GetResponse());//读取服务端返回的结果return doc;}

EncodeParsToSoap(Pars, MethodName),处理XML文件方法的代码:(以下仅供参考,大家根据自己的实际情况变动)

 private static Hashtable hshtableXML = new Hashtable();/// <summary>/// 处理要发送的XML文档/// </summary>/// <param name="Pars">参数</param>/// <param name="MethodName">方法名</param>private static byte[] EncodeParsToSoap(Hashtable Pars, String MethodName){XmlDocument xml = null;if (hshtableXML.ContainsKey(MethodName)){//如果已经加载过,则从缓存中读取xml = (XmlDocument)hshtableXML[MethodName];}else{//如果还未加载则进行加载,并放入缓存//从资源文件得到文件流Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("异步调用.file." + MethodName + ".xml");xml = new XmlDocument();xml.Load(stream);hshtableXML.Add(MethodName, xml);}//修改参数的值foreach (DictionaryEntry de in Pars){XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);nsmgr.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");nsmgr.AddNamespace("web", "http://WebXml.com.cn/");Hashtable subpars = de.Value as Hashtable;if (subpars == null){string subNode = "soapenv:Envelope/soapenv:Body/web:" + MethodName + "/web:" + de.Key.ToString();XmlNode node = xml.SelectSingleNode(subNode, nsmgr);node.InnerText = de.Value.ToString();}else{foreach (DictionaryEntry subde in subpars){string subNode = "soapenv:Envelope/soapenv:Body/ws:" + MethodName + "/" + de.Key.ToString() + "/" + subde.Key.ToString();XmlNode node = xml.SelectSingleNode(subNode, nsmgr);node.InnerText = subde.Value.ToString();}}}//将修改后的XML文件保存到流中//这样做还可以保证发送的XML文件也是格式化的那种形式,而不是一整行//如通过OuterXml获取的就是一整行,这样也可能会导致服务端解析失败,个人这次就碰到这种情况了MemoryStream outStream = new MemoryStream();xml.Save(outStream);byte[] buffer = new byte[outStream.Length];byte[] temp = outStream.GetBuffer();for (int i = 0; i < buffer.Length; i++){buffer[i] = temp[i];}outStream.Close();return buffer;}

最后还有WriteRequestData、ReadXmlResponse两个方法的代码:

  /// <summary>/// 写到流中,发送给服务端/// </summary>/// <param name="request">HttpWebRequest连接对象</param>/// <param name="data">要写入连接流发给服务端的内容</param>private static void WriteRequestData(HttpWebRequest request, byte[] data){request.ContentLength = data.Length;Stream writer = request.GetRequestStream();writer.Write(data, 0, data.Length);writer.Close();}/// <summary>/// 读取服务端返回的结果/// </summary>private static XmlDocument ReadXmlResponse(WebResponse response){StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);String retXml = sr.ReadToEnd();sr.Close();XmlDocument doc = new XmlDocument();doc.LoadXml(retXml);return doc;}

注:在实际开发过程中,如果服务器不是标准的WebService,那么返回的数据格式不一定是XML,可能是很难解析的字符串,

出现这种情况解决办法,

第一,让服务器修改接口,返回标准XML格式;

第二:按字符串硬处理

示例下载

参考文档

http://www.cnblogs.com/fengyao/archive/2010/06/14/1749383.html

转载于:https://www.cnblogs.com/yxhblog/p/7207440.html

相关文章:

适合初学者的数据结构_数据结构101:图-初学者的直观介绍

适合初学者的数据结构了解您每天使用的数据结构 (Get to know the data structures that you use every day) Welcome! Let’s Start with Some Vital Context. Let me ask you something:✅ Do you use Google Search? ✅ Do you use Google Maps? ✅ Do you use social med…

深入解析CSS样式层叠权重值

本文为转载内容&#xff0c;源地址&#xff1a;http://www.ofcss.com/2011/05/26/css-cascade-specificity.html 读到《重新认识CSS的权重》这篇&#xff0c;在文章最后给出了便于记忆的顺序&#xff1a; “important > 内联 > ID > 类 > 标签 | 伪类 | 属性选择 &…

VUE做一个公共的提示组件,显示两秒自动隐藏,显示的值父组件传递给子组件

需求&#xff1a;VUE做一个公共的提示组件&#xff0c;显示两秒自动隐藏&#xff0c;显示的值由父组件动态传给子组件。 效果图&#xff1a; 实现步骤&#xff1a; 1.创建一个子组件 Toptips.vue (它就是公共提示组件)&#xff0c; optips.vue代码如下&#xff1a; <temp…

Linux课堂随笔---第四天

用户账户简介 在Linux系统中有三大类用户&#xff0c;分别是root用户&#xff0c;系统用户和普通用户。 在Linux系统中&#xff0c;root用户UID为0&#xff0c;root用户的权限是最高的&#xff0c;普通用户无法执行的操作&#xff0c;root用户都能完成。所以也被称为超级用户。…

初级开发人员的缺点_作为一名初级开发人员,我如何努力克服自己的挣扎

初级开发人员的缺点by Syeda Aimen Batool通过Syeda Aimen Batool 作为一名初级开发人员&#xff0c;我如何努力克服自己的挣扎 (How I’m working to overcome my struggles as a junior developer) I believe the other name for coding is the “struggle”. And if you ar…

lintcode-136-分割回文串

136-分割回文串 给定一个字符串s&#xff0c;将s分割成一些子串&#xff0c;使每个子串都是回文串。 返回s所有可能的回文串分割方案。 样例 给出 s "aab"&#xff0c;返回 [ ["aa", "b"], ["a", "a", "b"] ] 标…

微信小程序把繁琐的判断用Js简单的解决

场景&#xff1a; 订单列表&#xff0c;有很多种订单状态&#xff0c;根据不同的订单状态要显示不同的css。 适用场景&#xff1a;需要根据数组下标判断不同的显示。 示例代码&#xff1a; this.data.order [{"_type":"1","custName":"…

数论(Lucas定理) HDOJ 4349 Xiao Ming's Hope

题目传送门 题意&#xff1a;求C (n,0),C (n,1),C (n,2)...C (n,n)中奇数的个数 分析&#xff1a;Lucas 定理&#xff1a;A、B是非负整数&#xff0c;p是质数。AB写成p进制&#xff1a;Aa[n]a[n-1]...a[0]&#xff0c;Bb[n]b[n-1]...b[0]。则组合数C(A,B)与C(a[n],b[n])*C(a[n-…

docker容器虚拟化技术_Docker,虚拟机和容器的全面介绍

docker容器虚拟化技术by shota jolbordi通过Shota Jolbordi Docker has been a buzzword for tech people for the last several years, and the more times goes by, the more often you hear about it. We’re seeing it more in job requirements, and more companies are …

IOS中的响应者链

响应者链就是当子视图不响应,父视图有响应事件,父视图响应 #import "RootViewController.h" #import "ResponderView.h" interface RootViewController ()endimplementation RootViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additi…

MySQL闪退问题的解决

刚刚学习了数据库&#xff0c;并且安装了MySQL&#xff0c;正当高兴之余&#xff0c;发现我的MySQL出现了闪退的显现。上网搜了好久的解决方案。最后解决了这个问题&#xff0c;也舒心了。 问题从这里开始&#xff1a; 接着我打开MySQL&#xff0c;寻思能不能用&#xff0c;结果…

HTML封装AJAX请求,在请求里面写登录的逻辑 ajax 网络请求 post

调用方法&#xff1a; 先引用config.js&#xff0c;然后调用封装网络请求。 里面三个参数 1.url&#xff0c; 2.请求需要提交的数据, 3.请求类型 // 获取二维码、背景图片接口 getScheduleInfo() {var url /v1/basketball/getQRCode.do;var params {phone: 13977284414}co…

oye pandora_我尝试了Pandora出色的功能优先级排序方法。 这是我学到的。

oye pandoraby Josh Temple通过乔什坦普尔 我尝试了Pandora出色的功能优先级排序方法。 这是我学到的。 (I tried Pandora’s brilliant method for feature prioritization. Here’s what I learned.) 潘多拉(Pandora)的方法和3美元的便签纸如何使利益相关者的管理变得轻而易…

2016-2017-2软件工程课程总结

2016-2017-2软件工程课程总结 本学期的软件工程课程终于在大家的共同努力下圆满落幕了&#xff0c;我们的暑假也正式开启&#xff0c;终于有时间写写这门课的总结了。 在2016年下半学期末的时候课程组就决定使用邹欣老师的书《构建之法》&#xff0c;由课程组长王瑞老师带领入构…

asp.net mvc jqgrid 同一个页面查询不同的表,jqgrid显示不同表的表头和数据并且分页...

基于我上一篇文章<a href"http://www.cnblogs.com/alasai/p/4765756.html">asp.net mvc excel导入</a>中不同的部门上传不同的excel文件类型&#xff0c;当在同一个页面查询时怎么办呢。 解决方案&#xff1a;根据传过来的表名和时间参数一次性把数据全部…

降维后的高维特征的参数_高维超参数调整简介

降维后的高维特征的参数by Thalles Silva由Thalles Silva 高维超参数调整简介 (An introduction to high-dimensional hyper-parameter tuning) 优化ML模型的最佳做法 (Best practices for optimizing ML models) If you ever struggled with tuning Machine Learning (ML) mo…

细细品味大数据--初识hadoop

初识hadoop 前言 之前在学校的时候一直就想学习大数据方面的技术&#xff0c;包括hadoop和机器学习啊什么的&#xff0c;但是归根结底就是因为自己太懒了&#xff0c;导致没有坚持多长时间&#xff0c;加上一直为offer做准备&#xff0c;所以当时重心放在C上面了&#xff08;虽…

js中Array数组中的常用方法汇总

Array的push与unshift方法性能比较分析从原理就可以知道&#xff0c;unshift的效率是较低的。原因是&#xff0c;它每添加一个元素&#xff0c;都要把现有元素往下移一个位置。unshift比push要慢差不多100倍&#xff01;Array有一个叫做reverse的方法&#xff0c;能够把一个数组…

vue写一个通用的toast弹窗 toast 弹窗 提示

效果图 代码 <!DOCTYPE html> <html lang"en"><head><title>弹窗</title><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0, user-scalableno, minimum-s…

我对Node.js Core的首次贡献中学到了什么

by Yael Hermon通过Yael Hermon 我对Node.js Core的首次贡献中学到了什么 (What I Learned from My First Contribution To Node.js Core) A couple of weeks ago my very first PR for Node.js core was merged! A few days later, I decided to tweet about it and share ho…

SHA204A加密芯片配置

1、参考配置文章&#xff1a;http://blog.csdn.net/a5882230/article/details/522148452、可以选slot configuration 1作为密钥区&#xff0c;该区的配置应为&#xff1a;0x81 81&#xff0c;对应的data 0的数据就密钥数据。3、slot configuration的配置有7个参数&#xff0c;其…

[剑指offer] 二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列 P157 题目&#xff1a;输入一个数组&#xff0c;判断这个数组是不是一个二叉搜索树的后序遍历的结果。 solution&#xff1a;我们知道后序遍历序列的最后一个item是根节点&#xff0c;如果确实是二叉搜索树的后序遍历结果&#xff0c;那么在[0,N-2]中…

HbuilderX中的git的使用 git HbuilderXgit HbuilderX 使用git

【前戏】&#xff1a;得在HubilderX中找到 "工具"->"插件安装" -> "Git插件" 。 【提交代码】&#xff1a;&#xff08;1&#xff09;选中该项目的文件&#xff0c;右键&#xff0c;Git提交 &#xff08;2&#xff09;填写提交信息、查看…

Swift与Objective-C:与恐龙有关的趋势

by Colin Smith通过科林史密斯 Swift与Objective-C&#xff1a;与恐龙有关的趋势 (Swift vs. Objective-C: The trending up-and-comer vs. the dinosaur) Swift的简短历史 (A short history of Swift) I remember how pivotal it was when Swift was introduced at Apple’s …

我的JavaScript学习笔记

1. 那些老旧的实例可能会在 <script> 标签中使用 type"text/javascript"。现在已经不必这样做了。JavaScript 是所有现代浏览器以及 HTML5 中的默认脚本语言。 2. <head> 或 <body> 中的 JavaScript 您可以在 HTML 文档中放入不限数量的脚本。 …

获取枚举值上的Description特性说明

/// <summary> /// 获取枚举值上的Description特性说明 /// </summary> /// <typeparam name"T">枚举类型</typeparam> /// <param name"obj">枚举值</param> /// <returns></returns> public static str…

微信小程序实时获取用户经纬度

注意&#xff0c;使用这个功能之前手机得先打开位置信息。 现在app.json配置 {"pages": ["pages/map/map","pages/index/index","pages/register/register","pages/logs/logs"],"window": {"backgroundTex…

pwa js_如何在互联网信息亭中实现PWA和Barba.js

pwa jsby Nino Mihovilić由NinoMihovilić 如何在互联网信息亭中实现PWA和Barba.js (How to Implement a PWA and Barba.js into internet kiosks) The project we’ll describe here is an interactive internet kiosk that’s used as an extension for the LikeUs mobile …

Vant 组件库(VUE)的使用 Vant滚动选择器 选择器 传值

在 vue- cli 项目中安装 官方文档链接 npm ( 后面内容需要在控制台终端输入) # 通过 npm 安装 npm i vant -S 自动按需引入组件&#xff1a;babel-plugin-import 是一款 babel 插件&#xff0c;它会在编译过程中将 import 的写法自动转换为按需引入的方式 # 安装插件 npm…

MySQL的安装过程

&#xfeff;&#xfeff;近期对MySQL做了一些研究。曾经主要接触的是SQL SERVER。所以&#xff0c;今天对该安装过程做了一些总结以及使用过程中的一些心得。并分享给大家。记得前面。分享过一篇关于数据库的几种连接方式。而本系列文章。将以对数据库的详细操作为主。 MySQL是…