Partager via


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.

Capture d’écran de la boîte de dialogue « Nouveau projet », mettant en évidence les étapes des options de menu pour créer un projet Azure App.

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.

Capture d’écran de la boîte de dialogue « Nouveau service cloud Azure Windows », montrant les options de menu permettant de créer un rôle de travail.

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.

Capture d’écran de la fenêtre de l’Explorateur de solutions, mettant en surbrillance le nouveau projet Azure App et montrant l’option nom de l’application et rôle de travail sous celle-ci.

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.

Capture d’écran du menu de la fenêtre de l’Explorateur de solutions, mettant en évidence les étapes permettant de sélectionner les paramètres de propriété du rôle de travail.

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.

Capture d’écran des options de menu déroulant de protocole qui montrent les différentes configurations de service et les choix de point de terminaison.

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.

Capture d’écran de la fenêtre de l’Explorateur de solutions, montrant les options de menu et mettant en surbrillance le chemin d’accès à l’ajout d’une classe.

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.

Capture d’écran de l’U I de l’émulateur de calcul Azure, montrant le menu et les informations d’adresse du point de terminaison I P, lors de la sélection de l’option « Détails du service ».

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 :

Capture d’écran de la fenêtre du navigateur montrant la réponse du contrôleur Web A P I après avoir mis l’adresse IP affectée par l’émulateur de calcul.

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.

Capture d’écran des options de menu de la fenêtre de l’Explorateur de solutions, qui met en évidence les étapes à suivre pour déployer ou publier le projet.

Si vous n’êtes pas connecté à votre compte Azure, cliquez sur Se connecter.

Capture d’écran de la boîte de dialogue « publier l’application Azure », qui demande une option de connexion avant que d’autres options ne soient disponibles.

Une fois connecté, choisissez un abonnement, puis cliquez sur Suivant.

Capture d’écran de la « publication de l’application Azure » après la connexion, invitant l’utilisateur à choisir un type d’abonnement avant de passer à l’étape suivante.

Entrez un nom pour le service cloud et choisissez une région. Cliquez sur Créer.

Capture d’écran de la boîte de dialogue « Créer un service cloud et un compte de stockage », demandant à l’utilisateur d’entrer un nom et une région pour le service de son application.

Cliquez sur Publier.

Capture d’écran de la fenêtre « publier l’application Azure », confirmant toutes les sélections de paramètres effectuées et fournissant des options de bouton pour revenir en arrière ou publier.

Configuration d’un nom de domaine personnalisé pour un service cloud Azure (classique)

Ressources supplémentaires