Wie man JAXWS senden content-length-header von SOAP-Antworten
Im Grunde machte ich einen Webservice mit JAXWS. Es verwendet SOAP und funktioniert. Doch auf einigen Anfrage einiger Kunden Absturz/Fehler, es scheint verknüpft zu sein mit der Tatsache, die JAXWS-webservice nicht senden des content-length-header. Gibt es eine Möglichkeit, um es hinzuzufügen?
Mit: openjdk-6 (6b20)
Meine Klasse sieht wie folgt aus:
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);
}
}
}
Mittels tcpdump bestätigt, dass es keine content-length im response:
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....
Also meine Frage ist, gibt es eine Möglichkeit zu sagen, den webservice zu senden, die Inhalt-Länge zusammen mit den Antworten??? Oder eine Möglichkeit zum Anhängen, bevor die Antwort gesendet wird?
Transfer-encoding chunked
keinencontent-length
header. en.wikipedia.org/wiki/Chunked_transfer_encoding - ich vermute, dein problem liegt woanders.- Guter Punkt... die Zeit zu Graben, mehr zu finden, warum einige Anfragen scheinen nicht "abgeschlossen", obwohl alle Daten gesendet.
- Sollten Sie sich Wundern, warum der client hat ein problem. Alle HTTP/1.1-clients unterstützt werden muss-Transfer-encoding: chunked und nicht benötigen ein content-Länge zu arbeiten. Wenn der client dies nicht unterstützt, dann muss der client für die Verwendung von HTTP/1.0
- Dies ist, was ich am Ende mit auch. Scheint ein bug mit der client-Seite (php in diesem Fall). Durch einen WEITEREN bug ist, wird es ignoriert zwingen, http 1.0, wenn die wsdl-cache aktiviert ist. Ich bin Links, versucht zu deaktivieren, chunking in JAXWS... wenn jemand eine führen?
- Das setzen des content-length-header sollte den trick tun auf die Antwort. Auch Verbindung=schließen, auf entweder der client-oder response-header. Siehe w3.org/Protocols/rfc2616/rfc2616-sec14.html. Entweder Weg unten meine Antwort sollte helfen.
- Nach mehr Graben, es scheint ein Fehler zu sein mit JAXWS, siehe die Ausgabe von curl Holen die gleiche Antwort: % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Verbrachte Links Geschwindigkeit 106 4190 0 4190 0 260 25 1 --:--:-- 0:02:43 --:--:-- 0 106% ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie hinzufügen von HTTP-Headern, um die ausgehende Antwort schreiben einen handler. Ihr handler erweitern die standard - JAX-WS-handler und verwenden Sie die MessageContext in der handleMessage(C-Rahmen) - Methode zum ändern der HTTP_RESPONSE_HEADER Eigenschaft (eigentlich ein key in der map). So zum Beispiel Ihre handler werden:
Müssen Sie einen handler erstellen-chain-Datei, und fügen Sie eine Anmerkung verweist auf die Datei in Ihrem endpoint-Klasse. Die annotation @HandlerChain(file="...");
Sobald Sie dies tun, sollten Sie in der Lage sein zu ändern die HTTP-Header auf in-und outbound. HTH.
Ich hatte ein ähnliches Problem, wo ein Anbieter nicht akzeptieren würde, eine in Abschnitte aufgeteilte Nachricht... es wäre nicht die Content-length im header und wäre eigentlich chunk der Nachricht und der web-service-provider ablehnen würde meinen Ruf... Diese wurde mithilfe von JAX-WS mit Axis2 1.6 da die JAX-WS-runtime.
Ich habe versucht, fügen Sie den HTTP-Header manuell hinzufügen "Content-length", aber das würde dazu führen, dass andere Probleme. Schließlich bekam ich es zu arbeiten, indem die HTTPConstants.CHUNKED auf false, auf die SOAPMessageContext in einem Handler.
Ich darüber gebloggt, hier: http://btarlton.blogspot.com/2013/03/jax-ws-with-axis2-how-to-disable.html#!/2013/03/jax-ws-with-axis2-how-to-disable.html
Mit Axis2 als die JAX-WS-runtime, war dies die einzige Korrektur, die ich finden konnte.