Data Contract
Es kann sein, dass Webservices komplexere Datenstrukturen empfangen oder versenden müssen als die normalen Datentypen wie Integer, String, Boolean usw.
Beispiel:
Ein Webservice erhält eine ID eines Herstellers in Form eines Integer. Er sucht dann in einer Datenbank nach allen PC’s, die von diesem Hersteller am Lager sind. Der Webservice wird also als Rückgabewert eine Liste von PC’s generieren. Intern im Webservice kann mit Klassen des PC’s oder auch des Herstellers operiert werden. Der Client, der den Webservice aufruft, kennt diese Klassendefinitionen jedoch nicht.
Es wird also eine Datenbasis benötigt, die sowohl der Client als auch der Server kennt. Diese muss sich somit in die WSDL-Definition des Webservices integrieren und vom Client abrufbar sein.
Name
Definiert den Namen des Data Contracts.
Type
Wie Service Contracts können auch Data Contracts generiert werden. Dies geschieht bei Data Contracts mit Hilfe des ServiceProxies (siehe Generieren eines Data Contracts aus einem Service Proxy). Dieser liest die WSDL-Definition des Webservice aus. In dieser sind alle Data Contracts als XSD-Definition hinterlegt. Sind in einem Webservice mehrere Data Contracts definiert, wird der Service Proxy auch mehrere Data Contract-Elemente erstellen.
Somit existieren Data Contracts des Typs Userdefined Contract und External Contract, wenn dieser über einen Service Proxy generiert wurde.
Registerkarte General
Contract Type
Hier kann definiert werden, von welchem Typ der Data Contract sein soll. Wird als Typ ein Collection-Type ausgewählt, muss der Datentyp der Collection-Elemente in der Combobox Element datatype definiert werden. Dies kann z.B. ein weiterer Data Contract sein.
Interfaces
Hier können per Komma getrennt Interfaces angegeben werden, die die Data Contract-Klasse implementieren soll.
Binden eines externen Data Contracts
Es besteht die Möglichkeit, in externen Assemblies untergebrachte WCF Data Contracts direkt in Framework Studio einzubinden. Hierzu kann über den Button Bind Contract eine .NET-Dll importiert werden.
Importieren eines Data Contracts aus einer Assembly:
Mit dem Button Add Assembly kann nach einer gewünschten Assembly auf dem System gesucht werden. Nach dem Import wird die Assembly automatisch nach Klassen mit dem Attribut [Data Contract] durchsucht und diese in der Combobox Choose Contract angezeigt.
Die importierte Assembly wird als Ressource in Framework Studio eingebunden und bei einem Anwendungsstart oder Publish in das /bin-Verzeichnis des Brokers herausgeschrieben.
Registerkarte Properties
Hier werden die Properties des Data Contracts definiert. Mit Rechtsklick auf die Liste > New > Property wird ein neues Property angelegt.
Name
Definiert den Namen des Properties. Der erste Buchstabe des Namens wird immer in einen Großbuchstaben umgewandelt.
Datatype
Definiert den Datentyp des Properties. (Siehe Datentyp bearbeiten).
Property Type
Definiert die Art des Properties (siehe Membervariablen).
Attributes
Das Häkchen [DataMember] definiert, dass das Property des Data Contracts Bestandteil der XSD-Definition sein wird, welche in die WSDL-Definition eingebunden wird. Es müssen also nicht zwingend alle Properties des Data Contracts über den Webservice abrufbar gemacht werden.
In der Textbox können zusätzliche Attribute zum Property definiert werden. Muss z.B. auf jeden Fall ein Wert in einem Property an den Webservice übergeben werden, kann dieses Property mit [DataMember(IsRequired=true)]
erweitert werden.
Ableiten und Customizen von Data Contracts
Data Contracts können gecustomized werden. Dabei können neue Properties hinzugefügt werden oder Get-/Set-Methoden von Individual Properties überschrieben werden. Ableitungen von Data Contracts sind nicht möglich.
Service Contract automatisch generieren
In WCF ist für jeden Webservice zwingend ein Service Contract nötig. Der Service Contract wird dem Konsumenten über die WSDL zur Verfügung gestellt. Zur Vereinfachung der Implementierung eines Services in Framework Studio bietet dieses an, den Service Contract aus den Informationen des Servives automatisch zu generieren. Es wird also kein Service Contract-Element benötigt, um den Service zu betreiben.
Um die automatische Generierung des Service Contracts am Service zu aktivieren, muss die Combobox Implement auf Yes gestellt werden (siehe Registerkarte Contracts). Dies ist gleichzeitig der Standardwert für neu erstellte Service-Elemente. Auch wenn an einem Service der letzte zugeordnete Service Contract gelöscht wird, wird die automatische Generierung des Contracts aktiviert.
Um aus einem Service den Contract automatisch zu generieren, wird der Service von Framework Studio nach allen Methoden mit Access Level public durchsucht.
Öffentliche Methoden am Service:
Der Name des automatisch generierten Contracts wird wie folgt abgeleitet:
I + [Servicename] + Contract
Für den Service AtricleInfoService aus dem Beispiel heißt der zugehörige, automatisch generierte Contract somit IArticleInfoService Contract.
In der folgenden Abbildung wird verdeutlicht, wie der Code für den autogenerierten Contract erzeugt wird.
Automatisch generierter Service Contract in der Use-Schicht:
Es ist zu erkennen, dass die beiden öffentlichen Methoden aus dem Service in das Contract-Interface aufgenommen wurden und dass der Service den automatisch generierten Contract implementiert. Zusätzlich hat die Methode GetArticleByID(string id)
ein FaultContract-Attribut erhalten, da an der Service-Methode der Data Contract „dcArticleError“ entsprechend als Fault Contract hinterlegt wurde (siehe Registerkarte Methods).