Hôte API Web ASP.NET 2 dans un rôle de travail Azure
par Mike Wasson
Ce tutoriel montre comment héberger des API Web ASP.NET dans un rôle de travail Azure, à l’aide d’OWIN pour héberger automatiquement l’infrastructure d’API web.
Open Web Interface for .NET (OWIN) définit une abstraction entre les serveurs web .NET et les applications web. OWIN dissocie l’application web du serveur, ce qui rend OWIN idéal pour auto-héberger une application web dans votre propre processus, en dehors d’IIS, par exemple, à l’intérieur d’un rôle de travail Azure.
Dans ce tutoriel, vous allez utiliser le package Microsoft.Owin.Host.HttpListener, qui fournit un serveur HTTP utilisé pour héberger automatiquement des applications OWIN.
Versions logicielles utilisées dans le tutoriel
Créer un projet Microsoft Azure
Démarrez Visual Studio avec des privilèges d’administrateur. Des privilèges d’administrateur sont nécessaires pour déboguer l’application localement, à l’aide de l’émulateur de calcul Azure.
Dans le menu Fichier , cliquez sur Nouveau, puis sur Projet. Dans Modèles installés, sous Visual C#, cliquez sur Cloud , puis sur Service cloud Windows Azure. Nommez le projet « AzureApp », puis cliquez sur OK.
Dans la boîte de dialogue Nouveau service cloud Azure Windows , double-cliquez sur Rôle de travail. Conservez le nom par défaut (« WorkerRole1 »). Cette étape ajoute un rôle de travail à la solution. Cliquez sur OK.
La solution Visual Studio créée contient deux projets :
- « AzureApp » définit les rôles et la configuration de l’application Azure.
- « WorkerRole1 » contient le code du rôle de travail.
En général, une application Azure peut contenir plusieurs rôles, bien que ce didacticiel utilise un seul rôle.
Ajouter l’API web et les packages OWIN
Dans le menu Outils , cliquez sur Gestionnaire de package NuGet, puis sur Console du Gestionnaire de package.
Dans la fenêtre Console du Gestionnaire de package, entrez la commande suivante :
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost
Ajouter un point de terminaison HTTP
Dans Explorateur de solutions, développez le projet AzureApp. Développez le nœud Rôles, cliquez avec le bouton droit sur WorkerRole1, puis sélectionnez Propriétés.
Cliquez sur Points de terminaison, puis sur Ajouter un point de terminaison.
Dans la liste déroulante Protocole , sélectionnez « http ». Dans Port public et Port privé, tapez 80. Ces derniers peuvent être différents. Le port public est ce que les clients utilisent lorsqu’ils envoient une demande au rôle.
Configurer l’API web pour Self-Host
Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet WorkerRole1 et sélectionnez Ajouter une / classe pour ajouter une nouvelle classe. Nommez la classe Startup
.
Remplacez tout le code réutilisable de ce fichier par les éléments suivants :
using Owin;
using System.Web.Http;
namespace WorkerRole1
{
class Startup
{
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute(
"Default",
"{controller}/{id}",
new { id = RouteParameter.Optional });
app.UseWebApi(config);
}
}
}
Ajouter un contrôleur d’API web
Ensuite, ajoutez une classe de contrôleur d’API web. Cliquez avec le bouton droit sur le projet WorkerRole1 et sélectionnez Ajouter une / classe. Nommez la classe TestController. Remplacez tout le code réutilisable de ce fichier par les éléments suivants :
using System;
using System.Net.Http;
using System.Web.Http;
namespace WorkerRole1
{
public class TestController : ApiController
{
public HttpResponseMessage Get()
{
return new HttpResponseMessage()
{
Content = new StringContent("Hello from OWIN!")
};
}
public HttpResponseMessage Get(int id)
{
string msg = String.Format("Hello from OWIN (id = {0})", id);
return new HttpResponseMessage()
{
Content = new StringContent(msg)
};
}
}
}
Par souci de simplicité, ce contrôleur définit simplement deux méthodes GET qui retournent du texte brut.
Démarrer l’hôte OWIN
Ouvrez le fichier WorkerRole.cs. Cette classe définit le code qui s’exécute lorsque le rôle de travail est démarré et arrêté.
Ajoutez les instructions using suivantes :
using Microsoft.Owin.Hosting;
Ajoutez un membre IDisposable à la WorkerRole
classe :
public class WorkerRole : RoleEntryPoint
{
private IDisposable _app = null;
// ....
}
Dans la OnStart
méthode, ajoutez le code suivant pour démarrer l’hôte :
public override bool OnStart()
{
ServicePointManager.DefaultConnectionLimit = 12;
// New code:
var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
string baseUri = String.Format("{0}://{1}",
endpoint.Protocol, endpoint.IPEndpoint);
Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri),
"Information");
_app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
return base.OnStart();
}
La méthode WebApp.Start démarre l’hôte OWIN. Le nom de la Startup
classe est un paramètre de type de la méthode. Par convention, l’hôte appelle la Configure
méthode de cette classe.
Remplacez le OnStop
pour supprimer le instance _app :
public override void OnStop()
{
if (_app != null)
{
_app.Dispose();
}
base.OnStop();
}
Voici le code complet pour WorkerRole.cs :
using Microsoft.Owin.Hosting;
using Microsoft.WindowsAzure.ServiceRuntime;
using System;
using System.Diagnostics;
using System.Net;
using System.Threading;
namespace WorkerRole1
{
public class WorkerRole : RoleEntryPoint
{
private IDisposable _app = null;
public override void Run()
{
Trace.TraceInformation("WebApiRole entry point called", "Information");
while (true)
{
Thread.Sleep(10000);
Trace.TraceInformation("Working", "Information");
}
}
public override bool OnStart()
{
ServicePointManager.DefaultConnectionLimit = 12;
var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
string baseUri = String.Format("{0}://{1}",
endpoint.Protocol, endpoint.IPEndpoint);
Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri),
"Information");
_app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
return base.OnStart();
}
public override void OnStop()
{
if (_app != null)
{
_app.Dispose();
}
base.OnStop();
}
}
}
Générez la solution, puis appuyez sur F5 pour exécuter l’application localement dans l’émulateur de calcul Azure. Selon les paramètres de votre pare-feu, vous devrez peut-être autoriser l’émulateur à passer par votre pare-feu.
Notes
Si vous obtenez une exception comme celle-ci, consultez ce billet de blog pour une solution de contournement. « Impossible de charger le fichier ou l’assembly 'Microsoft.Owin, Version=2.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' ou l’une de ses dépendances. La définition du manifeste de l’assembly situé ne correspond pas à la référence d’assembly. (Exception de HRESULT : 0x80131040) »
L’émulateur de calcul affecte une adresse IP locale au point de terminaison. Vous pouvez trouver l’adresse IP en affichant l’interface utilisateur de l’émulateur de calcul. Cliquez avec le bouton droit sur l’icône de l’émulateur dans la zone de notification de la barre des tâches, puis sélectionnez Afficher l’interface utilisateur de l’émulateur de calcul.
Recherchez l’adresse IP sous Déploiements de service, déploiement [id], Détails du service. Ouvrez un navigateur web et accédez à http:// address/test/1, où l’adresse est l’adresse IP attribuée par l’émulateur de calcul ; par exemple, http://127.0.0.1:80/test/1
. Vous devez voir la réponse du contrôleur d’API web :
Déployer sur Azure
Pour cette étape, vous devez disposer d’un compte Azure. Si vous n’en avez pas encore, vous pouvez créer un compte d’essai gratuit en quelques minutes. Pour plus d’informations, consultez Essai gratuit Microsoft Azure.
Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet AzureApp. Sélectionnez Publier.
Si vous n’êtes pas connecté à votre compte Azure, cliquez sur Se connecter.
Une fois connecté, choisissez un abonnement, puis cliquez sur Suivant.
Entrez un nom pour le service cloud et choisissez une région. Cliquez sur Créer.
Cliquez sur Publier.
Configuration d’un nom de domaine personnalisé pour un service cloud Azure (classique)