如何忽略(不响应)Web服务请求?

时间:2017-02-17 18:51:17

标签: java web-services websphere-8

我有一个接收重复SOAP消息的Web服务(Java / WebSphere 8.0),我正在探索从Web服务的角度处理这些重复消息的各种方法。

我正处于可以检测到何时处理重复内容的位置,但我想探索根本不响应消息并关闭HTTP连接的可能性。

是否可以让的Web服务响应并在检测到重复时关闭连接?或者这在Web服务应用程序的上下文中是不可能的?

1 个答案:

答案 0 :(得分:2)

我不认为这种行为是真正支持的,因为它(在我看来)违反了SOAP协议。处理此问题的标准方法是为您的用例发送SOAP错误。

如果SOAP错误确实没有选项,您可能会尝试使用无效的SOAP响应欺骗应用程序服务器。

==这里是龙! ==

你可以,例如尝试添加一个SOAPHandler(为了简洁起见,我假设你知道这个概念以及如何实现它),它构造了一个无效的SOAP响应:

public class DuplicateDetectingSOAPHandler implements SOAPHandler<SOAPMessageContext> {

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        if (isDuplicate(context)) {
            MessageFactory messageFactory;
                try {
                    messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
                    SOAPMessage message = messageFactory.createMessage();
                    // detaching the SOAPBody violates api and causes an error
                    message.getSOAPBody().detachNode();
                    context.setMessage(message);
                } catch (SOAPException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            return false;
        }
        return true;
    }

    private boolean isDuplicate(SOAPMessageContext context) {
        // determine if message is duplicate
    }

我用标准的JDK webservice实现尝试了这个,它引起了你想要的行为。我不知道这是否适用于WebSphere。请记住,这会在Web服务实现本身中触发某种错误,并可能导致其他副作用。

要明确:我认为你根本不应该实现这种行为并寻找不同的解决方案。

也许空的SOAP响应也满足您的需求:

SOAPMessage message = messageFactory.createMessage();
context.setMessage(message);

这会产生一个空的SOAP响应:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
   <env:Header/>
   <env:Body/>
</env:Envelope>