如何忽略(不响应)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>
我有一个 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>