2012-04-23 2 views
0

У меня есть этот ответ от веб-сервиса Java:WCF не смог разобрать Java ответ мыло

HTTP/1.1 200 OK 
Date: Mon, 23 Apr 2012 12:08:50 GMT 
Server: Jetty/5.1.14 (Linux/2.6.18-274.17.1.el5xen x86 java/1.6.0 
Content-Type: text/xml; charset=utf-8 
Content-Length: 571 
--MIMEBoundaryurn_uuid_14B7343BF98675BB5D1335182931028 
Content-Type: application/xop+xml; charset=utf-8; type="text/xml" 
Content-Transfer-Encoding: binary 
Content-ID: <0.urn:uuid:[email protected]> 
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:loginResponse xmlns:ns1="http://www.telelogic.com/change/types"><token>206398089429929753</token></ns1:loginResponse></soapenv:Body></soapenv:Envelope> 
--MIMEBoundaryurn_uuid_14B7343BF98675BB5D1335182931028-- 

Исключение из WCF говорит мне The data at the root level is invalid. Line 1, position 1.

Мой app.config выглядит следующим образом:

<customBinding> 
    <binding> 
    <!--<messageModifier />--> 
    <!--<mtomMessageEncoding messageVersion="Soap11" writeEncoding="utf-8" />--> 
    <textMessageEncoding writeEncoding="utf-8" messageVersion="Soap11" /> 
    <httpsTransport 
     requireClientCertificate="false" 
     transferMode="Buffered" /> 
    </binding> 
</customBinding> 

Как вы можете видеть, я уже пробовал различные настройки, такие как mtom/text encodig, soap11/soap12 для версии сообщений, буферизация и responseStreamed для transferMode. Я как бы застрял. Когда я убираю часть ответа с Fiddler, я получил его работу:

HTTP/1.1 200 OK 
Date: Mon, 23 Apr 2012 14:21:44 GMT 
Server: Jetty/5.1.14 (Linux/2.6.18-274.17.1.el5xen x86 java/1.6.0 
Content-Type: text/xml; charset=utf-8 
Content-Length: 571 

<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:loginResponse xmlns:ns1="http://www.telelogic.com/change/types"><token>206398089429929753</token></ns1:loginResponse></soapenv:Body></soapenv:Envelope> 

Я что-то упустил? Есть ли волшебная комбинация настроек конфигурации, в которой я нуждаюсь?

Я также попробовал bot IClientMessageFormatter и IClientMessageInspector, но оба они кажутся слишком высокими в стеке, потому что WCF уже терпит неудачу с сообщением ProtocolException The data at the root level is invalid. Line 1, position 1..

Я подключил канал ChannelMessageInterceptor от WCF sample. Я думал, что я получил, что работает, но теперь я получаю исключение из службы Java:

HTTP/1.1 500 Internal Server Error 
Date: Mon, 23 Apr 2012 14:40:05 GMT 
Server: Jetty/5.1.14 (Linux/2.6.18-274.17.1.el5xen x86 java/1.6.0 
Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_14B7343BF98675BB5D1335192006387; type="application/xop+xml"; start="<0.urn:uuid:[email protected]>"; start-info="application/soap+xml"; action="http://www.telelogic.com/change/ChangeService/login/Fault/LoginFault";charset=UTF-8 
Content-Length: 2853 

--MIMEBoundaryurn_uuid_14B7343BF98675BB5D1335192006387 
Content-Type: application/xop+xml; charset=utf-8; type="application/soap+xml" 
Content-Transfer-Encoding: binary 
Content-ID: <0.urn:uuid:[email protected]> 

<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><soapenv:Fault xmlns:axis2ns15="http://www.w3.org/2003/05/soap-envelope"><soapenv:Code><soapenv:Value>axis2ns15:MustUnderstand</soapenv:Value></soapenv:Code><soapenv:Reason><soapenv:Text xml:lang="en-US">Must Understand check failed for header http://www.w3.org/2005/08/addressing : Action</soapenv:Text></soapenv:Reason><soapenv:Detail><Exception>org.apache.axis2.AxisFault: Must Understand check failed for header http://www.w3.org/2005/08/addressing : Action 
    at org.apache.axis2.engine.AxisEngine.checkMustUnderstand(AxisEngine.java:88) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:137) 
    at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275) 
    at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:121) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:428) 
    at org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:830) 
    at compressionFilters.CompressionFilter.doFilter(CompressionFilter.java:192) 
    at org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:821) 
    at com.telelogic.cs.filters.StrutsCharsetFilter.doFilter(StrutsCharsetFilter.java:44) 
    at org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:821) 
    at org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationHandler.java:471) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:568) 
    at org.mortbay.http.HttpContext.handle(HttpContext.java:1530) 
    at org.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplicationContext.java:633) 
    at org.mortbay.http.HttpContext.handle(HttpContext.java:1482) 
    at org.mortbay.http.HttpServer.service(HttpServer.java:909) 
    at org.mortbay.http.HttpConnection.service(HttpConnection.java:820) 
    at org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:986) 
    at org.mortbay.http.HttpConnection.handle(HttpConnection.java:837) 
    at org.mortbay.http.SocketListener.handleConnection(SocketListener.java:245) 
    at org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:357) 
    at org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:534) 
</Exception></soapenv:Detail></soapenv:Fault></soapenv:Body></soapenv:Envelope> 
--MIMEBoundaryurn_uuid_14B7343BF98675BB5D1335192006387-- 

По крайней мере, это говорит мне, что они используют ось? Я также видел сообщения об исключении, сообщающие мне, что тип содержимого ответа не соответствует типу привязки, но я не могу воспроизвести их в это время.

Это очень похоже на вопрос this. Я также пробовал WCF Soap With Attachments Encoder, но он также дергает ногами Data at the root level is invalid. Line 1, position 1. (но теперь прямо внутри исключения XmlException, а не из протоколаException).

Обновление У меня работает WCF SWA!

Пример сообщения, включая вложения:

HTTP/1.1 200 OK 
Date: Tue, 24 Apr 2012 11:27:40 GMT 
Server: Jetty/5.1.14 (Linux/2.6.18-274.17.1.el5xen x86 java/1.6.0 
Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_14B7343BF98675BB5D1335266861287; type="application/xop+xml"; start="<0.urn:uuid:[email protected]>"; start-info="text/xml";charset=UTF-8 
Content-Length: 81847 

--MIMEBoundaryurn_uuid_14B7343BF98675BB5D1335266861287 
Content-Type: application/xop+xml; charset=utf-8; type="text/xml" 
Content-Transfer-Encoding: binary 
Content-ID: <0.urn:uuid:[email protected]> 

<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:downloadAttachmentResponse xmlns:ns1="http://www.telelogic.com/change/types"><attachmentContents><xop:Include href="cid:1.urn:uuid:[email protected]" xmlns:xop="http://www.w3.org/2004/08/xop/include"></xop:Include></attachmentContents></ns1:downloadAttachmentResponse></soapenv:Body></soapenv:Envelope> 
--MIMEBoundaryurn_uuid_14B7343BF98675BB5D1335266861287 
Content-Type: application/octet-stream 
Content-Transfer-Encoding: binary 
Content-ID: <1.urn:uuid:[email protected]> 

��ࡱ�����������������>���� ���������������������������������������������������������������������������������������������������������������������������������������������� 
--MIMEBoundaryurn_uuid_14B7343BF98675BB5D1335266861287-- 

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

При использовании стандартного MTOM-кодировщика для этого конкретного сообщения оно работает: S Теперь мне нужно динамически переключать энкодеры ?!

Я, наконец, получил его работу. На основе SWA-выборки WCF я создал расширение связывания, которое по умолчанию использует TextMessageEncodingBindingElement, и для отправки сообщений и резервный механизм, используя MtomMessageEncodingBindingElement при приеме многочастных/связанных сообщений.

Спасибо всем.

ответ

1

Это мыло отформатировано как сообщение mime, но на практике нет вложений. Если у вас есть образец, который содержит вложение, пожалуйста, опубликуйте. Я полагаю, что tehre никогда не привязаны, и я бы посоветовал вам создать собственный кодер сообщений, который просто разделяет все, кроме мыльного конверта.

+0

Как мне скопировать вложение? Зачистка, похоже, выполняет эту работу для операций, которые я использую сейчас, но я не уверен, что это будущее доказательство ... – riezebosch

+0

если структура запросов исправлена, она всегда будет после Content-ID. Если сообщение действительно соответствует некоторому стандарту (например, swa), то wcf swa должен работать. для определения этого нам нужен пример с приложением –

+0

Я обновил вопрос на примере. – riezebosch

1

Убедитесь, что заголовок Action (входящий с Java) не пуст или примените WCF ServiceBehavior - AddressFilterMode.

0

Для оси требуется заголовок SOAPAction:foo. Не спрашивайте меня, почему, и «foo» может (насколько я могу судить) что угодно, независимо от вызываемого сервиса. Но это будет ошибкой, если этого не будет. Поэтому, если вы добавите это ко второй попытке, это может решить вашу проблему.

YMMV, мне нужно было иметь дело с размещенными Axis службами Java на одном клиентском сайте, но все они были такими.

Смежные вопросы