2009-05-06 16 views
2

Ich habe ein webbasiertes System, in dem Benutzer Daten von einem Webservice durch Eingabe der URL und der erforderlichen Parameterwerte abrufen können.Parameter für Webdienst programmgesteuert abrufen?

Mein Problem ist, irgendwie muss ich herausfinden, die Struktur der Parameter in der Seife Körper, die nicht unbedingt nur ein oder zwei Strings, aber könnte ein ganzes Objekt Baum sein.

Übertragung ist kein Problem, da es nur einfaches XML ist.

Wie mache ich das? Muss ich das gesamte WSDL-Schema lesen und versuchen, das herauszufinden, oder gibt es einen einfacheren Weg? Ich weiß, dass .NET Code dafür generieren kann, aber kann ich leicht herausfinden, welche Klassen generiert worden wären, ohne sie tatsächlich zu generieren, und Reflektion verwenden, um herauszufinden, was es getan hat?

Hat jemand eine Idee?

Antwort

4

Sie können die ServiceDescription Klasse verwenden, die Ihnen ein Objektmodell gibt, das Ihre WSDL-Datei darstellt.

Wenn Sie einen nützlichen Wrapper ausprobieren möchten, kicken Sie dieses post.

+0

Das könnte mein Problem gelöst haben, wenn es nicht zwei Dinge gegeben hätte: 1.Der Wrapper erhält nur die erste Parameterebene. Wenn der Parameter von einem ComplexType ist, bekomme ich immer noch nicht die Definition für diesen komplexen Typ. Dies kann jedoch mit einigen Änderungen am Code leicht gelöst werden. 2. Mindestens einer der Test WSDL-Dateien Ich verwende hat Bindungen sowohl für Seife, HttpGet und Httppost. Ich kann nicht programmatisch herausfinden, welches das Soap ist. Irgendeine Idee, wie ich das mit der ServiceDescription-Klasse machen kann? – janzi

0

Ich habe es noch nie getan, aber ich glaube, dass .net ermöglicht es Ihnen, Proxies dynamisch zu generieren. Sie sollten dann in der Lage sein, die generierten Klassen zu reflektieren. Ich kann nicht sehen, dass dies gut für alles andere als einfache Schnittstellen funktioniert.

+0

Ich habe das schon ausprobiert. Das erzeugt jedoch neue Baugruppen, die ich laden muss, um über sie nachzudenken. Leider können diese Assemblys nicht einfach entladen werden (es sei denn, es wird eine neue Anwendungsdomäne erstellt), selbst wenn sie nie wieder verwendet werden. Deshalb möchte ich die Parameter herausfinden, ohne eine Assembly tatsächlich erstellen und laden zu müssen. – janzi

0

Ich sehe drei Möglichkeiten:

a) Kontakt mit dem Herausgeber des Web-Service und fragen Sie nach Dokumentation und Codebeispielen.

b) Verwenden Sie Visual Studio zum Generieren der Proxy-Klassen. Untersuchen Sie dann den generierten Code, um herauszufinden, wie Sie das ohne den generierten Code selbst tun könnten. Sie müssen verstehen, wie die XMLSerializer-Klasse funktioniert, da dies die Klasse ist, die zum Konvertieren generierter Typen in XML verwendet wird.

c) Lesen Sie die WSDL-Beschreibung, um die erwarteten Parameter und deren Format zu verstehen.

hoffe, das hilft,

Sly

+0

Das Problem ist, dass ich nicht weiß, mit welchen Webdiensten das System im Voraus kommuniziert. Wenn ich das wüsste, könnte ich auch das Web Reference dazu hinzufügen und stattdessen verwenden. Ich versuche grundsätzlich, meinen Benutzern die Möglichkeit zu geben, Daten von anderen Systemen bei Bedarf zu importieren. – janzi

+0

janzi - Es tut mir leid; Ich habe nicht verstanden, dass Sie Dienste zur Laufzeit ermitteln und aufrufen müssen. Sie werden die Logik des Web-Service-Verweises neu schreiben, um zu ermitteln, was der Service ist und wie er aufgerufen wird. In diesem Fall kenne ich keine andere Möglichkeit, als die WSDL zu analysieren. – Sylvain

0

Versuchen Channel verwenden. Dadurch können Sie einen Webservice zur Laufzeit dynamisch aufrufen und den Proxy-Client erstellen. Ich habe Ihren Kommentar zum Laden und Entladen von Baugruppen gelesen. Verwenden Sie den Client-Proxy mit Reflektion und wenn Sie fertig sind, entsorgen Sie es einfach.

0

Dieses Problem ist für den allgemeinen Fall schwer zu lösen. Was ist, wenn einer der "Parameter" des Service ein XML-Dokument ist? Was ist, wenn es ein komplexer Typ ist? Wie werden Sie eine Benutzeroberfläche erstellen, um solche Dinge eingeben zu können?

Sie könnten auch in soapUI suchen.

BTW, Erstellen einer neuen AppDomain zum Laden von Baugruppen in ist nicht schwierig. In der Tat ist es ziemlich einfach.

Verwandte Themen