Skapa och testa en enkel Azure-funktion lokalt med Visual Studio

Slutförd

Användare kan skriva, felsöka och distribuera en Azure-funktion från Azure-portalen. Det är dock inte lämpligt att skriva funktioner direkt i en produktions-, mellanlagrings- eller testmiljö. Du kan till exempel skriva automatiserade enhetstester för Azure Functions eller använda distribution på begäran av Azure Functions till Funktionsappar i Azure. Vanligtvis föredrar utvecklare att använda en kodredigerare och utvecklingsverktyg i stället för den miljö som tillhandahålls av Azure-portalen. Med Visual Studio kan du utveckla och hantera Azure Functions-kod med hjälp av annan kod och tjänster i ett enda projekt.

I scenariot med lyxklocka online är utvecklare redan bekanta med Visual Studio 2022. Därför väljer du att använda Visual Studio som den primära utvecklingsmiljön för att skapa Azure-funktioner. Visual Studio har dessutom en bra miljö för att testa funktionerna lokalt innan de distribueras till Azure.

I den här lektionen lär du dig att använda verktyg som är tillgängliga i Visual Studio för att skapa och testa en Azure-funktion på din lokala dator.

Viktigt!

Den här artikeln stöder .NET-klassbiblioteksfunktioner som körs i processen med körningen. C#-funktionerna kan också köras utan process och isoleras från Functions-körningen. Den isolerade arbetsprocessmodellen är det enda sättet att köra icke-LTS-versioner av .NET- och .NET Framework-appar i aktuella versioner av Functions-körningen. Mer information finns i .NET-isolerade arbetsprocessfunktioner.

Ändra Visual Studio-installation

Först ska vi konfigurera Visual Studio med de webb- och molnverktyg som du behöver för din utvecklingsmiljö.

  1. Med Visual Studio 2022 installerat lokalt öppnar du Visual Studio Installer och väljer Ändra i Visual Studio Community 2022.

    Skärmbild av Visual Studio Installer med Ändra markerat.

  2. Sidan Modifying - Visual Studio (Ändra – Visual Studio) visas.

    Skärmbild av fliken Ändra Visual Studio Community 2022-arbetsbelastningar med ASP.NET och webbutveckling och Azure-utveckling markerade.

  3. På fliken Arbetsbelastningar markerar du kryssrutorna ASP.NET och Webbutveckling och Azure-utveckling och väljer sedan Ändra.

  4. I verifieringsdialogrutan väljer du Ja. Sidan Installationsprogram för Visual Studio visas och visar förloppet för de paket som installeras.

Azure Functions Tools-tillägg för Visual Studio

Azure Functions Tools är ett Visual Studio-tillägg som gör att du kan skapa, testa och distribuera Azure Functions i din lokala utvecklingsmiljö. För att snabbt skapa en ny Azure-funktionsapp tillhandahåller det här tillägget en mall som du kan skapa och sedan distribuera en funktion direkt till Azure från Visual Studio.

Tillägget Azure Functions och Web Jobs Tools ingår i Visual Studio 2022.

Azure-funktionsapp

En funktionsapp är värd för en eller flera funktioner. Den tillhandahåller miljön och körningen för din funktionskod.

En funktion utlöses av en händelse i stället för att anropas direkt från en app. Du anger vilken typ av händelse som utlöser varje funktion i azure-funktionsappen. Följande händelser är tillgängliga:

  • Blob-utlösare. Den här typen av funktion körs när en fil laddas upp till eller ändras i Azure Blob Storage.
  • Händelsehubbutlösare. En Event Hubs-utlösare kör funktionen när en händelsehubb tar emot ett meddelande.
  • Azure Cosmos DB-utlösare. Den här utlösaren körs när ett dokument läggs till i eller ändras i en Azure Cosmos DB-databas. Du kan använda den här utlösaren för att integrera Azure Cosmos DB med andra tjänster. Om ett dokument som representerar en kunds order exempelvis läggs till i en databas kan du använda en utlösare för att skicka en kopia av ordern till en kö för bearbetning.
  • Http-utlösare. En HTTP-utlösare kör funktionen när en HTTP-begäran görs i en webbapp. Du kan också använda den här utlösaren för att svara på webhookar. En webhook är ett återanrop som görs när ett objekt som är värd för en webbplats ändras. Du kan till exempel skapa en funktion som utlöses av en webhook från en GitHub-lagringsplats när ett objekt på lagringsplatsen ändras.
  • Köutlösare. Den här utlösaren startar funktionen när ett nytt objekt läggs till i en Azure Storage-kö.
  • Service Bus-köutlösare. Den här utlösaren kör funktionen när ett nytt objekt läggs till i en Azure Service Bus-kö.
  • Service Bus-ämnesutlösare. Den här utlösaren kör funktionen som svar på ett nytt meddelande som mottas för ett Service Bus-ämne.
  • Timerutlösare. Den här händelsen kör funktionen med jämna mellanrum, enligt ett schema som du definierar.

Skärmbild som visar de tillgängliga Azure-funktionsutlösarna, med HTTP-utlösaren markerad.

I följande tabell visas den högsta nivån av .NET Core eller .NET Framework som du kan använda med en specifik version av Functions.

Funktionskörningsversion Pågående Isolerad arbetsprocess
Functions 4.x .NET 6.0 .NET 6.0
.NET 7.0
.NET 8.0
.NET Framework 4.8
Functions 1.x .NET Framework 4.8 saknas

En Azure Function App lagrar hanteringsinformation, kod och loggar i Azure Storage. Om du vill lagra dessa data skapar du ett lagringskonto. Lagringskontot måste ha stöd för Azure Blob, Queue, Files och Table Storage. Använd ett allmänt Azure Storage-konto för detta ändamål. Du anger vilket lagringskonto som ska användas för funktionen med hjälp av dialogrutan som visats tidigare.

En funktion kan utföra privilegierade eller känsliga åtgärder. En funktion som utlöses av en HTTP-begäran kan exponeras offentligt. Du kan behöva begränsa möjligheten att köra den här funktionen till valda grupper av användare. Du skyddar en funktion genom att ange de åtkomsträttigheter som krävs för att utlösa funktionen. En funktion som utlöses av en HTTP-begäran stöder tre nivåer av åtkomsträttigheter:

  • Anonym. Ingen autentisering krävs och alla användare kan utlösa funktionen.
  • Funktion. HTTP-begäran måste ange en nyckel som gör att körtiden för Azure-funktionen kan auktorisera begäran. Du skapar den här nyckeln separat och du kan underhålla den med hjälp av Azure-portalen.
  • Administratör. Liknar Funktion. Användaren måste ange en nyckel med HTTP-begäran som utlöser funktionen. Skillnaden är att nyckeln är en admin-nyckel. Den här nyckeln kan användas för att komma åt alla funktioner i funktionsappen. Precis som med en funktionsnyckel skapar du den här nyckeln separat.

Om du skapar en funktion som utlöses av andra händelser än HTTP-begäranden måste du ange en anslutningssträng och annan information som behövs för att funktionsappen ska komma åt resursen som utlöser händelsen. Om du till exempel skriver en funktion som utlöses av en Blob Storage-händelse måste du ange anslutningssträng för motsvarande Blob Storage-konto.

En Azure-funktions struktur

En Azure-funktion implementeras som en statisk klass. Klassen har en statisk, asynkron metod med namnet Run, som fungerar som startpunkten för klassen.

Parametrarna som skickas till Run-metoden tillhandahåller kontexten för utlösaren. Om det är en HTTP-utlösare tar funktionen emot ett HttpRequest-objekt . Det här objektet innehåller rubriken och begärandetexten. Du kan komma åt data i begäran med samma tekniker som är tillgängliga i alla HTTP-appar. Attributen som tillämpas på den här funktionen anger auktoriseringskraven (anonym i det här fallet) och DE HTTP-åtgärder som funktionen svarar på (GET och POST).

Följande kodexempel som genereras av Visual Studio undersöker frågesträngen som tillhandahålls som en del av URL:en för begäran och letar efter en parameter som kallas namn. Koden använder också en StreamReader för att deserialisera brödtexten i begäran och försöker läsa värdet för en egenskap som även kallas namn från begäran. Om namnet finns i antingen frågesträngen eller brödtexten i begäran returneras namnvärdet i svaret. Annars genererar funktionen ett felsvar med meddelandet: Skicka ett namn på frågesträngen eller i begärandetexten.

public static class Function1
{
    [FunctionName("Function1")]
    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");
    }
}

Funktionen returnerar ett värde som innehåller utdata och resultat, omslutna i ett IActionResult-objekt . Värdet returneras i själva HTTP-svaret för begäran.

Olika typer av utlösare tar emot olika indataparametrar och returtyper. I nästa exempel visas koden som genereras för en Blob-utlösare. I det här exemplet returneras innehållet i bloben via ett Stream-objekt och namnet på bloben tillhandahålls också. Utlösaren returnerar inga data. dess syfte är att läsa och bearbeta data i den namngivna bloben.

public static class Function2
{
    [FunctionName("Function2")]
    public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "xxxxxxxxxxxxxxxxxxxxxxx")]Stream myBlob, string name, ILogger log)
    {
        log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
    }
}

I samtliga fall skickas en funktion en ILogger-parameter . Funktionen kan använda den här parametern för att skriva loggmeddelanden, som funktionsappen skriver till lagring för senare analys.

En funktion innehåller även metadata som anger typen av utlösare, säkerhetskrav och andra specifika informationskrav. Du kan ändra metadata med hjälp av HttpTrigger-, BlobTrigger- eller andra utlösarattribut, som du ser i exemplen. Attributet FunctionName som föregår en funktion är en identifierare för funktionen som används av funktionsappen. Det här namnet måste inte vara samma som namnet på funktionen, men det är bästa praxis för att undvika förvirring.

Testa en Azure-funktionsapp lokalt

Du kan använda det visuella felsökningsprogrammet för att skapa och testa en Azure-funktionsapp lokalt. Om du vill starta felsökningsprogrammet trycker du på F5 eller väljer Starta felsökning felsökningsmenyn. Den lokala versionen av funktionskörningen startar. Dina funktioner är tillgängliga för testning. I exemplet visas körningsvärdfunktionen Function1, funktionen som utlöses av en HTTP-händelse. URL:en anger slutpunkten som funktionen är ansluten till för närvarande.

Skärmbild som visar Azure Function Runtime – exempel 1.

Om du öppnar en webbläsare och besöker den här URL:en utlöser du funktionen. I följande bild visas svaret som genereras av en HTTP GET-begäran som inte innehåller någon textdel. Du kan se meddelandet som genereras av koden som returnerar Objektet BadRequestObjectResult från funktionen.

Skärmbild som visar Azure Function Runtime.

Om du anger en frågesträng som innehåller en namnparameter läser och bearbetar funktionen värdet.

Skärmbild som visar Azure Function Runtime – exempel 2.

När koden körs visas spårningsmeddelanden i fönstret Funktionskörning. Du kan använda vanliga felsökningsfunktioner i Visual Studio om du vill ange brytpunkter och undersöka flödeskontrollen i en funktion.