embedio-una-libreria-en-c-para-crear-un-servidor-http-para-net

EmbedIO, librería en C# para crear un servidor HTTP en .NET

EmbedIO es un pequeño servidor multiplafatorma para .Net Framework y .Net Core que podemos añadir en proyectos que reciben peticiones HTTP pero sin la necesidad de un servidor web completo.

EmbedIO está escrito totalmente en C#, y su desarrollo está centrado en conseguir una alta eficiencia con un pequeño consumo de memoria. Todas las operaciones están disponibles en versión asíncrona.

Se distribuye bajo licencia MIT, y todo el código y la documentación está disponible en https://github.com/unosquare/embedio. Embed IO es compatible con .NET para Windows, Mono y Xamarin.

Instalar EmbedIO

La librería EmbedIO se distribuye como un paquete Nutget, por lo que añadirla a nuestro proyecto es tan sencillo como hacer:

Install-Package EmbedIO

Ejemplo de uso de EmbedIO

Vamos a hacer un pequeño ejemplo para ilustrar el uso de EmbedIO. Para ello, creamos una simple aplicación de consola, y sustituimos el código por el siguiente.

internal static class Program
{
  [STAThread]
  private static void Main()
  {
    var url = "http://localhost:9696/";

    using (WebServer server = CreateWebServer(url))
    {
      server.RunAsync();
    }

    Console.ReadKey(true);
  }

  // Create and configure our web server.
  private static WebServer CreateWebServer(string url)
  {
    WebServer server = new WebServer(o => o
        .WithUrlPrefix(url)
        .WithMode(HttpListenerMode.EmbedIO))
        .WithLocalSessionManager()
        .WithAction("/test", HttpVerbs.Any, ctx =>
        {
          Console.WriteLine("Request received");
          return ctx.SendDataAsync(new { mensaje = "Hola mundo"});
        }
      );

    // Listen for state changes.
    server.StateChanged += (s, e) => $"WebServer New State - {e.NewState}".Info();

    return server;
  }
}

Así de sencillo podemos crear un Endpoint para la Url http://localhost:9696/test, que devuelva un fichero Json con “Hola mundo”, y que muestra por consola que ha recibido una petición.

También es muy sencillo crear controllers y asociarlos para crear un API. Por ejemplo,

internal class Program
{
    static async Task Main(string[] args)
    {
        var url = "http://localhost:9696/";        
        var server = CreateWebServer(url);
        await server.RunAsync();
    }

    private static WebServer CreateWebServer(string url)
    {
        WebServer server = new WebServer(o => o
            .WithUrlPrefix(url)
            .WithMode(HttpListenerMode.EmbedIO))
            .WithLocalSessionManager()
            .WithWebApi("/api", m => m.WithController<HelloController>());  

        // Listen for state changes.
        server.StateChanged += (s, e) => $"WebServer New State - {e.NewState}".Info();

        return server;
    }
}

public class HelloController : WebApiController
{
    [Route(HttpVerbs.Get, "/hello")]
    public string GetGreeting() => "Hola, mundo!";
}

En un ejemplo real, por supuesto, el servidor realizaría las acciones necesarias, y los datos que se devolverían serían, por ejemplo, cargados de un origen de datos.

Por supuesto, es solo un pequeño ejemplo de lo que puede hacer EmbedIO. También podemos servir páginas estáticas, gestionar sesiones de usuario, emplear Websockets. Además, incorpora soporte para Cors.

Además, tiene un interesante módulo para configurar un API Rest completo de forma sencilla. Literalmente podemos generar un API Rest en minutos.

Finalmente, es extensible. Su diseño modular permite que podamos añadir nuestros propios módulos, por ejemplo, para configurar un middle ware.

En resumen una librería muy interesante que, si bien es cierto que no encaja en todos los proyectos, puede ser de utilidad en aquellas Apps que requieran atender peticiones HTTP de forma sencilla y eficiente.