• Stars
    star
    1,460
  • Rank 32,218 (Top 0.7 %)
  • Language
    C#
  • License
    Other
  • Created almost 11 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A tiny, cross-platform, module based web server for .NET

Analytics Build status Buils status NuGet version NuGet BuiltWithDotnet Slack

EmbedIO

⭐ Please star this project if you find it useful!

This README is for EmbedIO v3.x. Click here if you are still using EmbedIO v2.x.

Overview

A tiny, cross-platform, module based, MIT-licensed web server for .NET Framework and .NET Core.

  • Written entirely in C#, using our helpful library SWAN
  • Network operations use the async/await pattern: Responses are handled asynchronously
  • Multiple implementations support: EmbedIO can use Microsoft HttpListener or internal Http Listener based on Mono/websocket-sharp projects
  • Cross-platform: tested on multiple OS and runtimes. From Windows .NET Framework to Linux MONO.
  • Extensible: Write your own modules -- For example, video streaming, UPnP, etc. Check out EmbedIO Extras for additional modules
  • Small memory footprint
  • Create REST APIs quickly with the out-of-the-box Web API module
  • Serve static or embedded files with 1 line of code (also out-of-the-box)
  • Handle sessions with the built-in LocalSessionWebModule
  • WebSockets support
  • CORS support. Origin, Header and Method validation with OPTIONS preflight
  • HTTP 206 Partial Content support
  • Support Xamarin Forms
  • And many more options in the same package

EmbedIO 3.0 - What's new

The major version 3.0 includes a lot of changes in how the webserver process the incoming request and the pipeline of the Web Modules. You can check a complete list of changes and a upgrade guide for v2 users here.

Some usage scenarios:

  • Write a cross-platform GUI entirely using React/AngularJS/Vue.js or any Javascript framework
  • Write a game using Babylon.js and make EmbedIO your serve your code and assets
  • Create GUIs for Windows services or Linux daemons
  • Works well with LiteLib - add SQLite support in minutes!
  • Write client applications with real-time communication between them using WebSockets
  • Write internal web server for Xamarin Forms applications

Installation:

You can start using EmbedIO by just downloading the nuget.

Package Manager

PM> Install-Package EmbedIO

.NET CLI

> dotnet add package EmbedIO

Usage

Working with EmbedIO is pretty simple, check the follow sections to start coding right away. You can find more useful recipes and implementation details in the Cookbook.

WebServer Setup

Please note the comments are the important part here. More info is available in the samples.

namespace Unosquare
{
    using System;
    using EmbedIO;
    using EmbedIO.WebApi;

    class Program
    {
        /// <summary>
        /// Defines the entry point of the application.
        /// </summary>
        /// <param name="args">The arguments.</param>
        static void Main(string[] args)
        {
            var url = "http://localhost:9696/";
            if (args.Length > 0)
                url = args[0];

            // Our web server is disposable.
            using (var server = CreateWebServer(url))
            {
                // Once we've registered our modules and configured them, we call the RunAsync() method.
                server.RunAsync();

                var browser = new System.Diagnostics.Process()
                {
                    StartInfo = new System.Diagnostics.ProcessStartInfo(url) { UseShellExecute = true }
                };
                browser.Start();
                // Wait for any key to be pressed before disposing of our web server.
                // In a service, we'd manage the lifecycle of our web server using
                // something like a BackgroundWorker or a ManualResetEvent.
                Console.ReadKey(true);
            }
        }
	
	// Create and configure our web server.
        private static WebServer CreateWebServer(string url)
        {
            var server = new WebServer(o => o
                    .WithUrlPrefix(url)
                    .WithMode(HttpListenerMode.EmbedIO))
		 // First, we will configure our web server by adding Modules.
                .WithLocalSessionManager()
                .WithWebApi("/api", m => m
                    .WithController<PeopleController>())
                .WithModule(new WebSocketChatModule("/chat"))
                .WithModule(new WebSocketTerminalModule("/terminal"))
                .WithStaticFolder("/", HtmlRootPath, true, m => m
                    .WithContentCaching(UseFileCache)) // Add static files after other modules to avoid conflicts
                .WithModule(new ActionModule("/", HttpVerbs.Any, ctx => ctx.SendDataAsync(new { Message = "Error" })));

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

            return server;
        }
    }
}

Reading from a POST body as a dictionary (application/x-www-form-urlencoded)

For reading a dictionary from an HTTP Request body inside a WebAPI method you can add an argument to your method with the attribute FormData.

    [Route(HttpVerbs.Post, "/data")]
    public async Task PostData([FormData] NameValueCollection data) 
    {
        // Perform an operation with the data
        await SaveData(data);
    }

Reading from a POST body as a JSON payload (application/json)

For reading a JSON payload and deserialize it to an object from an HTTP Request body you can use GetRequestDataAsync. This method works directly from IHttpContext and returns an object of the type specified in the generic type.

    [Route(HttpVerbs.Post, "/data")]
    public async Task PostJsonData() 
    {
        var data = HttpContext.GetRequestDataAsync<MyData>();
	
        // Perform an operation with the data
        await SaveData(data);
    }

Reading from a POST body as a FormData (multipart/form-data)

EmbedIO doesn't provide the functionality to read from a Multipart FormData stream. But you can check the HttpMultipartParser Nuget and connect the Request input directly to the HttpMultipartParser, very helpful and small library.

A sample code using the previous library:

    [Route(HttpVerbs.Post, "/upload")]
    public async Task UploadFile()
    {
        var parser = await MultipartFormDataParser.ParseAsync(Request.InputStream);
        // Now you can access parser.Files
    }

There is another solution but it requires this Microsoft Nuget.

Writing a binary stream

You can open the Response Output Stream with the extension OpenResponseStream.

    [Route(HttpVerbs.Get, "/binary")]
    public async Task GetBinary() 
    {
	// Call a fictional external source
	using (var stream = HttpContext.OpenResponseStream())
                await stream.WriteAsync(dataBuffer, 0, 0);
    }

WebSockets Example

Working with WebSocket is pretty simple, you just need to implement the abstract class WebSocketModule and register the module to your Web server as follow:

server..WithModule(new WebSocketChatModule("/chat"));

And our web sockets server class looks like:

namespace Unosquare
{
    using EmbedIO.WebSockets;

    /// <summary>
    /// Defines a very simple chat server.
    /// </summary>
    public class WebSocketsChatServer : WebSocketModule
    {
        public WebSocketsChatServer(string urlPath)
            : base(urlPath, true)
        {
            // placeholder
        }

        /// <inheritdoc />
        protected override Task OnMessageReceivedAsync(
            IWebSocketContext context,
            byte[] rxBuffer,
            IWebSocketReceiveResult rxResult)
            => SendToOthersAsync(context, Encoding.GetString(rxBuffer));

        /// <inheritdoc />
        protected override Task OnClientConnectedAsync(IWebSocketContext context)
            => Task.WhenAll(
                SendAsync(context, "Welcome to the chat room!"),
                SendToOthersAsync(context, "Someone joined the chat room."));

        /// <inheritdoc />
        protected override Task OnClientDisconnectedAsync(IWebSocketContext context)
            => SendToOthersAsync(context, "Someone left the chat room.");

        private Task SendToOthersAsync(IWebSocketContext context, string payload)
            => BroadcastAsync(payload, c => c != context);
    }
}

Support for SSL

Both HTTP listeners (Microsoft and Unosquare) can open a web server using SSL. This support is for Windows only (for now) and you need to manually register your certificate or use the WebServerOptions class to initialize a new WebServer instance. This section will provide some examples of how to use SSL but first a brief explanation of how SSL works on Windows.

For Windows Vista or better, Microsoft provides Network Shell (netsh). This command line tool allows to map an IP-port to a certificate, so incoming HTTP request can upgrade the connection to a secure stream using the provided certificate. EmbedIO can read or register certificates to a default store (My/LocalMachine) and use them against a netsh sslcert for binding the first https prefix registered.

For Windows XP and Mono, you can use manually the httpcfg for registering the binding.

Using a PFX file and AutoRegister option

The more practical case to use EmbedIO with SSL is the AutoRegister option. You need to create a WebServerOptions instance with the path to a PFX file and the AutoRegister flag on. This options will try to get or register the certificate to the default certificate store. Then it will use the certificate thumbprint to register with netsh the FIRST https prefix registered on the options.

Using AutoLoad option

If you already have a certificate on the default certificate store and the binding is also registered in netsh, you can use Autoload flag and optionally provide a certificate thumbprint. If the certificate thumbprint is not provided, EmbedIO will read the data from netsh. After getting successfully the certificate from the store, the raw data is passed to the WebServer.

Related Projects and Nugets

Name Author Description
Butterfly.EmbedIO Fireshark Studios, LLC Implementation of Butterfly.Core.Channel and Butterfly.Core.WebApi using the EmbedIO server
embedio-cli Unosquare A dotnet global tool that enables start any web folder or EmbedIO assembly (WebAPI or WebSocket) from command line.
EmbedIO.BearerToken Unosquare Allow to authenticate with a Bearer Token. It uses a Token endpoint (at /token path) and with a defined validation delegate create a JsonWebToken. The module can check all incoming requests or a paths
EmbedIO.LiteLibWebApi Unosquare Allow to expose a sqlite database as REST api using EmbedIO WebApi and LiteLib libraries
EmbedIO.OWIN Unosquare EmbedIO can use the OWIN platform in two different approach: You can use EmbedIO as OWIN server and use all OWIN framework with EmbedIO modules.
Microsoft.AspNetCore.Server.EmbedIO Dju EmbedIO web server support for ASP.NET Core, as a drop-in replacement for Kestrel
SambaFetcher nddipiazza A .NET tool to connect a web server with Samba

Special Thanks

YourKit

To YourKit for supports open source projects with its full-featured .NET Profiler, an amazing tool to profile CPU and Memory!

More Repositories

1

ffmediaelement

FFME: The Advanced WPF MediaElement (based on FFmpeg)
C#
1,172
star
2

passcore

A self-service password management tool for Active Directory
C#
1,031
star
3

raspberryio

The Raspberry Pi's IO Functionality in an easy-to-use API for Mono/.NET/C#
C#
673
star
4

swan

Swan stands for Stuff We All Need. Unosquare's collection of C# extension methods and classes.
C#
262
star
5

tubular-react

Material UI table with local or remote data-source. Featuring filtering, sorting, free-text search, export to CSV locally, and aggregations.
TypeScript
205
star
6

sshdeploy

A command-line tool that enables quick build and run deployments over SSH.
C#
141
star
7

wiringpi-dotnet

Provides complete managed access to the popular wiringpi C library
C#
68
star
8

litelib

A cool little wrapper in Entity Framework style for SQLite based on Dapper
C#
63
star
9

pigpio-dotnet

Provides complete managed access to the popular pigpio C library
C
61
star
10

embedio-extras

Additional Modules showing how to extend EmbedIO.
C#
44
star
11

tubular

A set of AngularJS directives designed to rapidly build modern web applications
JavaScript
44
star
12

uno-react

Common functions, HOCs and hooks for React.
TypeScript
28
star
13

swan-aspnetcore

SWAN ASP.NET Core
C#
28
star
14

uno-material-ui

Components and extensions for Material UI
TypeScript
25
star
15

libfprint-cs

The long-awaited C# (.net/mono) wrapper for the great fprint library
C#
20
star
16

best-practices

Unosquare Labs Best Practices
JavaScript
19
star
17

tubular-dotnet

Tubular .NET Library
C#
18
star
18

ffplaydotnet

A port of FFmpeg's FFplay.c
C#
16
star
19

embedio-cli

EmbedIO CLI - .NET Core Global tool
C#
13
star
20

tubular2

Tubular for Angular 7
TypeScript
13
star
21

ef-enterpriseextensions

EntityFramework.EnterpriseExtensions Library
C#
12
star
22

sparkfunfingerprint

SparkFun Fingerprint Reader Interfacing Library for .NET Framework and .NET Core
C#
11
star
23

tenantcore

TenantCore, OWIN multitenancy
C#
10
star
24

wsfingerprint

WaveShare Fingerprint Reader Interfacing Library for .NET
C#
10
star
25

uno-js

Unosquare Typescript/JavaScript Library
TypeScript
10
star
26

tubular-common

Tubular Common Models and Data Transformer
TypeScript
10
star
27

ledemotion

LED Emotion
JavaScript
10
star
28

tubular-aspnet-core-boilerplate

Tubular ASP.NET Core Boilerplate
HTML
8
star
29

tubular-nodejs

Tubular Node.js backend
JavaScript
8
star
30

tubular-boilerplate-csharp

Tubular Boilerplate C#
JavaScript
7
star
31

unosquare.github.io

Main GitHub Pages repository
HTML
7
star
32

pocodata

The no-frills micro ORM for SQL Server
C#
7
star
33

redminetime

A Redmine time entries logger for Windows
C#
6
star
34

entityframework-specification

Unosquare EntityFramework Specification
C#
6
star
35

tubular-boilerplate

Tubular Directives Boilerplate (includes AngularJS and Bootstrap)
HTML
6
star
36

tsrelay

TinySine USB/Wireless Relay Module TOSR1x - Interfacing Library for .NET
C#
5
star
37

unolabs-pi

UnoLabs Raspberry Pi Demo
JavaScript
5
star
38

uno-dashboard-ux

Unosquare Dashboard UX/UI Components
TypeScript
4
star
39

tubular-fabric

Tubular for Office UI Fabric
TypeScript
3
star
40

.github

2
star
41

tubular-react-common

Tubular React Common functions and hooks
TypeScript
2
star
42

eslint-config-unosquare

Eslint Config Unosquare
JavaScript
1
star
43

swan-ldap

SWAN LDAP Client
C#
1
star