Как заставить JAXWS отправлять заголовок длины содержимого в ответах SOAP

В основном я сделал веб-сервис, используя JAXWS. Он использует SOAP и работает. Однако по какому-то запросу у некоторых клиентов происходит сбой/ошибка, похоже, это связано с тем фактом, что веб-служба JAXWS не отправляет заголовок длины содержимого. Есть ли способ добавить его?

Использование: openjdk-6 (6b20)

Мой класс выглядит так:

import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.xml.ws.Endpoint;

@WebService
public class SOAP {
public static void main(String[] args) {
    try {
        SOAP server = new SOAP();
        Endpoint endpoint = Endpoint.publish('localhost:1234', server);
    } catch (Exception e) {
                Utils.getLog("SOAP").fatal("General Error", e);
    }
}
}

Использование tcpdump подтверждает, что в ответе нет длины содержимого:

0x0000:  4500 00b0 4da5 4000 4006 20d5 5cf3 1021  E...M.@.@...\..!
0x0010:  5cf3 01c7 13b2 bcea a9be 716e 14c3 16a1  \.........qn....
0x0020:  8018 006c cc70 0000 0101 080a 2e1b 3ccc  ...l.p........<.
0x0030:  2e18 23a2 4854 5450 2f31 2e31 2032 3030  ..#.HTTP/1.1.200
0x0040:  204f 4b0d 0a54 7261 6e73 6665 722d 656e  .OK..Transfer-en
0x0050:  636f 6469 6e67 3a20 6368 756e 6b65 640d  coding:.chunked.
0x0060:  0a43 6f6e 7465 6e74 2d74 7970 653a 2074  .Content-type:.t
0x0070:  6578 742f 786d 6c3b 6368 6172 7365 743d  ext/xml;charset=
0x0080:  2275 7466 2d38 220d 0a44 6174 653a 2053  "utf-8"..Date:.S
0x0090:  6174 2c20 3137 2053 6570 2032 3031 3120  at,.17.Sep.2011.
0x00a0:  3134 3a31 393a 3337 2047 4d54 0d0a 0d0a  14:19:37.GMT....

Итак, мой вопрос: есть ли способ сообщить веб-сервису, чтобы он отправил длину контента вместе с ответом? Или способ добавить его перед отправкой ответа?


person Neck    schedule 17.09.2011    source источник
comment
Transfer-encoding chunked не имеет заголовка content-length. en.wikipedia.org/wiki/Chunked_transfer_encoding — я подозреваю, что ваша проблема заключается в другом.   -  person Brian Roach    schedule 17.09.2011
comment
Хороший вопрос... Пришло время копнуть глубже, чтобы выяснить, почему некоторые запросы не выглядят полными, хотя все данные отправлены.   -  person Neck    schedule 17.09.2011
comment
Вы должны задаться вопросом, почему у клиента возникла проблема. Все клиенты HTTP/1.1 должны поддерживать Transfer-encoding: chunked и не требовать длины содержимого для работы. Если клиент не поддерживает это, то этот клиент должен использовать HTTP/1.0.   -  person Mark Rotteveel    schedule 17.09.2011
comment
На этом я тоже закончил. Похоже, это ошибка на стороне клиента (в данном случае php). Из-за ДРУГОЙ ошибки он игнорирует форсирование http 1.0, если кеш wsdl включен. Я пытаюсь отключить разбиение на фрагменты в JAXWS ... если у кого-нибудь есть зацепки?   -  person Neck    schedule 17.09.2011
comment
Установка заголовка длины содержимого должна помочь с ответом. Также соединение = закрыть либо на клиенте, либо на заголовке ответа. См. w3.org/Protocols/rfc2616/rfc2616-sec14.html. . В любом случае мой ответ ниже должен помочь.   -  person Simeon G    schedule 17.09.2011
comment
После дальнейшего копания, похоже, это ошибка JAXWS, см. вывод curl, получающий тот же ответ: % Total % Received % Xferd Average Speed ​​Time Time Time Current Dload Upload Total Spent Left Speed ​​106 4190 0 4190 0 260 25 1 - -:--:-- 0:02:43 --:--:-- 0 106% ?   -  person Neck    schedule 17.09.2011


Ответы (2)


Вы можете добавить заголовки HTTP к исходящему ответу, написав обработчик. Ваш обработчик расширит стандартный JAX-WS. обработчик и используйте MessageContext в методе handleMessage(C context), чтобы изменить свойство HTTP_RESPONSE_HEADER (фактически ключ в карте). Так, например, ваш обработчик будет:

public class MyHandler<SOAPMessageContext> implements Handler {

    public boolean handleMessage(SOAPMessageContext c) {
        if((Boolean)c.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)) {
            c.put(SOAPMessageContext.HTTP_RESPONSE_HEADERS,"your header stuff here");
            return true;
        }
    }
 }

Вам нужно будет создать файл цепочки обработчиков и добавить аннотацию, указывающую на этот файл в вашем классе конечной точки. Аннотация: @HandlerChain(file="...");

Как только вы это сделаете, вы сможете изменять заголовки HTTP для входящего и исходящего трафика. ХТН.

person Simeon G    schedule 17.09.2011

У меня была аналогичная проблема, когда провайдер не принимал разбитое на части сообщение... он также не устанавливал Content-length в заголовке и фактически разбивал сообщение, а поставщик веб-услуг отклонял мой вызов... Это использовалось JAX-WS с Axis2 1.6 в качестве среды выполнения JAX-WS.

Я попытался добавить заголовки HTTP, чтобы вручную добавить Content-length, но это вызовет другие проблемы. В конце концов я заставил его работать, установив для HTTPConstants.CHUNKED значение false в SOAPMessageContext в обработчике.

Я написал об этом в блоге: http://btarlton.blogspot.com/2013/03/jax-ws-with-axis2-how-to-disable.html#!/2013/03/jax-ws-with-axis2-how-to-disable.html

С Axis2 в качестве среды выполнения JAX-WS это было единственное исправление, которое я смог найти.

person user2161559    schedule 12.03.2013
comment
Вы должны добавить основные части вашей ссылки к этому ответу. Таким образом, если позже ваш блог выйдет из строя, ответ по-прежнему будет содержать важную информацию. - person SztupY; 12.03.2013