PDMLab Blog

ASP.NET Web API, MVC, RavenDB, Windows Azure, JavaScript / NodeJS und Xamarin im Alltag...

ASP.NET Web API mit OWIN in Windows Azure Worker Role hosten

Geschrieben von: Alexander Zeitler

Mit dem Release von ASP.NET Web API 2 wurde auch OWIN 1.0 released. OWIN bietet neben dem IIS und dem bisher bekannten SelfHosting von ASP.NET Web API eine weitere Hosting-Möglichkeit für .NET-basierte Web-Frameworks an.

Dieser Blog-Post zeigt, wie man ASP.NET Web API 2-Anwendungen mit OWIN in einer Windows Azure Worker Role hosten kann.

Voraussetzungen

Voraussetzung für das Entwickeln einer Web API für eine Azure Worker Role ist die Installation des Windows Azure SDK für .NET.

Worker Role anlegen

In Visual Studio (2012 oder höher) legt man zunächst ein neues Projekt vom Typ “Cloud / Windows Azure Cloud Service“ an.

Projekt anlegen

Im danach erscheinenden Dialog wählt man dann “Worker Role“ und fügt sie zur rechten Liste “Windows Azure Cloud Service solution“ hinzu. Danach kann man sie noch umbenennen, z.B. in “WebApiOwinAzureWorkerRole“:

Worker Role

Anschließend öffnet man die Eigenschaften der Worker Role:

Worker Role

Im Reiter “Endpoints“ fügt man mittels “Add Enpoint“ einen neuen Endpunkt vom Type “Input“ für das Protokoll “http“ mit dem Public Port “80“ und dem Private Port “80“ hinzu (der Name kann frei gewählt werden) - hierdurch ist die Web API über HTTP in der Worker Role erreichbar:

Worker Role

ASP.NET Web API und OWIN

Bevor wir nun die ASP.NET Web API Controller implementieren können, müssen wir zunächst ASP.NET Web API per NuGet Package installieren.

Normalerweise verwendet man hierzu das Package “Microsoft.AspNet.WebApi.Core”.

Da wir ASP.NET Web API allerdings mittels OWIN in unserer Worker Role hosten möchten, verwenden wir das Package “Install-Package Microsoft.AspNet.WebApi.OwinSelfHost”, welches neben den ASP.NET Web API Packages auch noch die Packages für OWIN und die Integration von ASP.NET Web API in OWIN beinhaltet.

Das Package wird in gewohnter Manier mittels

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

in der Package Manager Console (oder über die Package Manager UI) installiert.

Implementierung

Zunächst implementieren wir einen einfachen Controller:

Anschließend wird die für die Startup-Klasse für den OWIN-Host implementiert:

Zum Schluß muß die von Visual Studio angelegte WorkerRole.cs noch entsprechend angepasst werden:

Testing, Deployment und mögliche Probleme

Die Worker Role kann nun entweder mit dem Windows Azure Compute Emulator getestet werden (Visual Studio als Administrator starten und F5 drücken) oder wie gewohnt in Windows Azure deployed werden.

Testet man die Worker Role mit dem Compute Emulator, kann man die API unter der vom Emulator erzeugten Test-URL aufrufen:

Azure Compute Emulator

Ein Aufruf im Browser erzeugt das erwartete Resultat:

Web API Aufruf in Chrome

Verwendet man die o.g. NuGet-Packages kann beim Testen oder Deployment beim Starten der Worker Role folgende Exception auftreten:

{"Could not load file or assembly 'Microsoft.Owin, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)":"Microsoft.Owin, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"}

Dies rührt daher, dass die Microsoft.Owin-DLL per NuGet in der Version 2.0.2.0 installiert wird, die anderen Assemblies aber die Version 2.0.0.0 erwarten.

Dies lässt sich über einen Binding-Redirect in der app.config lösen:

Alternativ kann man auch die Packages manuell in den korrekten Versionen installieren.

Fazit

Mit OWIN und der Integration von OWIN als ASP.NET Web API Middleware hat Microsoft eine sehr elegante Möglichkeit geschaffen, ASP.NET Web API in Windows Azure Worker Roles zu hosten.

Beispiel-Code

Der Code aus dem Beispiel kann bei GitHub heruntergeladen werden.

blog comments powered by Disqus