Laden...

Design eines Webdienstes

Erstellt von DavidT vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.204 Views
DavidT Themenstarter:in
998 Beiträge seit 2007
vor 15 Jahren
Design eines Webdienstes

Hallo,
ich habe eine Software programmiert welches nun im Hintergrund auf Teile eines Fremdsystems zugreifen soll. Da mir keine Datenbankverbindung gewährt wird, bleiben mir nur Webdienste. Die IT-Abteilung hat mir aufgetragen, einen Webdienst so zu designen wie ich ihn brauche, denen dann die Spec mitzuteilen (ich nehme mal an die wsdl Datei?!?) und dann bekomme ich die Adresse davon.

So weit, so gut...

Nun habe ich mir testweise einen ASP-Webdienst geschrieben der auch wunderbar funktioniert, allerdings stelle ich mir dabei einige Fragen...
Ich liefer unter anderem bei einer Methode ein DateTime-Objekt zurück, da ich auch ein NULL brauche, ist es DateTime?, also Nullable<DateTime>. Wie sieht es jetzt aus wenn ich der IT die WSDL dazu gebe? Kann man soetwas überhaupt mit anderen Sprachen umsetzen? Habe keinen peil ob die JSP, Ruby, PHP oder sowas was einsetzen...

Wie geht ihr Konkret an solche Aufgaben ran? Sollte man nur mit Basistypen (int, string...) kommunizieren?

Tut mir leid, wenn die Fragen doof sind, ich habe mich gewiss auch schon mit Webdiensten auseinander gesetzt, aber die Praxis sieht leider doch wieder etwas anders aus.

Danke im Voraus!

Gruß David

G
497 Beiträge seit 2006
vor 15 Jahren

Nullables werden im WSDL üblicherweise als optionale Parameter gekennzeichnet. Das sollte sprachunabhängig funktionieren. Wenn der Null-Wert zurückgeliefert werden soll, lässt der Webdienst dieses optionale Element einfach weg. Wenn du den Webdienst über automatisch generierten Client-Code (wsdl.exe oder Visual Studios "Dienstverweis hinzufügen"-Funktion) benutzt, wird das entsprechende Element dann NULL enthalten. Übernimmst du die clientseitige Behandlung selbst, musst du das optionale Element natürlich entsprechend behandeln.

Ich nutze übrigens nie Basistypen. Ich bau mir für alle Abfragen und alle Antworten jeweils Klassen, in die ich dann die entsprechenden Parameter einhänge. Bei den alten ASP.Net-Webdiensten war das sogar nötig, da die Dienstmethode über die Methodensignatur ermittelt wurde. Man konnte da in einem Webdienst nicht zwei Methoden mit denselben Parametern definieren (z. B. Input String, Rückgabe Int). Mit WCF geht das, soweit ich weiß.

DavidT Themenstarter:in
998 Beiträge seit 2007
vor 15 Jahren

Hallo GarlandGreen,

zunächst vielen Dank für deine hilfreiche Antwort, werde mir direkt mal die wsdl anschauen, wie das gehandhabt wird.

Wie gehe ich denn mit nicht vorhandenen Webdiensten zur Entwicklungszeit um? Generiert VS08 oder die WSDL.exe mir irgend ein Interface, so das ich einen Sub schreiben könnte oder soetwas?

Gruß David

G
497 Beiträge seit 2006
vor 15 Jahren

wenn du eine WSDL hast, kann VS dir daraus Proxyklassen generieren. Die kannst du zwar erst aufrufen, wenn der Webservice existiert, aber du kannst schonmal gegen die Teile programmieren.

Hab mich übrigens vertan: wsdl.exe war das Tool für die alten ASP.Net-Webdienste. Für WCF-Clientproxys heisst das Tool SvcUtil.exe: http://msdn.microsoft.com/en-us/library/ms733133.aspx

Kleiner Tip, wenn du WCF verwendest: vergiss nicht, die Client-Verbindung per Hand zu schliessen (oder die generierte Client-Klasse, die IDisposable implementiert, zu disposen). Die alten Webdienst-Clientklassen haben das selbst bei jedem Aufruf gemacht, die neuen machen das nicht mehr. Ergebnis ist ein ansonsten unerklärbarer Timeout (am Server passiert scheinbar gar nichts), wenn man ein paar mal hintereinander Verbindungen aufmacht und Remote-Methoden aufruft.

DavidT Themenstarter:in
998 Beiträge seit 2007
vor 15 Jahren

Hey GarlandGreen,

erneut vielen Dank, ich verwende noch die klassischen ASP.NET Webservices. Was würdest du denn empfehlen, eher die (damit kenne ich mich wenigstens etwas aus) oder direkt WCF?

Gruß David

S
142 Beiträge seit 2007
vor 15 Jahren

Hallo DavidT,

weißt Du aus was für einer Plattform heraus der Webservice aufgerufen wird? Ich habe einmal einen asp.net webservice entworfen der aus Delphi heraus aufgerufen wird.

Da kann er leider nicht einfach so referenziert werden, sondern die SOAP-Anfrage muss über einen Webrequest umgesetzt werden.

Bei mir hat das dazu geführt, dass ich die Webmethod-Parameter nicht als feste .NET-Datentypen definiert habe die bei einer falschen Anfrage 'krachen', sondern als untypisierte Objekte/Strings, die vom Webservice geprüft wurden und ggf. individuelle Exceptions geworfen werden.

(ist der String z.B. NULL, hat der Aufrufer den XML-Knoten vergessen, lässt er sich nicht in den gewünschten Zieltyp konvertieren, war die Eingabe falsch).

3.728 Beiträge seit 2005
vor 15 Jahren
Wcf

Was würdest du denn empfehlen, eher die (damit kenne ich mich wenigstens etwas aus) oder direkt WCF?

WCF wird weiterentwickelt und unterstützt auch viele neue Standards (WS-* Protokolle). Mit klassischen ASP.NET Webdiensten ist kein Blumentopf mehr zu gewinnen. Ich bin zwar kein Freund der Technologieschwemme, aber im Falle von Webservices ist es wirklich so. Vor allem wenn Interoperabilität mit anderen Plattformen für Dich ein Thema ist, hast Du bei WCF wesentlich mehr Stellschrauben um Deine Webdienste so anbieten zu können, dass auch etwas kauzigere Systeme damit klar kommen.

WCF muss nicht schwer sein, kann aber sehr komplex werden (eben weil es so viele Möglichkeiten bietet). Du solltest deshalb eine ausgedehnte Einarbeitungszeit einplanen. Wenn das fürs aktuelle Projekt nicht möglich ist, dann nimm doch lieber die alten ASP.NET Webdienste und verschiebe den WCF-Einstieg auf das nächste Projekt.