Andrea Smyth wrote:
If a server-side in-interceptor throws a Fault when processing the
inbound (soap) message for a oneway request, I can, using the
LoggingOutInterceptor, see that a soap fault is sent back to the client:
INFO: Outbound message: <soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>FaultThrowingInterceptor
interceptor failed to handle
message.</faultstring></soap:Fault></soap:Body></soap:Envelope>
But the client does not decode the fault and simply throws a Fault (as
opposed to a SoapFault) with code: "COULD_NOT_SEND", and message:
"Could not send Message. (and a wrapped IOException: Server returned
HTTP response code: 500 for URL: ...).
If addressing is used, and the fault throwing interceptor executes after
the logical addressing interceptor, the client does not receive a Fault
at all. The reason is that the partial response has already been sent
(from within the logical addressing interceptor), so all faults
occurring after that are practically ignored and the client has no idea
that the actual invocation on the server never occurred.
I don't believe this is correct either. At the very least it is not
consistent with the non-addressing case where the client can surround
the oneway invocation with a catch(Fault ...) clause.
BTW an example of such an interceptor would be the logical RM
interceptor, which executes after the logical addressing interceptor.
Also, I am not quite sure how to interpret the following extract from
the addressing spec:
http://www.w3.org/TR/2006/REC-ws-addr-core-20060509/#msgaddrprops
>>In a one-way interaction pattern a source sends a message to a
destination without any further definition of the interaction.
"Request-response" is a common interaction pattern that consists of an
initial message sent by a source endpoint (the request) and a subsequent
message sent from the destination of the request back to the source (the
response). A response in this case can be either an application message,
a fault, or any other message. Note, however, that reply messages may be
sent as part of other message exchanges as well, and are not restricted
to the usual single Request, single Response pattern, or to a particular
WSDL transmission primitive or MEP. The contract between the interacting
parties may specify that multiple or even a variable number of replies
be delivered.<<
I would tend to read it as: even if the operation is oneway, the
contract between the interacting parties may mandate the use of RM, and
as such require that e.g. non-existent sequence ids result in SoapFaults
with prescribed fault code. The question is: does this go as far as
mandating the sending of that fault back to the client, or is it
sufficient to log such an error on the server side?
Andrea.
If the message is twoway, the client receives a SoapFault, with
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server and the
expected reason.
Is this intended behaviour? IMO it is not correct, considering that in
the first case the correct fault code and faultstring is available it
should as well be decoded so the client gets a idea of what went wrong
on the server side. In particular, I think the soap fault should be
decoded to correctly implement fault handling in addressing and rm,
where server side interceptors may fail because of duplicate message
ids, duplicate sequence ids, etc. which can occur in the context if
both oneway and twoway requests.
Andrea.