Tags: , | Categories: Deutsch, Deutsch Posted by AlexanderZeitler on 2/16/2012 11:49 AM | Comments (0)

Microsoft hat heute auf den TechDays in Belgien die lang erwartete ASP.NET MVC 4 Beta vorgestellt und auch öffentlich zum Download bereitgestellt.

Die für mich wichtigste Neuerung ist die Integration der bisherigen WCF Web API in den ASP.NET Stack.

Einer der Hauptgründe für die Zusammenführung der beiden Projekte war die bisher berechtigte Frage nach der Koexistenz von zwei Frameworks von Microsoft, die beide das Erstellen von ReSTful Services erlauben - namentlich das bereits vorhandene ASP.NET MVC sowie die eben erwähnte und zum damaligen Zeitpunkt neu entwickelte WCF Web API.

Somit kommen den ASP.NET MVC Entwicklern nun die bereits implementierten Goodies der WCF Web API zugute.

Alles neu macht…der ApiController

Wie sieht das Ganze nun in der Praxis aus?

Die wichtigste Änderung ist die Implementierung einer API (oder auch Services, je nach Sprachgebrauch):

Bisher implentierte man eine API folgendermaßen:

Mit der ASP.NET Web API geschieht dies nun etwas anders:

Wie man sieht, wird nun für die APIs ebenfalls ein Controller implementiert, der jedoch nicht von Controller erbt, sondern von ApiController. Es gibt auch keine gemeinsame Basisklasse mit Controller.

Wenn man das Beispiel ansieht, taucht natürlich sofort eine weitere Frage auf: woher “weiß” die ASP.NET Web API, welches die Methoden für GET, POST, PUT etc. sind?

Hier greift nun das von ASP.NET MVC bekannte Prinzip “Convention over Configuration”, d.h. das Naming der Methode in der Klasse der API bestimmt auch deren HTTP Methode.

Übrigens gilt Conventention over Configuration auch bei den Controllern: Die API-Controller müssen ebenfalls im Controller-Ordner von ASP.NET MVC liegen.

Convention over Configuration…aber

…ein wenig Konfiguration gibt es doch noch - wechseln wir deshalb zur Global.asax.cs. Konfiguriert wird die ASP.NET Web API nach wie vor dort.

Die einzige Option, die grundlegend nötig ist, ist die Zuweisung einer Route in den Route Tables zu den ApiControllern.

Auch hier gibt es eine positive Neuerung: ASP.NET Web API nutzt nun das ASP.NET MVC Routing, allerdings erfolgt die Route-Definition nicht über MapRoute, sondern über MapHttpRoute:

Der Unterschied zur Default-Route von MVC ist der, dass die Action nicht explizit in der URI vorkommt (hier greift die genannte Konvention).

Somit ist unsere CustomersApi unter

http://localhost/api/customers

verfügbar - GET /customers/id, PUT, POST etc. funktionieren analog.

Möchte ich nun z.B. mehrere Get-Methoden implementieren, kann ich das über das Routing leicht ändern, indem ich einfach die Action einfach wieder mit in die Route aufnehme:

Dependency Injection

Natürlich funktioniert auch weiterhin Dependency Injection, hier wieder am Beispiel von LightCore.

Geben und nehmen...

Natürlich sind nicht nur Neuerungen der WCF Web API in die ASP.NET Web API eingeflossen, sondern Web API profitiert auch von ASP.NET MVC Features, z.B. dem Model Binding und der Validierung.

Für die Validierung können die gewohnten Annotations wie [Required] etc. verwendet werden:

Um die Validierung ans Arbeiten zu bekommen, ist nun noch ein ActionFilter nötig:

Der ActionFilter validiert das Model, welches z.B. per POST gesendet wurde und erzeugt im Fehlerfall ein JSON-Objekt, welches die Auflistung der Fehler enthält. Diese werden mit einem HTTP Status Code 400 (Bad Request) zurück an den Client geschickt.

Auf der Client-Seite werten wir das Ganze mit jQuery im POST-Request aus:

Voraussetzung ist natürlich das Einbinden der jQuery unobstrusive Validation Scripts und das Setzen der Entsprechenden Attribute im HTML-Code:

Ebenfalls unterstützt ist nun FormsAuthentication, dies wird allerdings Gegenstand eines eigenen Blog Posts sein.

Hosting

Neben dem bekannten Hosting in IIS (Express) ist es auch möglich, Web API in einem eigenen Prozess zu hosten:

Damit SelfHost funktioniert, muß System.Web.Http.SelfHost referenziert sein.

Das soll es als kurzer Überblick von meiner Seite zunächst gewesen sein.

Comments are closed