Step by step: Running ASP.NET Core on Raspberry Pi

by Carlos Mendible on 21 Mar 2017 » dotNet, dotNetCore

After reading .NET Core on Raspberry Pi and successfully running a console application on Windows 10 IoT Core on my Raspberry Pi 3 I decided to write: Step by step: Running ASP.NET Core on Raspberry Pi.

First be aware of the following prerequisites:

Now let’s start:

1. Create a folder for your new project

Open a command prompt an run

mkdir aspnet.on.rpi
cd aspnet.on.rpi
code .

2. Create a global.json file

To specify the correct sdk create a global.json with the following contents

    "sdk": {
        "version": "2.0.0-preview1-005448"

3. Create the ASP.NET Core project

Create the ASP.NET Core project with the following command:

dotnet new mvc

4. Modify the project file

Modify the aspnet.on.rpi.csproj to add the correct OutputType, TargetFramework, RuntimeFrameworkVersionand RuntimeIdentifiers

<Project Sdk="Microsoft.NET.Sdk.Web">


    <PackageReference Include="Microsoft.AspNetCore" Version="1.0.3" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.0.2" />
    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.0.1" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.0.1" />
    <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.0.1" />
    <PackageReference Include="Libuv" Version="1.10.0-preview1-22036" />

5. Add a Nuget.config file and restore packages

Create a Nuget.config file with the following contents:

<?xml version="1.0" encoding="utf-8"?>
    <add key="dotnet-core" value="" />

Now restore the packages:

dotnet restore

6. Modify Program.cs

Replace the contents of the Program.cs file with the following code

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

namespace aspnet.on.rpi
    public class Program
        public static void Main(string[] args)
            var host = new WebHostBuilder()
                .UseUrls("http://*:5000") // Using * to bind to all network interfaces


7. Publish the application

Publish the application with the following commands

dotnet publish -r win8-arm

We need to publish for win7-arm as a workaround to copy the correct libuv.dll in the next step.

  1. Copy libuv.dll

    Copy libuv.dll from \aspnet.on.rpi\bin\Debug\netcoreapp2.0\win7-arm\publish to \aspnet.on.rpi\bin\Debug\netcoreapp2.0\win8-arm\publish

This step is no longer needed cause we added libuv as a dependency in the csproj file

9. Copy the files to your Raspberry

Connect to Raspberry using PowerShell, start the ftp server and open port 5000 on the Raspberry

Enter-PSSession -ComputerName <Raspberry IP> -Credential <Raspberry IP>\Administrator
start C:\Windows\System32\ftpd.exe
netsh advfirewall firewall add rule name="Open Port 5000" dir=in action=allow protocol=TCP localport=5000

Open the File Explorer ftp:// and copy the contents of **\aspnet.on.rpi\bin\Debug\netcoreapp2.0\win8-arm\publish** to a folder on your Raspberry (i.e. c:\publish).

10. Run the application

Connect to Raspberry using PowerShell and run

cd c:\publish\

You should be good to go and be able to browse on port 5000 of you RPi.

Get the code here:

Hope it helps!