[NET CORE] Instalar y Configurar ASP.NET CORE bajo Ubuntu 16.04

Siguiendo con la serie de artículos dedicada a la integración de .NET con linux, vamos a ver como instalar .NET Core bajo la distribución Ubuntu de Linux y configurar un sitio web usando el servidor web Kestrel (usado para fines de testeo y desarrollo). Nota: En un articulo posterior veremos como usar un servidor web de tipo NGINX.

Actualmente las distribuciones de linux compatibles con .Net Core son:

– Ubuntu 14.04
– Ubuntu 16.04
– Red Had Enterprise Linux 7 Server
– Debian 8
– Fedora 23
– CentOS 7.1
– OpenSUSE 13.2

Para este artículo vamos a instalar la versión 16.04 LTS de Ubuntu sobre una máquina virtual HyperV.

Antes de poder alojar una web usando ASP.NET CORE, hay que instalar .NET CORE. Los pasos a seguir son:

  1. Configuramos el repositorio apt-get que aloja los paquetes necesarios para .Net Core
    sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893
    sudo apt-get update
    

  2. Instalamos la última versión de .Net Core.
    sudo apt-get install dotnet-dev-1.0.0-preview2.1-003177
    


  3. Verificamos la versión que tenemos instalada lanzando el comando
    dotnet --version
    

    o también

    dotnet --info
    

Ahora vamos a crear un sencillo ejemplo para testear el funcionamiento de .Net Core.

  1. Creamos un proyecto básico .Net Core lanzando el siguiente comando
    dotnet new
    

    Este comando creará 2 archivos

    • Program.cs
      using System;
      
      namespace ConsoleApplication
      {
          public class Program
          {
              public static void Main(string[] args)
              {
                  Console.WriteLine("Hello World!");
              }
          }
      }
      
    • project.json
      {
        "version": "1.0.0-*",
        "buildOptions": {
          "debugType": "portable",
          "emitEntryPoint": true
        },
        "dependencies": {},
        "frameworks": {
          "netcoreapp1.1": {
            "dependencies": {
              "Microsoft.NETCore.App": {
                "type": "platform",
                "version": "1.1.0"
              }
            },
            "imports": "dnxcore50"
          }
        }
      }
      

      Este fichero contiene las referencias NuGet de nuestro proyecto.

    Nota: Como vemos, es un sencillo ejemplo que muestra el típico “Hello World” en la consola.

  2. Restauramos las dependencias del proyecto lanzando el comando
    dotnet restore
    

  3. Compilamos y ejecutamos el proyecto lanzando el comando
    dotnet run
    

En este punto ya hemos comprobado que tenemos instalado correctamente .Net Core.

Ahora vamos a crear un proyecto de prueba de tipo web usando el comando

dotnet new -t web

Este comando generará un sitio web cuya estructura de carpetas la podemos ver en la siguiente imagen

En este caso, el contenido del fichero Program.cs es

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;

namespace WebApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

            host.Run();
        }
    }
}

Nota: Observa como el método “UseKestrel” indica que se usará el servidor web kestrel.

mientras que el contenido del fichero project.json es

{
  "userSecretsId": "aspnet-WebApplication-0799fe3e-6eaf-4c5f-b40e-7c6bfd5dfa9a",

  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.1.0-preview1-001153-00",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0",
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.0.0",
    "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",
    "Microsoft.AspNetCore.Mvc": "1.0.1",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Routing": "1.0.1",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0",
    "Microsoft.EntityFrameworkCore.Sqlite": "1.0.1",
    "Microsoft.EntityFrameworkCore.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0",
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview2-update1",
      "type": "build"
    },
    "Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
      "version": "1.0.0-preview2-update1",
      "type": "build"
    }
  },

  "tools": {
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview2-final",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.0.0-preview2-final",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.EntityFrameworkCore.Tools": {
      "version": "1.0.0-preview2-final",
      "imports": [
        "portable-net45+win8+dnxcore50",
        "portable-net45+win8"
      ]
    },
    "Microsoft.Extensions.SecretManager.Tools": {
      "version": "1.0.0-preview2-final",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview2-final",
      "imports": [
        "portable-net45+win8+dnxcore50",
        "portable-net45+win8"
      ]
    }
  },

  "frameworks": {
    "netcoreapp1.1": {
      "imports": [
        "dotnet5.6",
        "dnxcore50",
        "portable-net45+win8"
      ]
    }
  },

  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "**/*.cshtml",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  },

  "tooling": {
    "defaultNamespace": "WebApplication"
  }
}

El cual indica que este proyecto web usa npm, gulp y bower. Si no están instalados, es necesario ejecutar los siguientes comandos:

  • Instalamos el gestor de paquetes NPM
    sudo apt-get install npm
    
  • Usamos el gestor de paquetes NPM para instalar GULP (facilita la automatizacion tareas comunes de desarrollo como minificacion, recarga del navegador, compresion de imagenes, validacion de sintaxis…
    sudo npm install gulp
    
  • Usamos el gestor de paquetes NPM para instalar bower (es un gestor de paquetes de tipo javascript y css)
    sudo npm install bower
    

Una vez instalados estos componentes ya podemos restaurar las dependencias del proyecto ejecutando el comando

dotnet restore

Por último, compilamos y ejecutamos el proyecto lanzando el comando

dotnet run

En la imagen anterior se indica que el sitio web esta disponible a través de la url http://localhost:5000

Para cambiar la url, podemos añadir el método UseUrls

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;

namespace WebApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseUrls("http://locahost:8080")
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

            host.Run();
        }
    }
}

Para propósitos de desarrollo, esta muy bien, pero lo importante es poder hospedarlo en un servidor web tipo NGINX o APACHE. En un articulo futuro veremos como hospedarlo en un servidor web tipo NGINX.

Hata ahora hemos trabajado con proyectos .Net Core generados automaticamente por “dotnet”, pero como es logico podemos crear el proyecto desde Windows usando Visual Studio.

Ahora vamos a crear un proyecto web ASP.NET CORE

Vamos a seleccionar la opcion “aplicacion web” sin autentificacion

En la siguiente imagen, se puede ver el aspecto del explorador de soluciones

Editamos el fichero “project.json” para modificar la versión del paquete “Microsoft.NETCore.App”. Por defecto, la versión usada es la 1.0.1, mientras que la que hemos instalado en Ubuntu es la versión 1.1.0 (última versión disponible mientras se escribía este articulo)

    "Microsoft.NETCore.App": {
      "version": "1.1.0",
      "type": "platform"
    },

Nota: observa que la versión 1.1.0 es la disponible mientras se escribia este articulo.

Ahora vamos a volver a nuestra maquina virtual linux, para crear una carpeta donde alojar nuestro sitio web.

cd /home/sergio/PruebasNetCore
mkdir aspcore

Antes de publicar sobre la máquina Linux, debemos configurarla para transferir archivos desde Windows. Para ello podemos usar Samba, FTP… En el siguiente articulo vamos a configurar Samba bajo Linux.

y por último, vamos a publicar nuestro proyecto directamente sobre la ruta \\[IP LINUX]\[RECURSOCOMPARTIDO]\

Una vez completada la publicación, volvemos a la consola de ubuntu (nos situamos sobre la carpeta que contiene los archivos publicados) y ejecutamos el comando

dotnet [NombreProyecto.dll]

en nuestro caso el proyecto se llama WebApplication1, por lo que el comando a ejecutar es

dotnet WebApplication1.dll