1

我对 Web 服务非常陌生。

我有一个 Web 服务公开,所以客户端正在使用它,但由于服务的重要性,我们希望记录 SOAP 请求和 SOAP 响应流入和流出。

我正在使用 Axis2-1.6.2 这是我到目前为止所尝试的,我编写了一个自定义处理程序和模块类

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.engine.Handler;
import org.apache.axis2.handlers.AbstractHandler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class LogHandler extends AbstractHandler implements Handler {
    private static final Log log = LogFactory.getLog(LogHandler.class);
    private String name;

    public String getName() {
        System.out.println("LogHandler.getName()");
        return name;
    }

    public InvocationResponse invoke(MessageContext msgContext) throws AxisFault {
        log.info(msgContext.getEnvelope().toString());
        System.out.println("LogHandler.invoke()");
        return InvocationResponse.CONTINUE;        
    }

    public void revoke(MessageContext msgContext) {
        System.out.println("LogHandler.revoke()");
        log.info(msgContext.getEnvelope().toString());
    }

    public void setName(String name) {
        System.out.println("LogHandler.setName()");
        this.name = name;
    }
}

我还为上面的 Handler 写了 Module

public class LoggingModule implements Module {
   //implemented methods
}

从上面的处理程序,我能够记录传入的 SOAP 请求和传出的 SOAP 响应。

但问题是,我一次收到很多请求,所以如果我写的是普通请求和响应,那么在查看日志时我无法确定谁的响应是这个。

它写的一般日志

Request1 SOAP 
Request2 SOAP 
Response1 SOAP
Request3 SOAP
Request4 SOAP
Response2 SOAP

invoke(MessageContext msgContext)当请求进来和响应出去时,这个方法被调用。有什么我可以在调用响应时间时获取请求 SOAP。

所以,我想要一些解决方案,我可以在响应 SOAP 中合并请求 SOAP,所以 1 日志是完整的请求响应。

如果任何机构可以提出一些好的解决方案,那将是有帮助的。

4

1 回答 1

1

您正在获取请求并记录响应,因为您在两个 IN/OUT 流程中都注册了您的处理程序..

比如说,如果您在流出时注册您的处理程序,您将能够选择您的相关请求和响应。也就是说,从响应消息上下文中,您可以访问您的请求消息上下文。从中,您可以阅读您的请求消息。[1]

但是在这里您会看到一个问题,如果您的请求失败,您将无法在流出中捕获它。该日志可能会丢失。

[1] http://vvratha.blogspot.com/2013/05/accessing-request-messagecontext-from.html

于 2013-10-25T07:40:40.203 回答