Java: есть ли способ изменить полученные заголовки ответа HTTP? - PullRequest
6 голосов
/ 13 апреля 2011

Я использую сгенерированный JAX-WS клиент (использующий wsimport, входящий в комплект Glassfish 2.1.1) для подключения к сгенерированному ASP.NET WebService, работающему в IIS 6.
Когда я запрашиваю сжатие вответ (включая HTTP-заголовок Accept-Encoding: gzip через обработчики SOAP JAX-WS ) IIS 6 отвечает сжатым ответом, но не включает Content-Кодировка: gzip HTTP-заголовок ответа, поэтому я получаю следующее исключение:

com.sun.xml.ws.protocol.soap.MessageCreationException: Couldn't create SOAP message due to exception: XML reader error: com.sun.xml.stream.XMLStreamException2: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
at com.sun.xml.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:361) at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:173)
at com.sun.xml.xwss.XWSSClientPipe.process(XWSSClientPipe.java:160)
at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:115)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:595)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:554)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:539)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:436)
at com.sun.xml.ws.client.Stub.process(Stub.java:248)
at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:135)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:109)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:89)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:118)

Отредактировано 17 апреля 2011

Я такжепопытался, используя тот же SOAPHandler, который я использую для запроса сжатого ответа, изменить заголовки ответа, но перед вызовом обработчика возникает исключение.

Окончание редактирования 17 апреля 2011 г.

Кроме того, когда я делаю тот же запрос к WebService через soapUI 3.6.1 с предпочтением «Принимать сжатые ответы от хостов», я вижу то, что я сказал: сервер IIS 6 не включаетHTTP-ответ Header для сжатия, и soapUI показывает ответ в виде «двоичных данных» и показывает следующие заголовки ответа:

HTTP/1.1 200 OK
Date: Wed, 13 Apr 2011 08:50:55 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Content-Length: 1104

Если -with soapUI- я не запрашиваю сжатый ответ, я получаю следующий размер ответа:

Content-Length: 2665

Итак, вопрос, как я уже сказал, заключается в том, что IIS6 не добавляет заголовок Contend-Encoding в ответе.Мой вопрос: возможно ли программно добавить заголовок Content-Encoding?Или это также может быть: Можно ли попросить IIS6 включить заголовок Content-Encoding?

UPDATE
Использование Charles Web Debugging Proxy 3.5.2 Я подтвердилОтвет от IIS6 не включает заголовок Content-Encoding :

HTTP/1.1 200 OK
Date    Wed, 13 Apr 2011 10:51:53 GMT
Server  Microsoft-IIS/6.0
X-Powered-By    ASP.NET
X-AspNet-Version    2.0.50727
Cache-Control   private, max-age=0
Content-Type    text/xml; charset=utf-8
Content-Length  1110

Я предполагаю, что это может быть связано с WebService больше, чем с IIS 6

Ответы [ 4 ]

1 голос
/ 12 мая 2011

В основном вам нужны два компонента.Сначала вы должны создать фильтр и добавить его в web.xml следующим образом:

<filter>
  <filter-name>yourFilter</filter-name>
  <filter-class>yourFilterClassWhichAddsTheCorrectHeader</filter-class>
</filter>
<filter-mapping>
  <filter-name>yourFilter</filter-name>
  <url-pattern>theServletUrlMappedToJaxWS</url-pattern>
</filter-mapping>

Затем вам может понадобиться создать оболочку ответа , где выдобавьте отсутствующий заголовок.

На самом деле вам может не понадобиться обертка, просто установите отсутствующий заголовок непосредственно в фильтре, настроенном вами в web.xml

Надеюсь, это поможет ...

0 голосов
/ 16 апреля 2011

вы пытались добавить

Accept-Encoding: gzip, deflate

для запроса заголовка?

это связано с этой ошибкой?(несмотря на то, что вы не используете IE, это может быть полезно)

Internet Explorer теряет первые 2048 байт данных, отправляемых веб-серверами, использующими сжатие HTTP

0 голосов
/ 18 апреля 2011

Я не слишком уверен, как ваш клиент обрабатывает ответ. Однако, если вы можете программно перехватывать HttpResponse, вы можете попробовать нечто похожее на использование фильтра сервлета для обертывания HttpResponse и увеличения заголовков.


public class HttpReponseWrapper extends HttpReponse 
{
   HttpResponse reponse;
   public HttpResponseWrapper(HttpResponse response)
   {
     this.response = response;
   }

   public String getContentEncoding()
  {
      return "Content-Encoding=gzip";
  }
}
0 голосов
/ 16 апреля 2011

JAX-WS-специфичный обходной путь - попытаться поместить обработчик в цепочку ввода клиента.Обработчик получит доступ к контексту сервлета, получит объект запроса, посмотрит на полезную нагрузку и, если он начинается с специфической для GZ последовательности, добавит заголовок HTTP в список существующих.

Недостатки: может не работать.Я ожидаю, что список заголовков HTTP будет неизменной коллекцией.Кроме того, анализ содержимого (и сбой) может произойти раньше, чем первый обработчик получит управление.

(у меня было другое предложение - использовать HTTP-фильтр - но потом я понял, что JAX-WSявляется клиентом и не использует web.xml).

...