Host ASP.NET Web API 2 en un rol de trabajo de Azure

por Mike Wasson

En este tutorial se muestra cómo hospedar ASP.NET Web API en un rol de trabajo de Azure, usando OWIN para autohospedar el marco de API Web.

Open Web Interface for .net (OWIN) define una abstracción entre los servidores Web .net y las aplicaciones Web. OWIN desacopla la aplicación web del servidor, lo que hace que OWIN sea ideal para hospedar automáticamente una aplicación web en su propio proceso, fuera de IIS, por ejemplo, dentro de un rol de trabajo de Azure.

En este tutorial, usará el paquete Microsoft. Owin. host. HttpListener, que proporciona un servidor HTTP que se usa para aplicaciones OWIN de autohospedar.

Versiones de software usadas en el tutorial

Creación de un proyecto de Microsoft Azure

Inicie Visual Studio con privilegios de administrador. Se necesitan privilegios de administrador para depurar la aplicación localmente, mediante el emulador de proceso de Azure.

En el menú archivo , haga clic en nuevo y, a continuación, haga clic en proyecto. En plantillas instaladas, en Visual C#, haga clic en nube y, a continuación, haga clic en servicio en la nube de Windows Azure. Asigne al proyecto el nombre "AzureApp" y haga clic en Aceptar.

En el cuadro de diálogo nuevo servicio en la nube de Windows Azure , haga doble clic en rol de trabajo. Deje el nombre predeterminado ("WorkerRole1"). En este paso se agrega un rol de trabajo a la solución. Haga clic en OK.

La solución de Visual Studio que se crea contiene dos proyectos:

  • "AzureApp " define los roles y la configuración de la aplicación de Azure.
  • "WorkerRole1 " contiene el código para el rol de trabajo.

En general, una aplicación de Azure puede contener varios roles, aunque en este tutorial se usa un único rol.

Incorporación de la API Web y los paquetes OWIN

En el menú herramientas , haga clic en Administrador de paquetes NuGet y luego en consola del administrador de paquetes.

En la ventana Package Manager Console, escriba el siguiente comando:

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

Agregar un punto de conexión HTTP

En Explorador de soluciones, expanda el proyecto AzureApp. Expanda el nodo roles, haga clic con el botón secundario en WorkerRole1 y seleccione propiedades.

Haga clic en Extremos y, a continuación, en Agregar extremo.

En la lista desplegable Protocolo , seleccione "http". En puerto público y puerto privado, escriba 80. Estos números de puerto pueden ser diferentes. El puerto público es lo que los clientes usan cuando envían una solicitud al rol.

Configuración de la API Web para Self-Host

En explorador de soluciones, haga clic con el botón derecho en el proyecto WorkerRole1 y seleccione Agregar / clase para agregar una nueva clase. Asigne Startup como nombre de la clase.

Reemplace todo el código reutilizable de este archivo por lo siguiente:

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);
        }
    }
}

Incorporación de un controlador de API Web

A continuación, agregue una clase de controlador de API Web. Haga clic con el botón derecho en el proyecto WorkerRole1 y seleccione Agregar / clase. Asigne a la clase el nombre TestController. Reemplace todo el código reutilizable de este archivo por lo siguiente:

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)
            };
        }
    }
}

Para simplificar, este controlador solo define dos métodos GET que devuelven texto sin formato.

Inicio del host OWIN

Abra el archivo WorkerRole.cs. Esta clase define el código que se ejecuta cuando se inicia y se detiene el rol de trabajo.

Agregue la siguiente instrucción using:

using Microsoft.Owin.Hosting;

Agregue un miembro IDisposable a la WorkerRole clase:

public class WorkerRole : RoleEntryPoint
{
    private IDisposable _app = null;

    // ....
}

En el OnStart método, agregue el siguiente código para iniciar el host:

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();
}

El método webapp. Start inicia el host OWIN. El nombre de la Startup clase es un parámetro de tipo para el método. Por Convención, el host llamará al Configure método de esta clase.

Invalide OnStop para eliminar la instancia de la _ aplicación :

public override void OnStop()
{
    if (_app != null)
    {
        _app.Dispose();
    }
    base.OnStop();
}

Este es el código completo de 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();
        }
    }
}

Compile la solución y presione F5 para ejecutar la aplicación localmente en el emulador de proceso de Azure. En función de la configuración del firewall, es posible que deba permitir el emulador a través del firewall.

Note

Si recibe una excepción como la siguiente, consulte esta entrada de blog para obtener una solución alternativa. "No se pudo cargar el archivo o ensamblado ' Microsoft. Owin, version = 2.0.2.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35 ' o una de sus dependencias. La definición del manifiesto del ensamblado encontrado no coincide con la referencia de ensamblado. (Excepción de HRESULT: 0x80131040) "

El emulador de proceso asigna una dirección IP local al extremo. Puede encontrar la dirección IP visualizando la interfaz de usuario del emulador de proceso. Haga clic con el botón derecho en el icono del emulador en el área de notificación de la barra de tareas y seleccione Mostrar interfaz de usuario del emulador de proceso.

Busque la dirección IP en implementaciones de servicio, implementación [id], detalles del servicio. Abra un explorador Web y vaya a ladirecciónhttp:///Test/1, donde Dirección es la dirección IP asignada por el emulador de proceso. por ejemplo, http://127.0.0.1:80/test/1 . Debería ver la respuesta del controlador de API Web:

Implementar en Azure

En este paso, debe tener una cuenta de Azure. Si aún no tiene una, puede crear una cuenta de evaluación gratuita en un par de minutos. Para obtener más información, consulte evaluación gratuita de Microsoft Azure.

En Explorador de soluciones, haga clic con el botón secundario en el proyecto AzureApp. Seleccione Publicar.

Si no ha iniciado sesión en su cuenta de Azure, haga clic en iniciar sesión.

Una vez iniciada la sesión, elija una suscripción y haga clic en siguiente.

Escriba un nombre para el servicio en la nube y elija una región. Haga clic en Crear.

Haga clic en Publicar.

La ventana registro de actividad de Azure muestra el progreso de la implementación. Cuando se implemente la aplicación, vaya a http://appname.cloudapp.net/test/1 .

Recursos adicionales