Sie sind hier: Weblog

ASP.NET Web API: Self Hosting

Foto ,
10.06.2012 01:27:00

Web API-basierte Services müssen nicht zwangsweise innerhalb von IIS laufen. Bei Bedarf kann der Entwickler sie auch in einer benutzerdefinierten Anwendung, zum Beispiel einer Kommandozeilenapplikation oder einem Windows-Dienst, zur Ausführung bringen. Hierbei ist von Self-Hosting die Rede. Die dazu benötigten Assemblies System.Net.Http, System.Web.Extensions, System.Web.Http, System.Web.Http.Common und System.Web.Http.SelfHost können unter anderem über ein zu diesem Zwecke bereitgestelltes NuGet-Package mit dem Namen ASP.NET Web API Self Host (Beta) bezogen werden.

Wie das nachfolgende Listing zeigt, ist dazu lediglich eine Instanz von HttpSelfHostConfiguration zu erzeugen. Diese kann mit Konfigurationsinformationen, wie zum Beispiel Routen, versehen werden. IncludeErrorDetailPolicy legt fest, ob Fehlermeldungen zum Client übertragen werden sollen. Um potentiellen Angreifer nicht mit Informationen zu versorgen, sollte diese Einstellung zumindest im Produktivbetrieb deaktiviert (Option Never) oder auf LocalOnly gesetzt werden. Transfermode gibt an, ob die empfangenen und/oder gesendeten Daten gestreamt werden sollen. Die Standardeinstellung ist Buffered, was bedeutet, dass eine Nachricht erst nachdem sie vollkommen empfangen wurde, Verwendung findet. Alternativ dazu legt StreamedRequest fest, dass die Anfrage gestreamt wird. StreamedResponse veranlasst ein Streamen der Antwort und Streamed ist die Kombination aus diesen beiden Optionen. Damit Streaming funktioniert müssen der Übergabeparameter und/oder der Rückgabewert aus einem einzigen Stream bestehen. MaxReceivedMessageSize legt die maximale empfangbare Nachrichtengröße fest; MaxBufferSize hingegen die maximale Größe jenes Nachrichtenteils, der gepuffert werden kann. Im Falle von Streaming kann dieser Wert kleiner als jener von MaxReceivedMessageSize sein. Ansonsten müssen beide Parameter dieselbe Größe aufweisen.

Nachdem eine HttpSelfHostConfiguration konfiguriert wurde, ist sie mittels OpenAsync zu starten. Ab diesem Zeitpunkt bietet sie die im aktuellen Projekt verfügbaren Services über die im Konstruktor definierte URL an. Soll die HttpSelfHostConfiguration auch Services aus referenzierten Projekten anbieten, sind diese in der vorliegenden BETA 1 vor dem Aufruf von OpenAsync manuell in den Speicher zu laden. Dazu genügt die Ermittlung deren Typen mittels typeof.

var config = new HttpSelfHostConfiguration("http://localhost:8080");
 
// HACK für MVC 4 BETA, Controller in Speicher laden ...
Type hc = typeof(HotelsController);
Type bc = typeof(BuchungenController);
 
config.Routes.MapHttpRoute(
    "API Default", "api/{controller}/{id}", 
    new { id = RouteParameter.Optional });
 
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
config.TransferMode = System.ServiceModel.TransferMode.Buffered; 
                          // Streamed, StreamedRequest, StreamedResponse
config.MaxReceivedMessageSize = 1000000;
config.MaxBufferSize = 1000000;
 
using (HttpSelfHostServer server = new HttpSelfHostServer(config)) { 
    server.OpenAsync().Wait(); 
    Console.WriteLine("Press Enter to quit."); 
    Console.ReadLine(); 
}