WCF Data Service und JSON

Ich setze voraus, dass JSON bekannt ist. Im folgenden gehe ich der rein akademischen Frage nach, wie man aus WCF Data Services Daten per JSON bekommt und in Silverlight konsumiert. Da die API das nativ auf der Silverlight Seite nicht unterstützt, müssen wir uns deshalb mit einem JSON Serializer auseinandersetzen. Dafür entfällt das Erstellen einer Web Service Referenz im Silverlight Projekt.

Zunächst einmal die grundlegende Vorgehensweise. Es reicht den Request Header auf Accept application/Json zu setzen. Hier der Screenshot aus Fiddler.

image

Dann liefert WCF Data Service die Daten als Json aus. Dies ist z.B. für ein reines Java Script/JQuery Szenario der beste Weg.

image

Was aber die wenigsten Wissen, auch für Silverlight ist die JSon Alternative eine Überlegung wert, da die Daten Menge um run 60% sinkt. Der erste Request ist Mit Json per Header und er 2te ist übliches ATOM Format von WCF Dataservices im folgenden Fiddler Bild.

image

Nun können wir die Daten in Silverlight konsumieren und das geht auch viel einfacher als man denkt. Zunächst braucht das Silverlight Projekt Referenzen auf System.ServiceModel.Web und System.Runtime.Serialization.Json. Im Webrequest wird der Header Accept hinzugefügt. Da es im Ergebni etwas weniger Code benötigt habe ich hier den Weg über Openreadasync gewählt der statt einem String einen Stream zurück liefert.

Dim wc As New WebClient
wc.Headers("Accept") = "application/json"
AddHandler wc.OpenReadCompleted, AddressOf DatenLadenFertig
wc.OpenReadAsync(New Uri("http://localhost:40246/WcfDataService1.svc/Customers", UriKind.Absolute))

In der Rücksprungfunktion kann nun das result des Events dem Stream zugewiesen werden. Die Customer Klasse habe ich nicht per Hand definiert. Das ist in diesem Fall ein Überbleibsel einer Proxy Generierung. Sie müssen die Klasse Customer mit propertys passend zu den Ursprungsdaten (hier Nordwind) in der Silverlight Anwendung erstellen. Dann lassen wir den Serializer mit einer Zeile Code die generische Liste Customer erzeugen.

Dim js As Stream = e.Result
Dim ser As New DataContractJsonSerializer(GetType(List(Of Customers)))
Dim c As List(Of Customers) = CType(ser.ReadObject(js), List(Of Customers))
DataGrid1.ItemsSource = c

Einfacher und schneller geht kaum.

Kommentar schreiben