Question

J'ai un client Silverlight que je dois appeler un service Web. Le service web est construit en Java et utilise le codage XOP pour attacher des messages binaires à certains de ses appels. Cependant, le service Silverlight utilise uniquement les appels qui ne comprennent pas le codage binaire. Cependant, depuis que je ne contrôle pas le service Web, je dois encore traiter le message en plusieurs parties XOP -. (Un exemple de l'un est ci-dessous)

Exemple de réponse du service Web (données dépouillées out)

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--

Notre implémentation actuelle construit manuellement un message de savon à l'aide de remplacement de chaîne et utilise la classe WebClient pour poster la demande et télécharger la réponse en tant que chaîne. Nous sommes alors coincés avec l'analyse manuellement les données au format XML. Ceci est ok, mais il est un peu difficile, et nous avons des services REST disponibles pour que de toute façon; Je voudrais vraiment que le proxy de service pour répondre avec des objets.

Ce que je voudrais vraiment faire est de mettre en œuvre un comportement personnalisé qui intercepte le message avant que la pile WS essaie de désérialiser le SOAP et enlever les saletés XOP, mais jusqu'à présent je n'ai rien trouvé qui me permettra de faire une telle une chose.

La façon dont je le vois, j'ai quelques options:

  1. Créer un service proxy sur le serveur (que je contrôle) qui soumettre à nouveau la demande au service Java et peut réellement gérer la XOP. Cette option a des répercussions sur la performance que je voudrais éviter.

  2. Mettre en œuvre un MessageEncodingBindingElement personnalisé, MessageEncoderFactory et MessageEncoder qui gère l'XOP. Cette option semble être le meilleur au début, mais depuis que je ne peux pas étendre le TextMessageEncoderFactory ou TextMessageEncoder (ce sont des classes internes) Je essentiellement besoin de réécrire le message entier encodage à partir de zéro (Merci beaucoup Microsoft!).

  3. Laisser la chose telle qu'elle est.

Y at-il des options que je ne vois pas?

Était-ce utile?

La solution

Non, il n'y a pas d'autres alternatives.

J'ai décidé de mettre en œuvre un pass-through proxy ashx qui utilisera la méthode WebClient.DownloadString () puis analyser juste les SOAP et la fiche dans la réponse. Il devrait être assez souple, et le meilleur de tous, je peux utiliser les classes proxy générées automatiquement à partir de Silverlight, alors il suffit de faire le point final utiliser mon proxy ashx -. Ce qui rend beaucoup plus simple entretien

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top