ASP.NET Web API und OData

Lange habe ich gebraucht um zu verstehen. Viele widersprüchliche Blog Artikel (Doku sucht man vergeblich) später, habe ich zumindest ein funktionierendes VB.NET Beispiel um die Northwind Customers per Odata anzuzeigen.

Zunächst: in der ASP.NET Web API ist kein Odata enthalten. Die Microsoft Entwickler haben sich irgendwann entschieden ein eigenes Paket zu erstellen. Vermutlich um Abhängigkeiten terminlicher Natur zu entkoppeln. Um an das Nuget Packet zu kommen, muss man einen eigenen Nightly Build Server verwenden. Der Blog Artikel beschreibt wie das geht.

Das Web Projekt wird nach wie vor als ASP.NET MVC 4 Projekt erzeugt. Dann aus dem Templates ASP.NET Web API auswählen. Man kann auch bestehende Web Projekte “Migrieren”.

Dann werden über den Packetmanager die Pakete ausgewählt, in diesem Fall der Odata Zusatz.

image

Der Odata Stack ist eine Art aufgesetzter parallel Implementierung.  Entsprechend muss zunächst das Model gebildet werden und das Routing codiert werden.

Dies wird in der Datei WebApiConfig vorgenommen.

Dim model As ODataModelBuilder = New ODataConventionModelBuilder()
model.EntitySet(Of Customers)("Customers")
model.EntitySet(Of Orders)("Orders")
config.Routes.MapODataRoute(routeName:="OData", routePrefix:="xxxx", model:=model.GetEDMModel)

Wer schon mit MVC oder ASP.NET gearbeitet hat, wird erkennen das dieses Routing anders funktioniert. Letztendlich existieren unter umständen sogar zwei Routen (Standard API) zum Controller.

Ab diesem Zeitpunkt sollte schon der Abruf der Metadaten mit dem Kommando $metadata funktionieren.

image

 

Das Modelling wurde unter Zuhilfenahme des Entity Frameworks durchgeführt. Dabei fällt auf das der Primary Key aus der Datenbank sich nicht als Key Feld wieder findet. Gemäß dem Motto Convention over Configuration wird ein Feld mit dem Namen ID vorausgesetzt. Das kann man im Model einfach umbenennen oder mit einer Annotation Key versehen.

image

Annotation

Imports System.ComponentModel.DataAnnotations

Partial Public Class Customers
    <Key>
    Public Property Customer_ID As String

Die Metadaten sehen dann wie folgt aus

image

oder

 

 

image

Als nächstes wird der Controller definiert. Normalerweise erbt eine ASP.NET Web API Controller Klasse von API Controller.

Public Class testController
Inherits ApiController
' GET api/test
Public Function GetValues() As IEnumerable(Of String) Return New String() {"value1", "value2"} End Function

In Odata existiert eine Abstraktion die verwendet werden muss und man muss nicht ganz unlogisch IQueryable als Rückgabe liefern. In C# lautet der Methodenname ident zu den HTTP Kommandos. Also GET. In VB ist dies ein reserviertes Schlüsselwort. Also hat man bisher die Methode GetValues genannt. Aus unerfindlichen Gründen sagt die Konvention nun Get+Controller, also GetOrders.

 

Public Class OrdersController
Inherits ODataController
<Queryable()>
Public Function GetOrders() As IQueryable(Of Orders)
Dim nw As NorthwindEntities = New NorthwindEntities
Return nw.Orders.AsQueryable
End Function

Es gibt auch eine Syntax mit eckiger Klammer, die ich aber verwirrend finde:

Public Function [Get]() As IQueryable(Of Customers)

Der Aufruf im Browser folgt auch einen Konvention. Der Zusatz Controller wird weggelassen, also http://localhost:8561/xxxx/Orders

image

 

 

Es gibt noch eine Reihe weiterer Unterschiede zu ASP.NET Web Api und MVC. So ist das Attribut ResultLimit nun PageSize.

Letztendlich ist die ASP.NET Web API bei weitem noch nicht so weit, wie die internen Konkurrenz Technologien Silverlight RIA Services oder WCF Dataservices. Besonders der Odata Stack ist nicht fertig.

Hilfreich bei schreiben dieses Artikels war noch folgender Blog

Pingbacks and trackbacks (1)+

Kommentare sind geschlossen