春天的熊

Electronic approval 开发经验---webservice

场景描述:


   服务端:java+xfire-all-1.2.4

   客户端:C#    技术版本不详


需求:

        一个系统的前置,已经 Java开发完成大部分并运行了快两年了。但是一直有个功能没有实现,就是与某一银行核心业务的数据交互。基于现有的java环境和技术平台,选用xfire实现webservice服务端。之前也做个java与java的webservice实现。


   一开始做了一个java的服务端,并暴露了接口。交给c#工程师去调用。


 反馈的结果:

  1、一开始调不通,基本的连通性都不能满足,C#客户端生成代理出错。soap的版本太低等。设置xfire的service.xml文件。 

<bindings>

<soap12Binding name="tns:SubBranchWebServiceSoap12"

transport="http://www.w3.org/2003/05/soap/bindings/HTTP/"

allowUndefinedEndpoints="true">

</soap12Binding>

</bindings>

2、客户端调用提示命名空间不对。设置xfire的service.xml文件。 

  <namespace>http://xxx.com</namespace>,同时,要注意c#的实现,生成代理的时候,不要再url的后面添加"?wsdl",不然也会有问题。正确的地址应该为:http://192.168.1.111:8080/leon/services/SubBranchWebService.切记后面不要加?wsdl.

3、对于服务端返回的soap报文要扩展对soapheader的支持。客户端需要从<soap:header></soap:header>中取得报文反馈信息。

    解决方法:添加拦截器filter,修改xfire的验证机制的实现。修改service.xml文件。

   <inHandlers>

<handler handlerClass="com.cfcc.easc.common.servlet.SubBranchWebServiceImpl"/>

</inHandlers>  

<createDefaultBindings>true</createDefaultBindings>

完整的service.xml文件为:

<?xml version="1.0" encoding="UTF-8"?>

<beans>

<service xmlns="http://xfire.codehaus.org/config/1.0">

<name>SubBranchWebService</name>

<namespace>http://xxx.com</namespace>

<style>wrapped</style>

<use>literal</use>

<serviceClass>

com.cfcc.easc.common.servlet.SubBranchWebService

</serviceClass>

<implementationClass>

com.cfcc.easc.common.servlet.SubBranchWebServiceImpl

</implementationClass>

<inHandlers>

<handler handlerClass="com.cfcc.easc.common.servlet.SubBranchWebServiceImpl"/>

</inHandlers>  

<createDefaultBindings>true</createDefaultBindings>

<bindings>

<soap12Binding name="tns:SubBranchWebServiceSoap12"

transport="http://www.w3.org/2003/05/soap/bindings/HTTP/"

allowUndefinedEndpoints="true">

</soap12Binding>

</bindings>

</service>

</beans>

调用xfire暴露的webservice接口,返回的参数值默认都是放在<soap:body></soap:body>中的。并且里面还添加的一些不友好的标签。可以使用tcpTrace抓包工具抓包看看发出去的内容。

 让xfire返回的报文也支持头信息,修改拦截器是实现的核心。添加拦截器,让拦截器的定位在你暴露接口的实现类上,让该实现类 extends AbstractHandler 。并且add和修改invoke(MessageContext context)方法。


  

实现类:

import java.io.BufferedInputStream;

import java.io.ByteArrayInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.net.MalformedURLException;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.wsdl.extensions.soap.SOAPHeader;


import org.apache.commons.lang.RandomStringUtils;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.apache.xml.security.exceptions.Base64DecodingException;

import org.apache.xml.security.utils.Base64;

import org.codehaus.xfire.MessageContext;

import org.codehaus.xfire.XFireFactory;

import org.codehaus.xfire.client.XFireProxyFactory;

import org.codehaus.xfire.handler.AbstractHandler;

import org.codehaus.xfire.service.Service;

import org.codehaus.xfire.service.binding.ObjectServiceFactory;

import org.codehaus.xfire.service.invoker.AbstractInvoker;

import org.codehaus.xfire.transport.http.XFireServletController;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.Namespace;

import org.dom4j.QName;

import org.dom4j.io.SAXReader;

import org.jdom.Attribute;


import com.cfcc.easc.common.model.AccTmpCheckedEntDepositorInfo;

import com.cfcc.easc.common.model.AccTmpCheckedTradeInfo;

import com.cfcc.easc.subsystem.transferservice.service.IBatchSearchResultService;

import com.cfcc.fire.common.config.GlobalConfig;

import com.cfcc.fire.common.exceptions.FireServiceException;

import com.cfcc.fire.common.util.DateUtil;

import com.cfcc.jaf.core.loader.ContextFactory;


/**

 * IGetCentreInfoService实现类--业务逻辑

 * 

 * @author  leon

 * 

 */

public class SubBranchWebServiceImpl extends AbstractHandler implements

SubBranchWebService {

private static final Log log = LogFactory.getLog(SubBranchWebServiceImpl.class);

private int isok;


private static MessageContext mc;



public SubBranchWebServiceImpl() {


}



/**

*客户端调用的唯一入口

*/

public byte[] InvokeSOPTrans(byte[] inContent) {


System.out.println("接收到>>>>>>InvokeSOPTrans" + inContent);

/* 文件落地路径和名称 */

/* 解析报文 */

/* 文件落地 */

/* 创建应答消息 */

//设置头信息

setHeader();

String invokeResult="1234567890";

return invokeResult.getBytes();


}


/**

*修改的invoke方法,获得messagecontext实例,并复制给一个静态的mc.以备后用。

*/

public void invoke(MessageContext context) throws Exception {


// populateDto(mc,context);

mc = new MessageContext();

mc.setBinding(context.getBinding());

mc.setClient(context.getClient());

mc.setCurrentMessage(context.getCurrentMessage());

mc.setCurrentPipeline(context.getCurrentPipeline());

mc.setExchange(context.getExchange());

mc.setFaultHandler(context.getFaultHandler());

mc.setId(context.getId());

mc.setInPipeline(context.getInPipeline());

mc.setOutPipeline(context.getOutPipeline());

mc.setService(context.getService());

mc.setSession(context.getSession());

mc.setXFire(context.getXFire());


}


public void setHeader() {

org.jdom.Element header = new org.jdom.Element("Header");

final org.jdom.Namespace ns = org.jdom.Namespace.getNamespace("soap",

"http://spdb.com");

org.jdom.Element el = new org.jdom.Element("header", ns);


org.jdom.Element auth = new org.jdom.Element("InvokeResult",

"http://spdb.com");


org.jdom.Element username_el = new org.jdom.Element("ResultStatus");

username_el.addContent("000" + new String().valueOf(isok));

org.jdom.Element password_el = new org.jdom.Element("ResultRemark");


password_el.addContent("3");

auth.addContent(username_el);

auth.addContent(password_el);

el.addContent(auth);

mc.getOutMessage().setHeader(el);


log.info("ClientAuthHandler done!");

}



}


                                                                                       -------------------------Leon

   
评论
热度(2)
  1. 小城,风带香春天的熊 转载了此文字
坚信上帝的延迟,并不是上帝的拒绝。

那些还没有到来的,总会在找寻和尝试中来到。

Here,成长的角落。

Q_Q:317886534