Snabbstart: Skapa en C#-funktion i Azure från kommandoraden

I den här artikeln använder du kommandoradsverktyg för att skapa en C#-funktion som svarar på HTTP-begäranden. När du har testat koden lokalt distribuerar du den till den serverlösa Azure Functions.

Den här artikeln stöder skapande av båda typerna av kompilerade C#-funktioner:

Körningsmodell Description
Pågår Funktionskoden körs i samma process som Functions-värdprocessen. Stöder både .NET Core 3.1 och .NET 6.0. Mer information finns i Utveckla C#-klassbiblioteksfunktioner med hjälp av Azure Functions.
Isolerad process Funktionskoden körs i en separat .NET-arbetsprocess. Stöder både .NET 5.0 och .NET 6.0. Mer information finns i Utveckla isolerade processfunktioner i C#.

Den här artikeln skapar en HTTP-utlöst funktion som körs på .NET 6.0. Det finns även en Visual Studio kodbaserad version av den här artikeln.

Den här snabbstarten medför en liten kostnad på några cent eller mindre för ditt Azure-konto.

Konfigurera din lokala miljö

Innan du börjar måste du ha följande:

Du behöver också ett Azure-konto med en aktiv prenumeration. Skapa ett konto utan kostnad.

Kravkontroll

Kontrollera kraven, som beror på om du använder Azure CLI eller Azure PowerShell för att skapa Azure-resurser:

  • I en terminal eller ett kommandofönster kör func --version du för att kontrollera Azure Functions Core Tools version 4.x.

  • Kör dotnet --list-sdks för att kontrollera att de nödvändiga versionerna är installerade.

  • Kör az --version för att kontrollera att Azure CLI-versionen är 2.4 eller senare.

  • Kör az login för att logga in på Azure och verifiera en aktiv prenumeration.

Skapa ett lokalt funktionsprojekt

I Azure Functions är ett funktionsprojekt en container för en eller flera enskilda funktioner som var och en svarar på en specifik utlösare. Alla funktioner i ett projekt delar samma lokala konfigurationer och värdkonfigurationer. I det här avsnittet skapar du ett funktionsprojekt som innehåller en enda funktion.

  1. Kör kommandot på följande sätt för att skapa ett funktionsprojekt i en mapp med namnet func init LocalFunctionProj med den angivna körningen:

    func init LocalFunctionProj --dotnet
    
  2. Navigera till projektmappen:

    cd LocalFunctionProj
    

    Den här mappen innehåller olika filer för projektet, inklusive konfigurationsfiler med namnet local.settings.json och host.json. Eftersom local.settings.json kan innehålla hemligheter som laddats ned från Azure undantas filen från källkontrollen som standard i filen .gitignore.

  3. Lägg till en funktion i projektet med hjälp av följande kommando, där argumentet är det unika namnet på din funktion --name (HttpExample) och --template argumentet anger funktionens utlösare (HTTP).

    func new --name HttpExample --template "HTTP trigger" --authlevel "anonymous"
    

    func new skapar en HttpExample.cs-kodfil.

(Valfritt) Granska filinnehållet

Om du vill kan du gå vidare till Kör funktionen lokalt och undersöka filinnehållet senare.

HttpExample.cs

Funktionskoden som genereras från mallen beror på vilken typ av kompilerat C#-projekt som används.

HttpExample.cs innehåller en metod som tar emot begärandedata i variabeln är en HttpRequest som är snabel med Run req HttpTriggerAttribute, som definierar utlösarbeteendet.

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace LocalFunctionProj
{
    public static class HttpExample
    {
        [FunctionName("HttpExample")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            return name != null
                ? (ActionResult)new OkObjectResult($"Hello, {name}")
                : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
        }
    }
}

Det returnerade objektet är ett ActionResult som returnerar ett svarsmeddelande som antingen OkObjectResult (200) eller Ett BadRequestObjectResult (400).

Mer information finns i Azure Functions HTTP-utlösare och bindningar.

Köra funktionen lokalt

  1. Kör funktionen genom att starta den lokala Azure Functions runtime-värden från mappen LocalFunctionProj:

    func start
    

    Mot slutet av utdata bör följande rader visas:

     ...
    
     Now listening on: http://0.0.0.0:7071
     Application started. Press Ctrl+C to shut down.
    
     Http Functions:
    
             HttpExample: [GET,POST] http://localhost:7071/api/HttpExample
     ...
    
     

    Anteckning

    Om HttpExample inte visas som det visas ovan har du förmodligen startat värden utanför projektets rotmapp. I så fall använder du Ctrl C för att stoppa värden, navigerar till projektets + rotmapp och kör föregående kommando igen.

  2. Kopiera URL:en för funktionen HttpExample från dessa utdata till en webbläsare:

    Lägg till frågesträngen i ?name=<YOUR_NAME> funktions-URL:en, vilket gör den fullständiga URL:en som http://localhost:7071/api/HttpExample?name=Functions . Webbläsaren bör visa ett svarsmeddelande som returnerar frågesträngens värde. Terminalen där du startade projektet visar även loggutdata när du gör begäranden.

  3. När du är klar använder du Ctrl + C och väljer y att stoppa functions-värden.

Skapa stöd för Azure-resurser för din funktion

Innan du kan distribuera funktionskoden till Azure måste du skapa tre resurser:

  • En resursgrupp, som är en logisk container för relaterade resurser.
  • Ett Storage konto, som används för att upprätthålla tillstånd och annan information om dina funktioner.
  • En funktionsapp som tillhandahåller miljön för att köra funktionskoden. En funktionsapp mappar till ditt lokala funktionsprojekt och gör att du kan gruppera funktioner som en logisk enhet för enklare hantering, distribution och delning av resurser.

Använd följande kommandon för att skapa dessa objekt. Både Azure CLI och PowerShell stöds.

  1. Om du inte redan har gjort det loggar du in på Azure:

    az login
    

    Kommandot az login loggar in dig på ditt Azure-konto.

  2. Skapa en resursgrupp med namnet AzureFunctionsQuickstart-rg i den valda regionen:

    az group create --name AzureFunctionsQuickstart-rg --location <REGION>
    

    Kommandot az group create skapar en resursgrupp. I kommandot ovan ersätter du med en region nära dig med hjälp av en tillgänglig regionskod som returneras från <REGION> kommandot az account list-locations.

  3. Skapa ett allmänt lagringskonto i resursgruppen och regionen:

    az storage account create --name <STORAGE_NAME> --location <REGION> --resource-group AzureFunctionsQuickstart-rg --sku Standard_LRS
    

    Kommandot az storage account create skapar lagringskontot.

    I föregående exempel ersätter du <STORAGE_NAME> med ett namn som är lämpligt för dig och unikt i Azure Storage. Namn får endast innehålla tre till 24 tecken och gemener. Standard_LRS anger ett konto för generell användning som stöds av Functions.

  1. Skapa funktionsappen i Azure:

    az functionapp create --resource-group AzureFunctionsQuickstart-rg --consumption-plan-location <REGION> --runtime dotnet --functions-version 3 --name <APP_NAME> --storage-account <STORAGE_NAME>
    

    Kommandot az functionapp create skapar funktionsappen i Azure.

    Anteckning

    Det här kommandot skapar en funktionsapp med 3.x-versionen av Azure Functions runtime. Kommandot func azure functionapp publish som du ska köra senare uppdaterar appen till version 4.x.

    I föregående exempel ersätter du med namnet på det konto som du använde i föregående steg och ersätter med ett <STORAGE_NAME> globalt unikt namn som passar <APP_NAME> dig. <APP_NAME> är även DNS-standarddomänen för funktionsappen.

    Det här kommandot skapar en funktionsapp som körs i din angivna språkkörning under Azure Functions Consumption Plan, vilket är kostnadsfritt för den mängd användning som du ådrar dig här. Kommandot tillser även en Azure Application Insights instans i samma resursgrupp som du kan använda för att övervaka funktionsappen och visa loggar. Mer information finns i Övervaka Azure Functions. Instansen medför inga kostnader förrän du aktiverar den.

Distribuera funktions projektet till Azure

När du har skapat din Function-app i Azure är du nu redo att distribuera ditt lokala Functions-projekt med hjälp av kommandot FUNC Azure-functionapp Publish .

I följande exempel ersätter du <APP_NAME> med namnet på din app.

func azure functionapp publish <APP_NAME>

Kommandot Publicera visar resultat som liknar följande utdata (trunkerade för enkelhetens skull):

...

Getting site publishing info...
Creating archive for current directory...
Performing remote build for functions project.

...

Deployment successful.
Remote build succeeded!
Syncing triggers...
Functions in msdocs-azurefunctions-qs:
    HttpExample - [httpTrigger]
        Invoke url: https://msdocs-azurefunctions-qs.azurewebsites.net/api/httpexample

Anropa funktionen i Azure

Eftersom funktionen använder en HTTP-utlösare och stöder GET-begäranden anropar du den genom att göra en HTTP-begäran till dess URL. Det är enklast att göra detta i en webbläsare.

Kopiera den fullständiga Invoke URL som visas i utdata från publiceringskommandot till ett adressfält i webbläsaren och lägga till frågeparametern ?name=Functions . När du navigerar till den här URL:en bör webbläsaren visa liknande utdata som när du körde funktionen lokalt.

Kör följande kommando för att Visa nästan real tids strömnings loggar:

func azure functionapp logstream <APP_NAME> 

I ett separat terminalfönster eller i webbläsaren, anropar du fjärrfunktionen igen. En utförlig logg över funktions körningen i Azure visas i terminalen.

Rensa resurser

Om du fortsätter till nästa steg och lägger till en Azure Storage-köutdatabindning behåller du alla dina resurser på plats eftersom du bygger vidare på det du redan har gjort.

Annars använder du följande kommando för att ta bort resursgruppen och alla dess inneslutna resurser för att undvika ytterligare kostnader.

az group delete --name AzureFunctionsQuickstart-rg

Nästa steg