Java与C#平台通信 WCF CXF SOAP.docx
《Java与C#平台通信 WCF CXF SOAP.docx》由会员分享,可在线阅读,更多相关《Java与C#平台通信 WCF CXF SOAP.docx(18页珍藏版)》请在冰豆网上搜索。
Java与C#平台通信WCFCXFSOAP
问题提出:
采用的方案:
Java和C#的互操作性,采用基于Soap的通信协议
基于C#平台的SOA框架---WCF简介
什么是WCF
根据微软官方的解释,WCF是使用托管代码建立和运行面向服务(ServiceOriented)应用程序的统一框架。
它使得开发者能够建立一个跨平台的、安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。
WCF是微软分布式应用程序开发的集大成者,它整合了.Net平台下所有的和分布式系统有关的技术,例如.NetRemoting、ASMX、WSE和MSMQ。
以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于Internet;以宿主程序而论,可以以ASP.NET,EXE,WPF,WindowsForms,NTService,COM+作为宿主(Host)。
WCF可以支持的协议包括TCP,HTTP,跨进程以及自定义,安全模式则包括SAML,Kerberos,X509,用户/密码,自定义等多种标准与模式。
WCF平台搭建
JAVA调用WCF
DynamicClientFactorydcf=DynamicClientFactory.newInstance();
org.apache.cxf.endpoint.Clientclient=
dcf.createClient("http:
//localhost:
37563/WebSite4/Service.asmx?
wsdl");
Object[]reply=client.invoke("HelloWorld",newObject[]{});
System.out.println("Serversaid:
"+reply[0].toString());
基于Java平台的SOA框架---CXF简介
详见:
http:
//cxf.apache.org/
ApacheCXF=Celtix+XFire,ApacheCXF的前身叫ApacheCeltiXfire,现在已经正式更名为ApacheCXF了,以下简称为CXF。
CXF继承了Celtix和XFire两大开源项目的精华,提供了对JAX-WS全面的支持,并且提供了多种Binding、DataBinding、Transport以及各种Format的支持,并且可以根据实际项目的需要,采用代码优先(CodeFirst)或者WSDL优先(WSDLFirst)来轻松地实现WebServices的发布和使用。
ApacheCXF是一个开源的Services框架,CXF帮助您利用Frontend编程API来构建和开发Services,像JAX-WS。
这些Services可以支持多种协议,比如:
SOAP、XML/HTTP、RESTfulHTTP或者CORBA,并且可以在多种传输协议上运行,比如:
HTTP、JMS或者JBI,CXF大大简化了Services的创建,同时它继承了XFire传统,一样可以天然地和Spring进行无缝集成。
CXF平台搭建
从cxf官方网站下载最新的发行包(当前为apache-cxf-2.2.3版本),解压目录结构如下所示:
文件目录结构及相关文件的详细说明:
bin(目录)
bin目录中是CXF框架中所提供的代码生成、校验、管理控制台工具:
JavatoWSDL:
java2wsdl
CXFManagementConsoleTool:
mc
WSDLtoJava:
wsdl2java
WSDLtoService:
wsdl2service
WSDLtoSOAP:
wsdl2soap
WSDLtoXML:
wsdl2xml
WSDLValidation:
wsdlvalidator
XSDtoWSDL:
xsd2wsdl
docs(目录)
CXF所有类(class)对应的API文档,为开发者使用CXF完成应用开发提供应有的帮助。
etc(目录)
包含一个基本的Service暴露所需要的web.xml文件,及其它的配置文件。
lib(目录)
lib目录中包含CXF及其运行时所需要的和可选的第三方支持类包(.jar文件),可以根据不同项目所需的CXF特性选择所需要的支持类包。
如果不想一一去区分的话,可以直接在Web项目中包含所有的CXF及其运行时所需要的第三方支持类包(.jar文件)即可。
其中cxf-2.0.2-incubator.jar是CXF框架的二进制包文件,包含了全部的模块(modules),cxf-manifest-incubator.jar是列表清单文件manifestjar。
以下的jar包是所有CXF项目所必需的:
cxf.jar
commons-logging.jar
geronimo-activation.jar(OrtheSunequivalent)
geronimo-annotation.jar(OrtheSunequivalent)
geronimo-javamail.jar(OrtheSunequivalent)
neethi.jar
jaxb-api.jar
jaxb-impl.jar
stax-api.jar
XmlSchema.jar
wstx-asl.jar
xml-resolver.jar
对于Java2WSDL和WSDL2Java,除了必需的之外,还需要再增加如下jar包:
jaxb-xjc.jar
veliocity.jar
velocity-dep.jar
为了支持JAX-WS,除了必需的之外,还需要再增加如下jar包:
jaxws-api.jar
saaj-api.jar
saaj-impl.jar
asm.jar(可选的,但是可以提升包装类型的性能)
为了支持XML配置,除了必需的之外,还需要再增加如下jar包:
aopalliance.jar
spring-beans.jar
spring-context.jar
spring-core.jar
spring.web.jar
为了独立的HTTP服务支持,除了必需的之外,还需要再增加如下jar包:
geronimo-servlet.jar
jetty.jar
jetty-sslengine.jar
jetty-util.jar
sl4j.jar&sl4j-jdk14.jar(可选的,但是可以提升日志logging)
为了支持Aegis,除了必需的之外,还需要再增加如下jar包:
jaxen.jar
jdom.jar
stax-utils.jar
为了支持WS-Security,除了必需的之外,还需要再增加如下jar包:
bcprov-jdk14.jar
wss4j.jar
xalan.jar
xmlsec.jar
为了支持HTTPBinding,除了必需的之外,还需要再增加如下jar包:
jra.jar
jettison.jar(仅为JSON服务所需的)
licenses(目录)
列表了引用第三方jar包的相关许可协议。
modules(目录)
modules目录中包含了CXF框架根据不同特性分开进行编译的二进制包文件。
发布基于CXF框架的Web项目时,可以选择使用该目录下的所有.jar文件,也可以选择lib目录中的cxf-2.2.3.jar文件。
samples(目录)
samples目录中包含了所有随CXF二进制包发布的示例,包含这些示例的源代码和相关Web应用配置文件,可以方便地用Ant来编译运行测试这些示例,来了解CXF的开发和使用的方法。
可以通过samples目录和它各个子目录下的README.txt的文件来详细了解示例的编译与运行的步骤。
DISCLAIMER由于仍是处于Apache孵化状态的项目,这里描述了一些说明。
LICENSE文件中包含了CXF框架的授权协议ApacheLicenseVersion2.0。
NOTICE罗列了CXF框架用到的相关第三方组件的授权协议以其它的相关信息。
README文件中包含了CXF框架本身的一些简要说明。
release_notes.txt包含了CXF发布时的一些信息,包括运行时所需要的环境,修复BUG的列表等。
CXF框架支撑环境
CXF框架是一种基于Servlet技术的SOA应用开发框架,要正常运行基于CXF应用框架开发的企业应用,除了CXF框架本身之外,还需要JDK和Servlet容器的支持。
JDK版本选择、下载和安装
CXF支持非常多的特性,其中不同的特性对JDK版本的要求有所不同,但是JDK最低的版本是需要选择JDK5或者以上版本。
。
为了运行CXF携带的samples目录下的所有示例,还需要ApacheAnt1.6.5或以上的版本。
为了使用CXF的WS-Security特性,还需要BouncyCastle,并增加到CLASSPATH中。
Servlet容器下载和安装
CXF是一种基于Servlet技术的SOA应用开发框架,需要Servlet容器的支持。
CXF支持在多种Servlet容器中运行,包括WebSphere、WebLogic、Tomcat、Jetty等。
开发环境准备
为了方便开发,采用Myeclipse作为集成开发环境,并将cxf发布包lib目录下的所有lib文件加入classpath中.
接口类创建
在项目的src目录中新建一个ws.cxf包,并在里面创建接口类ISurveyService.java,为了简单示示例起见,仅创建一个方法publicStringvote(Stringusername,intpoint);这里要注意的是在接口上用@WebService注解标明这是一个即将暴露为WebService的接口,并将里面的方法都暴露出去。
完整的接口代码清单如下:
packagews.cxf;
importjavax.jws.WebService;
@WebService
publicinterfaceISureyService{
publicStringvote(Stringname,intpoint);
}
接下来,根据接口的定义,来实现。
packagews.cxf;
importjavax.jws.WebService;
@WebService
publicclassSureyServiceimplementsISureyService{
publicStringvote(Stringname,intpoint){
System.out.println("感谢您的投票");
returnname+point;
}
}
Spring配置
在src目录中创建beanRefServer.xml文件,用来定义Spring的Bean的配置,CXF支持Spring2.0Schema标签配置方式,并且提供快捷暴露WebServices的标签。
首先,我们需要引入Spring与CXF的命名空间(namespace),如下:
//www.springframework.org/schema/beans"
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xmlns:
jaxws="http:
//cxf.apache.org/jaxws"
xsi:
schemaLocation="
http:
//www.springframework.org/schema/beans
http:
//www.springframework.org/schema/beans/spring-beans-2.0.xsd
http:
//cxf.apache.org/jaxws
http:
//cxf.apache.org/schemas/jaxws.xsd">
这样,我们可以使用Spring与CXF的标签配置了。
接着,我们需要引入我们所需要的CXF的Bean定义文件,如下:
--ImportApacheCXFBeanDefinition-->
META-INF/cxf/cxf.xml"/>
META-INF/cxf/cxf-extension-soap.xml"/>
META-INF/cxf/cxf-servlet.xml"/>
接着定义我们具体实现的Bean,这个Bean的定义与Spring普通的Bean定义是一样的:
--SurveyService-->
最后,将定义的Bean暴露出去成为WebService服务,通过CXF提供的Schema标签配置server>,这样定义的配置显得更加简洁与方便,定义如下:
--ExposeSurveyWebService-->
serverid="surveyWebService"
serviceClass="ws.cxf.ISurveyService"
address="/SurveyWebService">
serviceBean>
--要暴露的bean的引用-->
serviceBean>
server>
在配置中,serviceClass的值是接口类的名称,address为将要暴露出去的WebService访问地址。
比如:
/SurveyWebService,那么客户端消费WebService的地址就会成为http:
//host:
port/WebAPPName/SurveyWebService,与之相应的WSDL地址则为:
http:
//host:
port/WebAPPName/SurveyWebService?
wsdl。
Web应用配置
由于我们的示例是需要通过Servlet容器进行服务暴露,因此需要配置相对应的web.xml文件,首先是增加Spring的配置文件加载Listener,如下:
--SpringConfigLocation-->
contextConfigLocation
/WEB-INF/classes/beanRefServer.xml
--SpringContextLoaderListener-->
org.springframework.web.context.ContextLoaderListener
接下来配置CXFServlet的定义,以及它的映射,如下:
--ApacheCXFServlet-->
CXFServlet
CXFServlet
org.apache.cxf.transport.servlet.CXFServlet
1
--CXFServletMapping-->
CXFServlet
/*
将之映射为/*。
这样,服务端的代码与配置就全部完成了,接下来就是将应用程序部署到Web容器中去,并验证服务是否正常发布。
启动服务
这时开始启动Tomcat,在启动的过程中,可以在启动窗口上看到以链接方式部署的应用在启动中会打印出一些相关信息来,最后显示启动成功。
通过访问http:
//localhost:
8080/CXF_Spring_Survey/可以看到CXF暴露的服务链接:
图7.CXF暴露的服务链接的内容示意图
可以直接点击进去,或者手工输入WSDL的地址进行访问:
http:
//localhost:
8080/CXF_Spring_Survey/SurveyWebService?
wsdl,可以看到如下的WSDL内容:
图8.SurveyWebService的WSDL内容示意图
这样,我们可以确定我们的服务真正发布成功了,接下来就可以利用客户端进行消费了。
消费服务
回到Eclipse开发平台,开始编写消费服务相关的代码,首先通过Spring与CXF的配置来定义WebService的客户端Bean,在src目录下创建beanRefClient.xml配置文件,同样,也需要引入Spring与CXF命名空间的声明,并引入CXF的Bean的定义文件,最后通过与服务端配置相对的CXF标签client>来定义客户端访问服务的声明,完整的定义内容如下:
xmlversion="1.0"encoding="UTF-8"?
>
//www.springframework.org/schema/beans"
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xmlns:
jaxws="http:
//cxf.apache.org/jaxws"
xsi:
schemaLocation="
http:
//www.springframework.org/schema/beans
http:
//www.springframework.org/schema/beans/spring-beans-2.0.xsd
http:
//cxf.apache.org/jaxws
http:
//cxf.apache.org/schemas/jaxws.xsd">
--ImportApacheCXFBeanDefinition-->
META-INF/cxf/cxf.xml"/>
META-INF/cxf/cxf-extension-soap.xml"/>
META-INF/cxf/cxf-servlet.xml"/>
--SurveyWebServiceClient-->
clientid="surveyServiceClient"
serviceClass="ws.cxf.ISurveyService"
address="http:
//localhost:
8080/CXF_Spring_Survey/SurveyWebService"/>
定义说明:
id为Spring定义的id,用来在程序里进行获取它的标识,serviceClass仍是为服务端定义的接口类,address为完整的WebService地址,这个与服务端的定义不一样。
定义完配置文件,接下来编写访问的具体代码,在test目录下创建ws.cxf.client包,然后创建SurveyServiceClient.java,完整的代码如下:
packagews.cxf.client;
importorg.springframework.context.ApplicationContext;
importor