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

How do I ignore (not respond) to a Web Service request?

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

我现在可以检测到我们何时处理重复项,但我想探索完全不响应消息并关闭 HTTP 连接的可能性。

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

我认为这种行为实际上不受支持,因为它(在我看来)违反了 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 网络服务实现试过了,它导致了你想要的行为。我不知道这是否也适用于 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>