ASP.NET Web API insert mit METRO APP

Folgendes VB.NETCode Beispiel zeigt konzeptionell wie man aus einer Windows 8 METRO styled APP heraus einen neuen Datensatz in per ASP.NET Web API einfügen kann. Ich  muss zugeben, das es sehr mühsam war. Man kann leicht und viele Fehler machen und das debuggend ist extrem aufwändig. Zunächst klappt der es nicht mehr per Fiddler Zugriffe auf localhost zu tracen. Es half nur einen echten IIS 8 zu installieren und den Web Service Zugriff auf den Maschinennamen zu ändern. Dann muss man sich noch drum kümmern, das die Web Anwendung auch per Debugger erreichbar ist,

Ich habe ein wenig mit den Datentypen experimentiert. Diese müssen am Server nicht ident, aber ähnlich sein. Also zusätzliche propertys (hier im ASP.NET Service  fake) stören nicht

Public Class Customer1
    Public Property CustomerID As String
    Public Property CompanyName As String
    Public Property Address As String
    Public Property Region As String
    Public Property fake As String   'unterschied fuer server
End Class

Wenn man allerdings in der Post Methode String statt Customer1 nimmt, ist das Rückgabe Objekt leer. Keine Fehlermeldung, im Fidddler der trace OK.

  ' POST /api/<controller> Insert
 Public Sub PostValue(ByVal value As Customer1)
  ....
 End Sub

 

METRO Client

Nun wenden wir unser der Client Seite zu. Auch hier kann man einiges falsch machen. Zunächst serialisert man das Customer1 Objekt nach Json. Ganz wichtig ist den Contenttype korrekt zu setzen. Ein weiterer Fehler ist mir passiert mit dem positionieren des Memorystream Zeigers. Vergessen und schon kein Ergebnis, ohne Fehlermeldung.

Dim uri As Uri = New Uri("http://win8-pre9/lab1/api/customers)
Dim cust As New Customer1
cust.CustomerID = txtID.Text
cust.CompanyName = txtFirma.Text
cust.Address = txtName.Text
cust.Region = txtRegion.Text
Dim ms = New MemoryStream()
Dim djs = New DataContractJsonSerializer(GetType(Customer1))
djs.WriteObject(ms, cust)
ms.Position = 0
Dim sc = New StreamContent(ms)
sc.Headers.ContentType = New MediaTypeHeaderValue("application/json")

Dim res = Await http.PostAsync(uri,sc)
res.EnsureSuccessStatusCode()

{"Address":"TestPerson","CompanyName":"TestFirma","CustomerID":"TEST1","Region":"TestRegion"}

Nachdem das Beispiel nun funktioniert, habe ich den Content aus Fiddler kopiert und baue das Json Objekt einfach testweise per Hand zusammen.

Dim uri As Uri = New Uri("http://win8-pre9/lab1/api/customers")
Dim s As New StringBuilder
s.Append("{""CustomerID"":""")
s.Append(txtID.Text)
's.Append(""",""CompanyName"": """)
's.Append(txtFirma.Text)
s.Append(""",""Address"": """)
s.Append(txtName.Text)
s.Append(""",""Region"": """)
s.Append(txtRegion.Text)
s.Append("""}")
Dim c As HttpContent = New StringContent(s.ToString)
c.Headers.ContentType = New MediaTypeHeaderValue("application/json")
Dim res = Await http.PostAsync(uri, c)
res.EnsureSuccessStatusCode()

Das klappt auch wunderbar. Selbst wenn man Eigenschaften aus dem Json Stream rausnimmt um z.B, die Datenmenge zu reduzieren. Das wäre auch ein Argument für diesen Lösungsansatz.

Durch die Verwendung des Post Async Kommandos landet der Request im ASPNET Web Service auch im post Zweig. Dieses .net Beispiel hat den Inhalt im Text Body übermittelt. In der Praxis geht das auch per Querystring über FormUrlEncodedContent.

Update und Delete funktionieren dann analog.

Kommentare (1) -

Alex
04.04.2012 00:32:29 #

Den Serializer kannst Du Dir sparen, dafür gibts .ReadAs<T>(), da kannst Du Deinen Customer direkt reinstopfen:
code.msdn.microsoft.com/Introduction-to-HttpClient-4a2d9cee

Kommentare sind geschlossen