ASP.NET Web API

Eintrag zuletzt aktualisiert am: 19.02.2015

Das ASP.NET Web API ist eine .NET-basierte Bibliothek von Microsoft zur Erstellung REST-basierter Webservices mit HTTP und XML/JSON. Das ASP.NET Web API ist eine Alternative zur Windows Communication Foundation (WCF).

Links

Paket: https://www.nuget.org/packages/Microsoft.AspNet.WebApi
Website: http://www.asp.net/web-api

Status

ASP.NET Web API galt immer schon als Teil von ASP.NET MVC, auch wenn es technisch einige Unterschiede gab, die auf die Implementierung durch verschiedene Entwicklungsteams zurückzuführen sind. Ab Version 6 ist WebAPI ist nun in ASP.NET MVC 6 komplett integriert wird.

Erscheinungstermine

Version 1: 11.08.2012 zusammen mit ASP.NET MVC 4
Version 2: 17.10.2013 zusammen mit ASP.NET MVC 5
Version 2.1: 17.01.2014
Version 2.1: 01.07.2014
Version 6: erscheint 2015; WebAPI ist nun in ASP.NET MVC 6 komplett integriert wird.

Hintergründe zu ASP.NET Web API von Manfred Steyer

Die neue ASP.NET Web API wird die Erstellung von REST-basierten Services, welche auf so gut wie allen Plattformen konsumiert werden können, erheblich vereinfachen. Anders als beim Einsatz der WCF werden Details des darunterliegenden Protokolls nicht abstrahiert, weswegen der Entwickler volle Kontrolle über die auf HTTP-basierende Kommunikation hat.

Egal ob auf mobilen Geräten, in Web-Browsern oder bei Cloud-Services, egal ob auf der Java-Plattform, unter PHP oder .NET: HTTP wird überall unterstützt. Dies ist auch der Grund dafür, warum die REST-Bewegung, die den puren Einsatz von HTTP ohne zusätzliche Transportprotokolle wie SOAP oder WS-* fordert, in den letzten Jahren zunehmend an Bedeutung gewinnt.

Die ASP.NET Web API, welche im Rahmen von ASP.NET MVC 4 genutzt werden kann, wird in Zukunft die Entwicklung REST-basierter Services erheblich vereinfachen. Anders als WCF wird dabei das darunter liegende Protokoll nicht verborgen und abstrahiert, sondern ein direkter Zugriff auf die Möglichkeiten von HTTP gewährt. Ursprünglich sollte die Web API gemeinsam mit WCF verteilt werden. Allerdings entschied man sich bei Microsoft, dass sich ASP.NET MVC als übergeordnetes Framework besser eignet. Deswegen wurde sie von WCF Web API in ASP.NET Web API umbenannt. Ausgeliefert wird sie mit ASP.NET MVC 4.

Einen einfachen REST-Service erstellen

Möchte man REST-Services über einen Web-Server zur Verfügung stellen, sind diese in einem ASP.NET MVC 4-Projekt anzulegen. Alternativ dazu kann sich der Entwickler auch, wie weiter unten beschrieben, selbst um das Hosting kümmern. In diesen Fällen wird ein eigener Web-Server, der im Lieferumfang der Web API enthalten ist, in einer benutzerdefinierten Anwendung gestartet.

REST-Services leiten von ApiController ab (siehe Listing 1). Die vom Entwickler bereitgestellten Methoden dieser Klassen stellt Web API unter Verwendung von Konventionen via HTTP bereit. Beginnt der Name einer Methode zum Beispiel mit Get, kann sie über das HTTP-Verb GET erreicht werden. Dasselbe gilt analog für POST, PUT und DELETE. Weicht der Name einer Methode von dieser Konvention ab, kann diese mit den Attributen HttpGet, HttpPost, HttpPut und HttpDelete mit diesen Verben assoziiert werden (siehe FindHotelsBySterne in Listing 1).

Weitere Verben können mit dem Attribut AcceptVerbs zugewiesen werden. Beispiele dafür finden sich in Listing 2, wo unter anderem das benutzerdefinierte Verb X-ECHO zur Methode Echo zugewiesen wird. In der aktuellen BETA verhindert der Einsatz von AcceptVerbs jedoch nicht, dass Web API zusätzlich auch die erwähnten Konventionen anwendet. Aus diesem Grund könnte der Aufrufer die Methode GetImplementationInfo in Listing 2 sowohl über X-INFO als auch über GET erreichen. Damit GET per Konvention nicht automatisch zugewiesen wird, wird hier jedoch unter Verwendung des Attributes ActionName angegeben, dass intern der Name ImplementationInfo anstatt von GetImplementationInfo zu verwenden ist.

Listing 1

public class HotelsController : ApiController
{

public Hotel GetHotel(int id)
{
var rep = new HotelRepository();
var hotel = rep.FindById(id);
if (hotel == null) throw new HttpResponseException(HttpStatusCode.NotFound);

return hotel;
}

public Hotel PostHotel(Hotel hotel)
{
var rep = new HotelRepository();
rep.Create(hotel);
return hotel;
}

[HttpGet]
public List<Hotel> FindHotelsBySterne(int minSterne)
{
var rep = new HotelRepository();
var hotels = rep.FindBySterne(minSterne);
return hotels;
}

[…]
}

Listing 2

public class HotelsController : ApiController
{
[…]

[AcceptVerbs("X-ECHO")]
public List<Hotel> EchoHotels(List<Hotel> hotels)
{
return hotels;
}

[AcceptVerbs("X-INFO")]
[ActionName("ImplementationInfo")]
public string GetImplementationInfo()
{
[…]
}
}