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