Снимите xop Gunk из ответа WS в Silverlight 3
-
26-10-2019 - |
Вопрос
У меня есть клиент Silverlight, который мне нужно позвонить в веб -сервис. Веб -сервис построен в Java и использует кодирование XOP для прикрепления двоичных сообщений к некоторым ее вызовам. Тем не менее, служба Silverlight использует только звонки, которые не включают какую -либо бинарную кодировку. Однако, поскольку у меня нет контроля над веб -службой, я все равно должен иметь дело с многопартийным сообщением XOP - (пример одного ниже).
Пример ответа от веб -службы (данные раздеты)
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
Content-Type: multipart/related; type="application/xop+xml"; boundary="uuid:890535d9-d11f-4dfb-8393-789e20ea8064"; start="<root.message@cxf.apache.org>"; start-info="text/xml"
Date: Thu, 27 Jan 2011 22:03:09 GMT
Content-Length: 47247
--uuid:890535d9-d11f-4dfb-8393-789e20ea8064
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:Response xmlns:ns2="http://tempuri.com/"></ns2:Response>
</soap:Body>
</soap:Envelope>
--uuid:890535d9-d11f-4dfb-8393-789e20ea8064--
Наша текущая реализация вручную строит сообщение SOAP, используя замену строки и использует класс WebClient, чтобы разместить запрос и загрузить ответ в качестве строки. Затем мы застряли с ручным анализом данных как XML. Это нормально, но это немного сложно, и у нас есть услуги отдыха, доступные для этого; Я бы очень хотел, чтобы сервисный прокси -сервер отвечал объектами.
Что я действительно хотел бы сделать, так это реализовать пользовательское поведение, которое будет перехватывать сообщение до того, как стек WS пытается покинуть мыло и удалить xop Gunk, но до сих пор я не нашел ничего, что позволит мне сделать такое.
Как я это вижу, у меня есть несколько вариантов:
Создайте прокси -сервис на сервере (который я управляю), которая повторно повторно повторно обратит запрос в службу Java и может на самом деле обрабатывать XOP. Этот вариант имеет последствия для производительности, которых я хотел бы избежать.
Реализуйте пользовательскую компанию MessageEncodingBindingElement, MessageEncoderFactory и MessageEncoder, которые будут обрабатывать XOP. Сначала этот вариант кажется лучшим, но, поскольку я не могу расширить TextMessageEncoderFactory или TextMessageEncoder (они являются внутренними классами), мне в основном нужно было бы переписать все, кодирующие все сообщение с нуля (большое спасибо Microsoft!).
Оставьте вещь как есть.
Есть ли какие -нибудь варианты, которые я не вижу?
Решение
Нет, нет других альтернатив.
Я решил внедрить прокси-прокси-сервер ASHX, который будет использовать метод webClient.downloadString (), а затем разобрать только мыло и подключить его к ответу. Это должно быть достаточно гибким, и, самое главное, я могу просто использовать классы с автогенерированным прокси из Silverlight, а затем просто заставить конечную точку использовать мой прокси ASHX, что делает техническое обслуживание намного проще.