1.   问题背景
         现在我们两套语言并行,其中必然会涉及到不同系统的相互访问。 .net 的会员信息是用 webservice  提供服务的。那如何对现有 .net webservice 不做任何改动的情况下,用 Java 的 cxf 来访问呢,公司的知识库里面也有这个技术专题,但是我们公司招投标的 .net webservice 涉及到一些比较特别的加密方式 和 特有的数据返回结构,比如加密信息是放在 SoapHeader 里面,返回的数据格式为 DataSet 。特别是 DataSet 这个是 .net 特有的,这个时候通用的方法就显得不能为力了,我们需要做点小小的改动。
         
2.  cxf 拦截器
       要处理这个问题,我们要需要回归到最初的 soap (Simple Object Access Protocol),可以理解为一份有规定格式的xml 文件。我们需要自己来处理发送和返回的 xml 文件。为了做这件事情,我们先来了解一下 cxf 的拦截器
      
 
上图显示了一个请求流程中的各个拦截点。我们使用其中的 WRITE、PRE_STREAM、RECEIVE
       
1)  WRITE 拦截器 我们增加SoapHeader认证信息
          
 
2)PRE_STREAM 拦截器 ,获取发送报文,这个拦截器可以不加,我加只是为了获取发送的报文,方便我们最后对比发送报文和返回的报文。
 
3)Receive 拦截器,获取返回的报文,这个拦截器非常重要,这里面有我们需要的全部信息。
 
      
3.  解析SOAP 报文
   这个时候我们已经完成了80% 的工作。现在我们来看一下获取的报文。重点关注一下文件的结构。
      1) 发送的报文,已经添加了认证需要的SoapHeader信息。
            
     2) 返回的报文,已经有我们需要的信息,然后当作一份 xml 文件来处理就可以了。
           
 
4.  小结
        在这个问题处理当中,我们需要注意的一点就是,不同语言对这份规定格式的 xml 文件有不同的解析,会对我们的处理造成一定的困扰。这个时候我们要不忘初心,回到最原始的起点,二进制流 、字符串、xml 文件。方得始终,需要的信息就隐藏在里面。
 
5. 小疑问
      为什么我们用的是 Write、PreStream、Receive 这三个拦截器,其他的行不行。要说明这个问题,我们就要了解每个拦截器的作用以及在流程中所处的位置。可以看一下这篇文章 https://www.cnblogs.com/luangeng/p/6602667.html,可能看完了还是有点云里雾里,那也没有关系,你可以每个拦截都去试一下,看一下获取的是什么,输出的什么,这个过程当中,可能还需要其他一些协议来帮助你理解,也许会有一些意想不到的新发现,那就边学边试吧。
 
6. 展望一下
       经过这么一番折腾,也算解决了一些问题,那么有没有一种协议、标准、设计风格可以优雅的在不同的系统中畅行呢,或许RESTful 可以试一下, REST(Representational State Transfer )这个词是Roy Thomas Fielding在他2000年的博士论文中提出的(文末有论文中文版附件),最后引用一下 Roy Thomas Fielding 博士介绍论文写作目的来结尾,原文如下: "本文研究计算机科学两大前沿,软件和网络的交叉点。长期以来,软件研究主要关注软件设计的分类、设计方法的演化,很少客观地评估不同的设计选择对系统行为的影响。而相反地,网络研究主要关注系统之间通信行为的细节、如何改进特定通信机制的表现,常常忽视了一个事实,那就是改变应用程序的互动风格比改变互动协议,对整体表现有更大的影响。我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。"
 

cxf 调用 .net webservice的更多相关文章

  1. Apache cxf暴露接口以及客户端调用之WebService初步理解

    在我们真实的项目中,经常会调用别人提供给我们的接口,或者在自己的团队中, restful风格的前后端分离也经常会提供一个后端接口暴露出去供app,或者.net/C/C++程序员去调用,此时就需要使用到 ...

  2. cxf+spring发布webservice和调用

    maven项目配置http://cxf.apache.org/docs/using-cxf-with-maven.html <properties> <cxf.version> ...

  3. cxf调用WebService

    一.用CXF调用WebService的几种方式,参考: http://cxf.apache.org/docs/how-do-i-develop-a-client.html 二.JaxWsProxyFa ...

  4. Java调用WebService方法总结(7)--CXF调用WebService

    CXF = Celtix + XFire,继承了Celtix和XFire两大开源项目的精华,是一个开源的,全功能的,容易使用的WebService框架.文中所使用到的软件版本:Java 1.8.0_1 ...

  5. Spring Boot 使用 CXF 调用 WebService 服务

    上一张我们讲到 Spring Boot 开发 WebService 服务,本章研究基于 CXF 调用 WebService.另外本来想写一篇 xfire 作为 client 端来调用 webservi ...

  6. CXF发布restful WebService的入门例子(客户端)

    上篇说了怎么用cxf发布restful webservice,由于浏览器只能对该service发送http的GET请求,所以如果想对服务器上的数据,还需要实现客户端. 客户端的实现方式有无数种...可 ...

  7. Java 使用httpclient Post与cxf 发布的Webservice通信

    使用cxf发布的webservice不知道什么情况总会有时管用有时不管用,对于项目来说这肯定不行.又不想改动webservice因为代码太多.人懒! 于是便使用httpclient与webservic ...

  8. WebService系列二:使用JDK和CXF框架开发WebService

    一.使用JDK开发WebService 服务端程序创建: 1.新建一个JDK开发webservice的服务端maven项目JDKWebServiceServer 2. 定义一个接口,使用@WebSer ...

  9. WEBSERVICE之CXF框架开发webservice

    之前学习了使用jdk开发webservice服务,现在开始学习使用框架(cxf)开发webservice. 1.准备工作 A.使用cxf开发webservice服务,需要用到apache-cxf-3. ...

随机推荐

  1. tomcat启动出现乱码

    打开tomcat目录下apache-tomcat-9.0.26\conf\logging.properties 替换全文 encoding = UTF-8 为 encoding = GBK: rest ...

  2. mysql重新设置递增值

    alter table table_name AUTO_INCREMENT=value;

  3. SQL Server 内存优化表的索引设计

    测试的版本:SQL Server 2017 内存优化表上可以创建哈希索引(Hash Index)和内存优化非聚集(NONCLUSTERED)索引,这两种类型的索引也是内存优化的,称作内存优化索引,和基 ...

  4. filebeat相关registry文件内容解析

    filebeat的registry文件中存放的是被采集的所有日志的相关信息. linux中registry中一条日志记录的内容如下 {"source":"/var/log ...

  5. 新手学习FFmpeg - 调用API完成视频的读取和输出

    在写了几个avfilter之后,原本以为对ffmpeg应该算是入门了. 结果今天想对一个视频文件进行转码操作,才发现基本的视频读取,输出都搞不定. 痛定思痛,仔细研究了一下ffmpeg提供的examp ...

  6. 接口测试时数据格式是json,如何将响应内容转换为字典解析

    import requests url = 'http://127.0.0.1:5050/index' def apiTestPost(url): datas = { 'a':'cisco3', 'b ...

  7. easyui-datetimebox 控件绑定双击事件实现自动选中当前日期时间

    本方法是在不改变原 js 的情况下,通过扩展方法来实现本目的 首先在 datetimebox 控件中扩展一个 绑定双击事件 的方法 $.extend($.fn.datetimebox.methods, ...

  8. Hbase入门(三)——数据模型

    Hbase最核心但也是最难理解的就是数据模型,由于与传统的关系型数据库不同,虽然Hbase也有表(Table),也有行(Row)和列(Column),但是与关系型数据库不同的是Hbase有一个列族(C ...

  9. Spring Data JPA 梳理 - JPA是什么

    总结: JPA是java的标准,不是Spring的标准 java标准中一般通过Meta-INF文件规范开发层面的事情,JPA也不例外,使用persistence.xml JPA定义了Entity 到 ...

  10. redis-分布式锁-消除竞争条件

    因为信号量的设计过程中,获取一个信号量需要执行多个命令组成的流水,这样容易形成竞争条件. 为了消除信号量实现中所有可能出现的竞争条件,构建一个正确的计数信号量,需要在 信号量时,添加带有短暂超时时间的 ...