Een eenvoudige Azure-functie lokaal maken en testen met Visual Studio
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. U besluit Visual Studio dus te gebruiken als de primaire ontwikkelomgeving voor het maken van Azure Functions. Daarnaast biedt Visual Studio een uitstekende omgeving voor het lokaal testen van uw functies 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 buiten het proces worden uitgevoerd 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 werkprocesfunctiesvoor meer informatie.
Visual Studio-installatie wijzigen
Eerst gaan we Visual Studio instellen met de web- en cloudhulpprogramma's die u nodig hebt voor uw ontwikkelomgeving.
Als Visual Studio 2022 lokaal is geïnstalleerd, opent u Visual Studio Installeren selecteert u op de Visual Studio Community 2022de optie Wijzigen.
De pagina Wijzigen - Visual Studio wordt weergegeven.
Selecteer op het tabblad Workloads de selectievakjes ASP.NET en Webontwikkeling en Azure-ontwikkeling en selecteer vervolgens Wijzigen.
Selecteer in het verificatiedialoogvenster Ja. 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. Dit type functie wordt uitgevoerd wanneer een bestand wordt geüpload of 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 de bestelling van een klant vertegenwoordigt, 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 een HTTP-trigger wordt de functie uitgevoerd wanneer een HTTP-aanvraag plaatsvindt in een web-app. U kunt deze trigger ook gebruiken om te reageren op webhooks. Een webhook is een callback die optreedt wanneer een item dat 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.
- Service Bus-wachtrijtrigger. Met deze trigger wordt de functie uitgevoerd wanneer een nieuw item wordt toegevoegd aan een Azure Service Bus-wachtrij.
- Service Bus-onderwerptrigger. Met deze trigger wordt de functie uitgevoerd als reactie op een nieuw bericht dat binnenkomt in een Service Bus-onderwerp.
- timer-trigger. Met deze gebeurtenis wordt de functie regelmatig uitgevoerd volgens een schema dat u definieert.
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.
Versie van de Functions-runtime | In bewerking | 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 Storage; gebruik hiervoor een algemeen Azure Storage-account. U geeft op welk opslagaccount moet worden gebruikt voor de functie met behulp van het eerder weergegeven dialoogvenster.
Een functie kan bevoegde of gevoelige bewerkingen uitvoeren. Een functie die wordt geactiveerd door een HTTP-aanvraag, kan openbaar worden weergegeven. Mogelijk moet u de mogelijkheid om deze functie uit te voeren beperken tot geselecteerde groepen 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:
- Anonieme. Er is geen verificatie vereist en elke gebruiker kan de functie activeren.
- Functie. De HTTP-aanvraag moet een sleutel opgeven waarmee de Azure Function-runtime de aanvraag kan autoriseren. U maakt deze sleutel afzonderlijk en u kunt deze onderhouden met behulp van Azure Portal.
- Admin. 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 -beheerder--sleutel is. Deze sleutel kan worden gebruikt voor toegang tot elke functie in de functie-app. Net als bij een functietoets maakt u deze toets afzonderlijk.
Als u een functie maakt die wordt geactiveerd door andere gebeurtenissen dan HTTP-aanvragen, moet u een verbindingsreeks en andere gegevens opgeven die nodig zijn voor de functie-app 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
, die fungeert als het toegangspunt voor de klasse.
De parameters die worden doorgegeven aan de methode Run
bieden de context voor de trigger. Als het een HTTP-trigger is, ontvangt de functie een HttpRequest-object. Dit object bevat de koptekst en hoofdtekst van de aanvraag. U kunt toegang krijgen tot de gegevens in de aanvraag met behulp van dezelfde technieken die beschikbaar zijn in elke HTTP-app. De kenmerken die op deze functie worden toegepast, geven de autorisatievereisten op (Anonieme 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 queryreeks onderzocht die is opgegeven als onderdeel van de URL voor de aanvraag en wordt gezocht naar een parameter met de naam naam. De code maakt ook gebruik van een StreamReader- om de hoofdtekst van de aanvraag te deserialiseren en probeert de waarde van een eigenschap genaamd naam uit de aanvraag te lezen. Als naamwaarde wordt gevonden in de querystring of de aanvraagtekst, wordt de naamwaarde geretourneerd in het antwoord. Anders genereert de functie een foutbericht met het bericht: Geef een naam door aan 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 met uitvoergegevens en resultaten, 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. In het volgende voorbeeld ziet u de code die is gegenereerd voor een blobtrigger. 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-applicatie naar de opslag schrijft 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 de HttpTrigger-, BlobTriggerof andere triggerkenmerken, zoals wordt weergegeven in de voorbeelden. Het kenmerk FunctionName dat voorafgaat aan een functie, is een id voor de functie die door de functie-app wordt gebruikt. Deze naam hoeft niet hetzelfde te zijn als de naam van de functie, maar het is raadzaam om ze gesynchroniseerd te houden om verwarring te voorkomen.
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 FoutopsporingStart Debugging. 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 Function1, de functie die wordt geactiveerd door een HTTP-gebeurtenis. De URL geeft het eindpunt aan waaraan de functie momenteel is gekoppeld.
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 de BadRequestObjectResult object van de functie retourneert.
Als u een queryreeks opgeeft die een naam parameter bevat, leest en verwerkt de functie de waarde.
Terwijl de code wordt uitgevoerd, ziet u traceringsberichten die worden weergegeven in het venster Function Runtime. U kunt standaardfuncties voor foutopsporing in Visual Studio gebruiken als u onderbrekingspunten wilt instellen en de controlestroom in een functie wilt onderzoeken.