Een eenvoudige Azure-functie lokaal maken en testen met Visual Studio

Voltooid

Gebruikers kunnen vanuit Azure Portal een Azure-functie schrijven, fouten opsporen en implementeren. Het is echter mogelijk dat het schrijven van functies rechtstreeks in een productie-, faserings- of testomgeving niet geschikt is. Bijvoorbeeld het schrijven van geautomatiseerde eenheidstests voor Azure Functions of het gebruik van on-demand implementatie van Azure Functions naar Functie-apps in Azure. Meestal gebruiken ontwikkelaars liever een code-editor en ontwikkelhulpprogramma's in plaats van de omgeving die wordt geleverd door Azure Portal. Met Visual Studio kunt u Azure Functions-code ontwikkelen en beheren met behulp van andere code en services in één project.

In het scenario voor online luxe horloge zijn ontwikkelaars al bekend met Visual Studio 2022. Daarom besluit u om Visual Studio als primaire ontwikkelomgeving te gebruiken voor het maken van Azure Functions. Bovendien biedt Visual Studio een uitstekende omgeving om uw functies lokaal te testen voordat u ze implementeert in Azure.

In deze les leert u hoe u hulpprogramma's gebruikt die beschikbaar zijn in Visual Studio voor het bouwen en testen van een Azure-functie op uw lokale computer.

Belangrijk

Dit artikel biedt ondersteuning voor .NET-klassebibliotheekfuncties die in het proces worden uitgevoerd met de runtime. Uw C#-functies kunnen ook niet meer worden verwerkt en geïsoleerd van de Functions-runtime. Het geïsoleerde werkprocesmodel is de enige manier om niet-LTS-versies van .NET- en .NET Framework-apps uit te voeren in de huidige versies van de Functions-runtime. Zie .NET geïsoleerde werkprocesfuncties voor meer informatie.

Installatie van Visual Studio wijzigen

Eerst gaan we Visual Studio instellen met de web- en cloudhulpprogramma's die u nodig hebt voor uw ontwikkelomgeving.

  1. Als Visual Studio 2022 lokaal is geïnstalleerd, opent u Visual Studio Installer en selecteert u Wijzigen in Visual Studio Community 2022.

    Schermopname van Visual Studio Installer met Modify gemarkeerd.

  2. De pagina Wijzigen - Visual Studio wordt weergegeven.

    Schermopname van het tabblad Workloads van Visual Studio Community 2022 wijzigen met ASP.NET en webontwikkeling en Azure-ontwikkeling gemarkeerd.

  3. Schakel op het tabblad Workloads de selectievakjes ASP.NET en Webontwikkeling en Azure-ontwikkeling in en selecteer Vervolgens Wijzigen.

  4. Selecteer Ja in het verificatiedialoogvenster. De pagina Visual Studio Installer wordt weergegeven en de voortgang van de geïnstalleerde pakketten wordt weergegeven.

Azure Functions Tools-extensie voor Visual Studio

Azure Functions Tools is een Visual Studio-extensie waarmee u Azure Functions in uw lokale ontwikkelomgeving kunt maken, testen en implementeren. Als u snel een nieuwe Azure-functie-app wilt maken, biedt deze extensie een sjabloon voor het bouwen en implementeren van een functie rechtstreeks in Azure vanuit Visual Studio.

De extensie Azure Functions en Web Jobs Tools is opgenomen in Visual Studio 2022.

Azure Function-app

Een functie-app fungeert als host voor een of meer functies. Het biedt de omgeving en runtime voor uw functiecode.

Een functie wordt geactiveerd door een gebeurtenis in plaats van rechtstreeks vanuit een app aan te roepen. U geeft het type gebeurtenis op dat elke functie activeert in uw Azure Function-app. De beschikbare gebeurtenissen zijn:

  • Blob-trigger. Met dit type gebeurtenis wordt de functie uitgevoerd wanneer een bestand wordt geüpload naar of wordt gewijzigd in Azure Blob Storage.
  • Event Hub-trigger. Met een Event Hubs-trigger wordt de functie uitgevoerd wanneer een Event Hub een bericht ontvangt.
  • Azure Cosmos DB-trigger. Deze trigger wordt uitgevoerd wanneer een document wordt toegevoegd aan of gewijzigd in een Azure Cosmos DB-database. U kunt deze trigger gebruiken om Azure Cosmos DB te integreren met andere services. Als bijvoorbeeld een document dat een klantorder voorstelt, wordt toegevoegd aan een database, kunt u een trigger gebruiken om een kopie van de order naar een wachtrij te verzenden voor verwerking.
  • HTTP-trigger. Met de HTTP-trigger wordt de functie uitgevoerd wanneer er een HTTP-aanvraag optreedt in een web-app. U kunt deze trigger ook gebruiken om te reageren op webhooks. Een webhook is een callback die wordt uitgevoerd wanneer een item die wordt gehost door een website wordt gewijzigd. U kunt bijvoorbeeld een functie maken die wordt geactiveerd door een webhook vanuit een GitHub-opslagplaats wanneer een item in de opslagplaats wordt gewijzigd.
  • Wachtrijtrigger. Met deze trigger wordt de functie gestart wanneer een nieuw item wordt toegevoegd aan een Azure Storage-wachtrij.
  • Trigger voor Service Bus-wachtrij. Met deze trigger wordt de functie uitgevoerd wanneer een nieuw item wordt toegevoegd aan een Azure Service Bus-wachtrij.
  • Trigger voor Service Bus-onderwerp. Met deze trigger wordt de functie uitgevoerd in reactie op een nieuw bericht dat binnenkomt op een Service Bus-onderwerp.
  • Timertrigger. Met deze gebeurtenis wordt de functie regelmatig uitgevoerd volgens een schema dat u definieert.

Schermopname van de beschikbare triggers voor Azure-functies waarin HTTP-trigger is gemarkeerd.

In de volgende tabel ziet u het hoogste niveau van .NET Core of .NET Framework dat u kunt gebruiken met een specifieke versie van Functions.

Runtimeversie van Functions In-proces Geïsoleerd werkproces
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 N.v.t.

In een Azure-functie-app worden beheerinformatie, code en logboeken opgeslagen in Azure Storage. Als u deze gegevens wilt opslaan, maakt u een opslagaccount. Het opslagaccount moet ondersteuning bieden voor Azure Blob-, Queue-, Files- en Table-opslag. Gebruik hiervoor een algemeen Azure Storage-account. Geef met behulp van het eerder weergegeven dialoogvenster op welk opslagaccount voor de functie moet worden gebruikt.

Een functie kan bevoegde of gevoelige bewerkingen uitvoeren. Een functie die wordt geactiveerd door een HTTP-aanvraag, kan openbaar worden weergegeven. Misschien moet u de mogelijkheid om deze functie uit te voeren beperken tot een selecte groep gebruikers. U beveiligt een functie door de toegangsrechten op te geven die vereist zijn om de functie te activeren. Een functie die wordt geactiveerd door een HTTP-aanvraag ondersteunt drie toegangsniveaus:

  • Anoniem. Er is geen verificatie vereist en elke gebruiker kan de functie activeren.
  • Functie. De HTTP-aanvraag moet een sleutel verstrekken aan de hand waarvan de Azure Function-runtime de aanvraag kan autoriseren. U maakt deze sleutel afzonderlijk en u kunt deze beheren met behulp van de Azure-portal.
  • Beheer. Vergelijkbaar met Functie. De gebruiker moet een sleutel opgeven met de HTTP-aanvraag waarmee de functie wordt geactiveerd. Het verschil is dat de sleutel een beheersleutel is. Deze sleutel kan worden gebruikt voor toegang tot elke functie in de functie-app. Net als een functiesleutel wordt ook deze sleutel afzonderlijk gemaakt.

Als u een functie maakt die wordt geactiveerd door andere gebeurtenissen dan HTTP-aanvragen, moet u een verbindingsreeks en andere gegevens opgeven die de functie-app nodig heeft om toegang te krijgen tot de resource die de gebeurtenis activeert. Als u bijvoorbeeld een functie schrijft die wordt geactiveerd door een Blob Storage-gebeurtenis, moet u de verbindingsreeks opgeven voor het bijbehorende Blob Storage-account.

Structuur van een Azure-functie

Een Azure-functie wordt geïmplementeerd als een statische klasse. De klasse biedt een statische, asynchrone methode met de naam Run. Deze fungeert als het invoerpunt voor de klasse.

De parameters die aan de methode Run worden doorgegeven, leveren de context voor de trigger. Als het een HTTP-trigger is, ontvangt de functie een HttpRequest-object . Dit object bevat de header en hoofdtekst van de aanvraag. U kunt toegang krijgen tot de gegevens in de aanvraag met behulp van de technieken die beschikbaar zijn in elke HTTP-app. De kenmerken die op deze functie worden toegepast, geven de autorisatievereisten op (anoniem in dit geval) en de HTTP-bewerkingen waarop de functie reageert (GET en POST).

In het volgende codevoorbeeld dat door Visual Studio wordt gegenereerd, wordt de querytekenreeks onderzocht die is opgegeven als onderdeel van de URL voor de aanvraag en wordt gezocht naar een parameter met de naam. De code maakt ook gebruik van een StreamReader om de hoofdtekst van de aanvraag te deserialiseren en probeert de waarde van een eigenschap ook wel de naam van de aanvraag te lezen. Als de naam wordt gevonden in de querytekenreeks of de hoofdtekst van de aanvraag, wordt de naamwaarde geretourneerd in het antwoord. Anders genereert de functie een foutbericht met het bericht: Geef een naam door in de querytekenreeks of in de hoofdtekst van de aanvraag.

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");
    }
}

De functie retourneert een waarde die uitvoergegevens en resultaten bevat, verpakt in een IActionResult-object . De waarde wordt geretourneerd in de hoofdtekst van het HTTP-antwoord voor de aanvraag.

Verschillende typen triggers ontvangen verschillende invoerparameters en retourtypen. Het volgende voorbeeld toont de code die wordt gegenereerd voor een Blob-trigger. In dit voorbeeld wordt de inhoud van de blob geretourneerd via een Stream-object en wordt ook de naam van de blob opgegeven. De trigger retourneert geen gegevens; het doel is om de gegevens in de benoemde blob te lezen en te verwerken.

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");
    }
}

In alle gevallen wordt een functie doorgegeven aan een ILogger-parameter . De functie kan deze parameter gebruiken om logboekberichten te schrijven, die de functie-app schrijft naar de opslag voor latere analyse.

Een functie bevat ook metagegevens die het type trigger, beveiligingsvereisten en eventuele andere specifieke informatievereisten specificeert. U kunt metagegevens wijzigen met behulp van httpTrigger, BlobTrigger of andere triggerkenmerken, zoals wordt weergegeven in de voorbeelden. Het kenmerk FunctionName dat voorafgaat aan een functie is een id voor de functie die wordt gebruikt door de functie-app. Deze naam hoeft niet dezelfde te zijn als de naam van de functie, maar om verwarring te voorkomen, is het een goede gewoonte om ze gesynchroniseerd te houden.

Een Azure Function-app lokaal testen

U kunt het Visual Debugger gebruiken om lokaal een Azure Function-app te bouwen en te testen. Als u het foutopsporingsprogramma wilt starten, drukt u op F5 of selecteert u in het menu Foutopsporing starten de foutopsporing. De lokale versie van de Function Runtime wordt gestart. Uw functies zijn beschikbaar voor testen. In het voorbeeld ziet u de runtime die als host fungeert voor Function1, de functie die wordt geactiveerd door een HTTP-gebeurtenis. De URL geeft het eindpunt aan waaraan de functie op dat moment is gekoppeld.

Schermopname van de Azure Function Runtime - voorbeeld 1.

Als u een webbrowser opent en deze URL bezoekt, activeert u de functie. In de volgende afbeelding ziet u het antwoord dat is gegenereerd door een HTTP GET-aanvraag die geen hoofdtekst bevat. U kunt het bericht zien dat is gegenereerd door de code die het Object BadRequestObjectResult van de functie retourneert.

Schermopname van de Azure Functions-runtime.

Als u een queryreeks opgeeft die een naamparameter bevat, leest en verwerkt de functie de waarde.

Schermopname van de Azure Function Runtime - voorbeeld 2.

Terwijl de code wordt uitgevoerd, ziet u traceringsberichten die worden weergegeven in het venster Function Runtime. U kunt de standaardfoutopsporingsfuncties van Visual Studio gebruiken als u onderbrekingspunten wilt instellen en wilt bestuderen hoe de controlestroom in een functie verloopt.