Hosting di un'istanza API Web .NET Core 2 su Raspberry Pi 3

 C Programming >> Programmazione C >  >> Tags >> API
Hosting di un'istanza API Web .NET Core 2 su Raspberry Pi 3

Di recente ho passato molto tempo a lavorare per migliorare le esperienze degli sviluppatori con la scrittura di codice multipiattaforma per Raspberry Pi 3 utilizzando .NET Core 2.

In un post precedente, ho scritto sulla creazione di una semplice app console .NET Core 2 per il Pi:puoi vedere il codice su GitHub qui, oppure se vuoi semplicemente installare il modello, installa semplicemente il pacchetto Nuget eseguendo il codice seguente da una riga di comando:

dotnet new -i RaspberryPiTemplate::*

E per creare un nuovo progetto di console con questo modello, esegui il codice da una riga di comando:

dotnet new coreiot -n MyProject

Che ne dici di creare un progetto WebAPI per un Raspberry Pi 3?

Innanzitutto, assicurati di avere .NET Core 2:ho notato che lo stato è cambiato di recente da Beta a Anteprima e puoi scaricare un programma di installazione da qui.

Il modo più semplice:usa i modelli preconfezionati di Nuget

Se vuoi solo installare un modello da Nuget, esegui il codice seguente su una riga di comando;

dotnet new -i RaspberryPi.WebApi::*

Una volta installato questo modello, puoi accedere al punto in cui desideri che venga creato il tuo progetto ed eseguire il comando seguente (ovviamente se non vuoi chiamare il tuo progetto "MyProject", scegli un nome diverso).

dotnet new piwebapi -n MyProject

Questo creerà un progetto WebAPI .NET Core 2 chiamato "MyProject", che può essere distribuito su un Raspberry Pi con Windows 10 o Ubuntu. Ci sono un sacco di script PowerShell di distribuzione nella radice e puoi leggere un po' di più su di essi qui.

Se vuoi guardare un progetto di esempio creato da questo modello, ne ho creato uno di esempio su GitHub qui.

Se stai eseguendo la distribuzione su Windows 10 IoT Core, ricorda di aprire una porta nel firewall per consentire le connessioni:il mio modello di esempio utilizza la porta 5000 e può essere aperto utilizzando il codice seguente se ssh nel tuo Pi.

netsh advfirewall firewall add rule name="ASPNet Core 2 Server Port" dir=in action=allow protocol=TCP localport=5000

Oppure prova nel modo più duro: cucina il tuo progetto

Dopo aver installato .NET Core 2, apri una riga di comando in cui desideri che il tuo progetto risieda ed esegui la riga di codice seguente (di nuovo, ovviamente se non vuoi chiamare il tuo progetto "MyProject", scegli un nome).

dotnet new webpi -n MyProject

Una volta creato il progetto, apri la cartella principale (che si chiamerà MyProject) e modifica il file MyProject.csproj. Cerca il nodo ProjectGroup che dovrebbe assomigliare al codice seguente:

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

E aggiungi due note aggiuntive:RuntimeFrameworkVersion e RuntimeIdentifiers:

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <RuntimeFrameworkVersion>2.0.0-preview1-002028-00</RuntimeFrameworkVersion>
    <RuntimeIdentifiers>win8-arm;ubuntu.14.04-arm;ubuntu.16.04-arm</RuntimeIdentifiers>
  </PropertyGroup>

Ora guarda il file Program.cs del progetto e aggiungi la riga di codice:

.UseUrls("http://*:5000")

al metodo principale, come mostrato di seguito:

public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseUrls("http://*:5000")
            .ConfigureAppConfiguration((context, configBuilder) => {
                configBuilder
                    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true)
                    .AddEnvironmentVariables();
            })
            .ConfigureLogging(loggerFactory => loggerFactory
                .AddConsole()
                .AddDebug())
            .UseStartup<Startup>()
            .Build();
 
        host.Run();
    }
}

Creazione e distribuzione su un Raspberry Pi 3

Innanzitutto, crea questo progetto nel modo normale:vai alla directory in cui hai creato il tuo progetto ed esegui:

dotnet restore .

dotnet build .

Successivamente, pubblica l'applicazione:la destinazione dipende dal fatto che desideri eseguire su un Raspberry Pi con Windows 10 o Ubuntu 16.04.

Pubblica il targeting Ubuntu 16.04:

dotnet publish . -r ubuntu.16.04-arm

Pubblica il targeting Windows 10:

dotnet publish . -r win8-arm
Successivamente, dobbiamo distribuire questi binari:

Esegui il deployment su Ubuntu 16.04

Per eseguire il deployment su Ubuntu 16.04 da una macchina Windows, abbiamo bisogno di alcune cose:
  • Installa PuTTY (che installa anche strumenti chiamati pscp e plink , di cui abbiamo bisogno). Aggiungi la directory di installazione di PuTTY al percorso del tuo computer Windows.
  • L'ID utente che hai utilizzato per accedere al tuo Pi, il mio è ubuntu .
  • Crea una directory sul tuo Raspberry Pi in cui distribuire il codice WebAPI:l'ho creato chiamato "PiWebApi" che si trova in "/home/ubuntu/PiWebApi “.
  • L'indirizzo IP del tuo Raspberry Pi:assicurati che il tuo Raspberry Pi sia connesso e connesso alla tua rete locale:l'indirizzo IP del mio Ubuntu Pi è 192.168.1.110

Ora esegui il comando seguente per copiare i binari dalla tua macchina di sviluppo Windows al Raspberry Pi 3 remoto.

pscp.exe -r .\bin\Debug\netcoreapp2.0\ubuntu.16.04-arm\publish\* ubuntu@$192.168.1.110:/home/ubuntu/PiWebApi

Quindi esegui il comando seguente dalla tua macchina di sviluppo per rendere eseguibile il binario sul Raspberry Pi.

plink.exe -v -ssh [email protected] chmod u+x,o+x /home/ubuntu/PiWebApi/MyProject
Apri una connessione ssh usando PuTTY al tuo Pi 3 ed esegui il comando:
./home/ubuntu/PiWebApi/MyProject
La console mostrerà il testo seguente all'avvio del server web:
Hosting environment: Production
Content root path: /home/ubuntu/PiWebApi
Now listening on: http://[::]:8000
Application started. Press Ctrl+C to shut down.
E ora puoi accedere all'indirizzo sottostante per vedere il server Raspberry Pi che restituisce i valori dalla richiesta HTTP GET:http://192.168.1.110:5000/api/values

Esegui il deployment su Windows 10 IoT Core

Per eseguire la distribuzione su un Raspberry Pi con Windows 10, è necessario:
  • Crea una directory sul tuo Raspberry Pi per distribuire il codice WebAPI a – Ho creato su chiamato "PiWebApi" che si trova in "C$/PiWebApi “.
  • Ottieni l'indirizzo IP del tuo Raspberry Pi:assicurati di aver effettuato l'accesso al tuo Raspberry Pi e di esserti connesso alla tua rete locale:l'indirizzo IP del mio Windows 10 Pi è 192.168.1.125

Da un prompt dei comandi aperto nella radice del tuo progetto WebAPI, esegui il codice seguente per copiare i file binari dalla tua macchina di sviluppo al tuo Pi:

xcopy.exe /y ".\bin\Debug\netcoreapp2.0\win8-arm\publish" "\\192.168.1.125\C$\PiWebApi"
Ora apri una connessione ssh al tuo Raspberry Pi:io uso PowerShell per farlo tramite il "Windows IoT Dashboard" (come mostrato nell'immagine qui sotto):Da questa connessione ssh, ora devi aprire la porta 5000 nel firewall di Raspbery Pi 3:
netsh advfirewall firewall add rule name="ASPNet Core 2 Server Port" dir=in action=allow protocol=TCP localport=5000
Passa alla cartella di distribuzione sul tuo Raspberry Pi (in questo caso C:\PiWebApi) ed esegui il comando seguente:
./MyProject.exe
Anche in questo caso il testo seguente viene scritto sulla console all'avvio del server Web:
Hosting environment: Production
Content root path: C:\PiWebApi
Now listening on: http://[::]:5000
Application started. Press Ctrl+C to shut down.

E ancora, puoi accedere all'indirizzo seguente per vedere il server Raspberry Pi restituire i valori dalla richiesta HTTP GET:

http://192.168.1.125:5000/api/values