Frage

Ich habe einen Silverlight -Client, den ich einen Webdienst anrufen muss. Der Webdienst ist in Java integriert und verwendet mit XOP -Codierung Binärnachrichten an einige seiner Anrufe. Der Silverlight -Dienst verwendet jedoch nur Anrufe, die keine binäre Codierung enthalten. Da ich jedoch keine Kontrolle über den Webdienst habe, muss ich mich trotzdem mit der XOP -Multi -Party -Nachricht befassen - (ein Beispiel für eine ist unten).

Beispiele Antwort aus dem Webdienst (Daten ausgestattet)

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

Unsere aktuelle Implementierung konstruiert manuell eine SOAP -Nachricht mit einem String -Austausch und verwendet die Webclient -Klasse, um die Anforderung zu veröffentlichen und die Antwort als Zeichenfolge herunterzuladen. Wir bleiben dann mit der manuellen Parsen der Daten als XML. Das ist in Ordnung, aber es ist ein bisschen schwierig, und wir haben dafür Ruhdienste sowieso verfügbar. Ich möchte wirklich, dass der Service -Proxy mit Objekten antwortet.

Was ich wirklich gerne tun würde, ist ein benutzerdefiniertes Verhalten zu implementieren, das die Nachricht abfängt, bevor der WS -Stack versucht, die Seife zu deserialisieren und den XOP Gunk zu entfernen, aber bisher habe ich nichts gefunden, was mir erlaubt, so etwas zu tun.

So wie ich es sehe, habe ich ein paar Optionen:

  1. Erstellen Sie einen Proxy -Dienst auf dem Server (den ich steuere), der die Anforderung an den Java -Dienst erneut übertragen und den XOP tatsächlich verarbeiten kann. Diese Option hat Auswirkungen auf die Leistung, die ich vermeiden möchte.

  2. Implementieren Sie eine benutzerdefinierte MessageCodingBindingelement, MessageCoderFactory und MessageCoder, die das XOP verarbeiten. Diese Option scheint zunächst die beste zu sein, aber da ich den TextMessageCoderFactory- oder TextMessageCoder (es sind interne Klassen) nicht erweitert werden kann, müsste ich im Grunde die gesamte Nachricht von Grund auf neu schreiben (vielen Dank Microsoft!).

  3. Lass das Ding so, wie es ist.

Gibt es Optionen, die ich nicht sehe?

War es hilfreich?

Lösung

Nein, es gibt keine anderen Alternativen.

Ich habe mich entschlossen, einen ASHX-Proxy für Pass-Through zu implementieren, der die methode von webclient.downloadstring () verwendet und dann nur die Seife analysiert und diese an die Antwort anschließt. Es sollte flexibel genug sein, und das Beste ist, ich kann einfach die autogenerierten Proxy -Klassen aus Silverlight verwenden und dann den Endpunkt meinen ASHX -Proxy verwenden - was die Wartung viel einfacher macht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top