I'm working with axis2 1.5.1, and try to use it as webservice client.
when I try to invoke a oneway webservice operation, I found if the server
return http 500, I didn't got any exception in client side.
but for other status code, like, http 404, I can get an exception.
I made some study on axis2 source code.
and found the logic in following method,
org.apache.axis2.transport.http.HTTPSender.handleResponse(MessageContext,
HttpMethodBase):
for HttpStatus.SC_INTERNAL_SERVER_ERROR || HttpStatus.SC_BAD_REQUE
if the operation is 2 way operation, set ProcessingFault to true for income
message.
but for one way operation, there is no special action, except just try to
process the response.
since 1 way operation doesn't expected a response soap message, the
response seems was discarded.
I want to know is there any special consideration for such behavior?
should't a exception be thrown out when response status code is 500 and
operation is of one way?
I inline the method I mentioned for convenient review.
in addition, I checked source of axis2 1.6, and found the behavior is as
the same.
* Used to handle the HTTP Response
*
* @param msgContext - The MessageContext of the message
* @param method - The HTTP method used
* @throws IOException - Thrown in case an exception occurs
*/
private void handleResponse(MessageContext msgContext,
HttpMethodBase method) throws IOException {
int statusCode = method.getStatusCode();
log.trace("Handling response - " + statusCode);
if (statusCode == HttpStatus.SC_OK) {
processResponse(method, msgContext);
} else if (statusCode == HttpStatus.SC_ACCEPTED) {
} else if (statusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR ||
statusCode == HttpStatus.SC_BAD_REQUEST) {
Header contenttypeHeader =
method.getResponseHeader(HTTPConstants.HEADER_CONTENT_TYPE);
String value = null;
if (contenttypeHeader != null) {
value = contenttypeHeader.getValue();
}
OperationContext opContext = msgContext.getOperationContext();
if(opContext!=null){
MessageContext inMessageContext =
opContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
if(inMessageContext!=null){
inMessageContext.setProcessingFault(true);
}
}
if (value != null) {
processResponse(method, msgContext);
}
//should't a exception be thrown out here in a else branch like
//else{
// throw new
AxisFault(Messages.getMessage("transportError", String.valueOf(statusCode),
method.getStatusText()));
//}
Object isTransportNonBlocking = msgContext.getProperty(
MessageContext.TRANSPORT_NON_BLOCKING);
if (isTransportNonBlocking != null &&
(Boolean)isTransportNonBlocking) {
throw new AxisFault(Messages.getMessage("transportError",
String.valueOf(statusCode),
method.getStatusText()));
}
} else {
throw new AxisFault(Messages.getMessage("transportError",
String.valueOf(statusCode),
method.getStatusText()));
}
}
thanks
ysliu