Dela via


Utveckla Azure Functions med hjälp av Visual Studio

Visual Studio är ett sätt att utveckla, testa och distribuera C#-klassbiblioteksfunktioner till Azure. Om den här upplevelsen är din första med Azure Functions kan du läsa Översikt över Azure Functions.

Om du vill komma igång direkt kan du slutföra snabbstarten Functions för Visual Studio.

Den här artikeln innehåller detaljerad information om hur du använder Visual Studio för att utveckla C#-klassbiblioteksfunktioner och publicera dem i Azure. Det finns två modeller för att utveckla C#-klassbiblioteksfunktioner: den isolerade arbetsmodellen och den processbaserade modellen.

Du läser den isolerade arbetsmodellversionen av den här artikeln. Du kan välja önskad modell överst i artikeln.

Du läser den processbaserade modellversionen av den här artikeln. Du kan välja önskad modell överst i artikeln.

Om inget annat anges är procedurer och exempel som visas för Visual Studio 2022. Mer information om Visual Studio 2022-versioner finns i viktig information eller viktig information om förhandsversionen.

Förutsättningar

  • Visual Studio 2022, inklusive arbetsbelastningen för Azure-utveckling.

  • Andra resurser som du behöver, till exempel ett Azure Storage-konto, skapas i din prenumeration under publiceringsprocessen.

  • Om du inte har något Azure-konto skapar du ett kostnadsfritt konto innan du börjar.

Skapa ett Azure Functions-projekt

Azure Functions-projektmallen i Visual Studio skapar ett C#-klassbiblioteksprojekt som du kan publicera till en funktionsapp i Azure. Du kan använda en funktionsapp för att gruppera funktioner som en logisk enhet för enklare hantering, distribution, skalning och delning av resurser.

  1. På Visual Studio-menyn väljer du Arkiv>Nytt>projekt.

  2. I dialogrutan Skapa ett nytt projekt anger du funktioner i sökrutan, väljer Azure Functions-mallen och väljer sedan Nästa.

  3. I dialogrutan Konfigurera det nya projektet för Projektnamn anger du ett namn för projektet och väljer sedan Nästa. Funktionsappens namn måste vara ett giltigt C#-namnområde. Du kan inte använda understreck, bindestreck eller andra icke-alfanumeriska tecken.

  4. I dialogrutan Ytterligare information vidtar du de åtgärder som anges i följande tabell:

    Inställning Åtgärd beskrivning
    Functions Worker Välj .NET 8.0 Isolerad (långsiktigt stöd). Visual Studio skapar ett funktionsprojekt som körs i en isolerad arbetsprocess. Den isolerade arbetsprocessen stöder även andra versioner av .NET och .NET Framework som inte erbjuder långsiktig support (LTS). Mer information finns i Översikt över Azure Functions-körningsversioner.
    Function Välj Http-utlösare. Visual Studio skapar en funktion som utlöses av en HTTP-begäran.
    Använda Azurite för körningslagringskonto (AzureWebJobsStorage) Markera den här kryssrutan. Eftersom en funktionsapp i Azure kräver ett lagringskonto tilldelas eller skapas en när du publicerar projektet till Azure. En HTTP-utlösare använder inte en anslutningssträng för lagringskontot. Alla andra utlösartyper kräver en giltig anslutningssträng för lagringskontot.
    Auktoriseringsnivå Välj Anonym. När du använder den här auktoriseringsinställningen kan alla klienter utlösa den skapade funktionen utan att ange en nyckel. Den här konfigurationen gör det enkelt att testa den nya funktionen. Mer information finns i auktoriseringsnivå.

    Skärmbild av dialogrutan Ytterligare information i Visual Studio som visar konfigurerade inställningar som en isolerad .NET-version för Functions-arbetaren.

    Inställning Åtgärd beskrivning
    Functions Worker Välj .NET 8.0 In-process (Långsiktig support). Visual Studio skapar ett funktionsprojekt som körs inom processen med version 4.x av Functions-runtimen. Mer information finns i Översikt över Azure Functions-körningsversioner.
    Function Välj Http-utlösare. Visual Studio skapar en funktion som utlöses av en HTTP-begäran.
    Använda Azurite för körningslagringskonto (AzureWebJobsStorage) Markera den här kryssrutan. Eftersom en funktionsapp i Azure kräver ett lagringskonto tilldelas eller skapas en när du publicerar projektet till Azure. En HTTP-utlösare använder inte en anslutningssträng för lagringskontot. Alla andra utlösartyper kräver en giltig anslutningssträng för lagringskontot.
    Auktoriseringsnivå Välj Anonym När du använder den här auktoriseringsinställningen kan alla klienter utlösa den skapade funktionen utan att ange en nyckel. Den här konfigurationen gör det enkelt att testa den nya funktionen. Mer information finns i auktoriseringsnivå.

    Skärmbild av dialogrutan Ytterligare information i Visual Studio som visar konfigurerade inställningar som en processbaserad .NET-version för Functions-arbetaren.

    Se till att du anger auktoriseringsnivån till Anonym. Om du väljer standardnivån funktion måste du presentera funktionsnyckeln i begäranden för att få åtkomst till funktionsslutpunkten.

  5. Välj Skapa för att skapa funktionsprojektet och funktionen HTTP-utlösare.

När du har skapat ett Functions-projekt skapar projektmallen ett C#-projekt, installerar NuGet-paketen Microsoft.Azure.Functions.Worker och Microsoft.Azure.Functions.Worker.Sdk anger målramverket.

När du har skapat ett Functions-projekt skapar projektmallen ett C#-projekt, installerar Microsoft.NET.Sdk.Functions NuGet-paketet och anger målramverket.

Det nya projektet har följande filer:

  • host.json: Den här filen ger dig ett sätt att konfigurera Functions-värden. De här inställningarna gäller både när du kör lokalt och i Azure. Mer information finns i host.json referens.

  • local.settings.json: Den här filen har inställningar som du använder när du kör funktioner lokalt. De här inställningarna används inte när din app körs i Azure. Mer information finns i Arbeta med appinställningar lokalt.

    Viktigt!

    Eftersom denlocal.settings.json filen kan innehålla hemligheter måste du undanta den från projektkällans kontroll. I dialogrutan Egenskaper för den här filen kontrollerar du att inställningen Kopiera till utdatakatalog är inställd på Kopiera om den är nyare.

Mer information finns i Projektstruktur i den isolerade arbetsguiden.

Mer information finns i Projekt för functions-klassbibliotek.

Arbeta med appinställningar lokalt

När funktionsappen körs i Azure lagras de inställningar som krävs av dina funktioner krypterade i appinställningarna. Under den lokala utvecklingen läggs de här inställningarna i stället till i Values samlingen i local.settings.json-filen . Filen local.settings.json lagrar även inställningar som används av lokala utvecklingsverktyg.

Objekt i Values samlingen i projektets local.settings.json-fil är avsedda att spegla objekt i funktionsappens programinställningar i Azure.

Visual Studio laddar inte upp inställningarna automatiskt i local.settings.json när du publicerar projektet. För att se till att de här inställningarna också finns i funktionsappen i Azure laddar du upp dem när du har publicerat projektet. Mer information finns i Funktionsappinställningar. Värdena i en ConnectionStrings samling publiceras inte.

Koden kan också läsa funktionsappens inställningsvärden som miljövariabler. Mer information finns i Miljövariabler.

Konfigurera projektet för lokal utveckling

Functions-körningen använder ett lagringskonto internt. Under utvecklingen kan du använda ett giltigt lagringskonto för det här interna kontot, eller så kan du använda Azurite-emulatorn.

För alla andra utlösartyper än HTTP och webhooks måste du ange värdet Values.AzureWebJobsStorage för nyckeln i filenlocal.settings.json :

  • För ett Lagringskonto anger du värdet till anslutningssträngen för ditt lagringskonto.
  • För emulatorn anger du värdet till UseDevelopmentStorage=true.

Om du använder emulatorn ändrar du den här inställningen till en anslutningssträng för ett faktiskt lagringskonto före distributionen. Mer information finns i Lokal lagringsemulator.

Utför följande steg för att ange anslutningssträngen för lagringskontot:

  1. Logga in på Azure-portalen och gå sedan till ditt lagringskonto.

  2. Välj Säkerhets - och>. Under key1 kopierar du värdet för anslutningssträngen .

  3. Öppna filenlocal.settings.json i Visual Studio-projektet. Ange värdet för AzureWebJobsStorage nyckeln till anslutningssträngen som du kopierade.

  4. Upprepa föregående steg för att lägga till unika nycklar i matrisen Values för andra anslutningar som krävs av dina funktioner.

Lägga till en funktion i projektet

I C#-klassbiblioteksfunktioner definieras de bindningar som funktionerna använder genom att använda attribut i koden. När du skapar funktionsutlösare från de angivna mallarna tillämpas utlösarattributen åt dig.

  1. Högerklicka på projektnoden i Solution Explorer och välj Lägg till>ny Azure-funktion.

  2. I dialogrutan Lägg till nytt objekt väljer du Azure-funktion och sedan Lägg till.

  3. Välj en utlösare och ange sedan de bindningsegenskaper som krävs. Om du väljer en utlösare för lagringstjänsten och vill konfigurera anslutningen markerar du kryssrutan för att konfigurera utlösaranslutningen. I följande exempel visas inställningarna för att skapa en utlösarfunktion för kölagring.

    Skärmbild av dialogrutan Ny Azure-funktion för en köutlösare med anslutningssträngens namn inställt på QueueStorage och kön till myqueue-items.

  4. Välj Lägg till. Om du markerar kryssrutan för att konfigurera en lagringsanslutning i föregående steg visas sidan Anslut till beroende . Välj en Azurite Storage-emulator eller Azure Storage och välj sedan Nästa.

    • Om du väljer en Azurite-lagringsemulator visas sidan Anslut till Lagring Azurite-emulator . Utför följande steg:
      1. Välj Nästa.
      2. På sidan Sammanfattning av ändringar väljer du Slutför. Visual Studio konfigurerar beroendet och skapar utlösarklassen.
    • Om du väljer Azure Storage visas sidan Anslut till Azure Storage . Utför följande steg:
      1. Välj ett lagringskonto och välj sedan Nästa. Visual Studio försöker ansluta till ditt Azure-konto och hämta en slutpunkt.
      2. Välj Nästa.
      3. På sidan Sammanfattning av ändringar väljer du Slutför. Visual Studio konfigurerar beroendet och skapar utlösarklassen.

    Det här utlösarexemplet använder en programinställning för lagringsanslutningen med en nyckel med namnet QueueStorage. Den här nyckeln, som lagras i filenlocal.settings.json, refererar antingen till Azurite-emulatorn eller ett lagringskonto.

  5. Granska den nyligen tillagda klassen. Följande C#-klass representerar till exempel en grundläggande utlösarfunktion för kölagring:

    En Run() metod tillskrivs Function. Det här attributet anger att metoden är startpunkten för funktionen.

    using System;
    using Azure.Storage.Queues.Models;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Extensions.Logging;
    
    namespace Company.Function;
    
    public class QueueTriggerCSharp
    {
        private readonly ILogger<QueueTriggerCSharp> _logger;
    
        public QueueTriggerCSharp(ILogger<QueueTriggerCSharp> logger)
        {
            _logger = logger;
        }
    
        [Function(nameof(QueueTriggerCSharp))]
        public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")] QueueMessage message)
        {
            _logger.LogInformation("C# Queue trigger function processed: {messageText}", message.MessageText);
        }
    }
    

    En statisk Run() metod tillskrivs FunctionName. Det här attributet anger att metoden är startpunkten för funktionen.

    using System;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    
    namespace Company.Function
    {
        public class QueueTriggerCSharp
        {
            [FunctionName("QueueTriggerCSharp")]
            public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")]string myQueueItem, ILogger log)
            {
                log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            }
        }
    }
    

Ett bindningsspecifikt attribut tillämpas på varje bindningsparameter som tillhandahålls till startpunktsmetoden. Attributet tar bindningsinformationen som parametrar.

I föregående kod har den första parametern ett QueueTrigger attribut som anger en utlösarfunktion för kölagring. Könamnet och namnet på anslutningssträngens inställning överförs som parametrar till attributetQueueTrigger. I din klassrum:

  • Parametern könamn ska matcha namnet på kön som du använde i ett tidigare steg för att skapa utlösaren, till exempel myqueue-items.
  • Namnet på anslutningssträngsinställningen ska matcha det du använde i ett tidigare steg för att skapa utlösaren, till exempel QueueStorage.

Mer information finns i Azure Queue Storage-utlösare för Azure Functions.

Använd föregående procedur för att lägga till fler funktioner i funktionsappprojektet. Varje funktion i projektet kan ha en annan utlösare, men en funktion måste ha exakt en utlösare. Mer information finns i Azure Functions-utlösare och bindningar.

Lägga till bindningar

Precis som med utlösare läggs indata- och utdatabindningar till i funktionen som bindningsattribut. Utför följande steg för att lägga till bindningar i en funktion:

  1. Se till att du konfigurerar projektet för lokal utveckling.

  2. Lägg till lämpligt NuGet-tilläggspaket för varje specifik bindning. Bindningsspecifika NuGet-paketkrav finns i referensartikeln för bindningen. För paketkrav för Azure Event Hubs-utlösaren kan du till exempel läsa Utlösare och bindningar för Azure Event Hubs för Azure Functions.

  3. Använd följande kommando i Package Manager-konsolen för att installera ett specifikt paket:

    Install-Package Microsoft.Azure.Functions.Worker.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>
    
    Install-Package Microsoft.Azure.WebJobs.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>
    

    I den här koden ersätter du <BINDING_TYPE> med det specifika namnet på bindningstillägget och ersätter <TARGET_VERSION> med en specifik version av paketet, till exempel 4.0.0. Giltiga versioner visas på de enskilda paketsidorna på NuGet.org.

  4. Om det finns appinställningar som bindningen behöver lägger du till Values dem i samlingen i den lokala inställningsfilen.

    Funktionen använder dessa värden när den körs lokalt. När funktionen körs i funktionsappen i Azure använder den inställningarna för funktionsappen. Visual Studio gör det enkelt att publicera lokala inställningar till Azure.

  5. Lägg till lämpligt bindningsattribut i metodsignaturen. I följande kod utlöser Run ett kömeddelande funktionen. Utdatabindningen skapar sedan ett nytt kömeddelande med samma text i en annan kö.

     public class QueueTrigger
    {
        private readonly ILogger _logger;
    
        public QueueTrigger(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<QueueTrigger>();
        }
    
        [Function("CopyQueueMessage")]
        [QueueOutput("myqueue-items-destination", Connection = "QueueStorage")]
        public string Run([QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem)
        {
            _logger.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            return myQueueItem;
        }
    }
    

    Attributet QueueOutput definierar bindningen för metoden. För flera utdatabindningar placerar du i stället det här attributet på en strängegenskap för det returnerade objektet. Mer information finns i Flera utdatabindningar.

    public static class SimpleExampleWithOutput
    {
        [FunctionName("CopyQueueMessage")]
        public static void Run(
            [QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem, 
            [Queue("myqueue-items-destination", Connection = "QueueStorage")] out string myQueueItemCopy,
            ILogger log)
        {
            log.LogInformation($"CopyQueueMessage function processed: {myQueueItem}");
            myQueueItemCopy = myQueueItem;
        }
    }
    

    Attributet Queue för parametern out definierar utdatabindningen.

    Anslutningen till Queue Storage hämtas från inställningen QueueStorage . Mer information finns i referensartikeln för den specifika bindningen.

En fullständig lista över bindningar som stöds av Functions finns i Bindningar som stöds. Ett mer komplett exempel på det här scenariot finns i Ansluta funktioner till Azure Storage med Visual Studio.

Köra funktioner lokalt

Du kan använda Azure Functions Core Tools för att köra Functions-projekt på din lokala utvecklingsdator. När du väljer F5 för att felsöka ett Functions-projekt börjar den lokala Functions-värden (func.exe) lyssna på en lokal port (vanligtvis 7071). Alla anropsbara funktionsslutpunkter skrivs till utdata och du kan använda dessa slutpunkter för att testa dina funktioner. Mer information finns i Utveckla Azure Functions lokalt med core tools. Du uppmanas att installera dessa verktyg första gången du startar en funktion från Visual Studio.

Viktigt!

Från och med version 4.0.6517 av Core Tools måste processmodellprojekt referera till version 4.5.0 eller senare av Microsoft.NET.Sdk.Functions. Om du använder en tidigare version func start genererar kommandot ett fel.

Utför följande steg för att starta funktionen i Visual Studio i felsökningsläge:

  1. Välj F5. Om du uppmanas att göra det godkänner du begäran från Visual Studio om att ladda ned och installera Azure Functions Core Tools. Du kan också behöva aktivera ett brandväggsundantag så att verktygen kan hantera HTTP-begäranden.

  2. När projektet körs testar du koden på samma sätt som du testar en distribuerad funktion.

    När du kör Visual Studio i felsökningsläge träffas brytpunkter som förväntat.

Ett mer detaljerat testscenario som använder Visual Studio finns i Testfunktioner senare i den här artikeln.

Publicera till Azure

När du publicerar ditt Functions-projekt i Azure använder Visual Studio zip-distribution för att distribuera projektfilerna. När det är möjligt bör du också välja Kör från paketfilen så att projektet körs i distributionspaketet (.zip). Mer information finns i Köra dina funktioner från en paketfil i Azure.

Distribuera inte till Functions med hjälp av Web Deploy (msdeploy).

Följ stegen nedan för att publicera projektet till en funktionsapp i Azure:

  1. Högerklicka på projektet i Solution Explorer och välj sedan Publicera.

  2. Gör följande val på sidan Publicera :

    • Mål väljer du Azure och sedan Nästa.
    • Specifikt mål väljer du Azure-funktionsapp och sedan Nästa.
    • Functions-instansen väljer du Skapa ny.

    Skärmbild av sidan Publicera. I avsnittet Functions-instans visas en resursgrupp och Skapa ny markeras.

  3. Skapa en ny instans med hjälp av de värden som anges i följande tabell:

    Inställning Värde beskrivning
    Namn Ett globalt unikt namn Namnet måste unikt identifiera din nya funktionsapp. Acceptera det föreslagna namnet eller ange ett nytt namn. Följande tecken är giltiga: a-z, 0-9och -.
    Prenumerationsnamn Namnet på din prenumeration Funktionsappen skapas i en Azure-prenumeration. Acceptera standardprenumerationen eller välj en annan från listan.
    Resursgrupp Namnet på resursgruppen Funktionsappen skapas i en resursgrupp. Välj Ny för att skapa en ny resursgrupp. Du kan också välja en befintlig resursgrupp i listan.
    Plantyp Flexförbrukning När du publicerar projektet till en funktionsapp som körs i en Flex Consumption-plan kan det hända att du endast betalar för exekveringarna av din funktionsapp. Andra värdplaner kan medföra högre kostnader.
    VIKTIGT:
    När du skapar en Flex Consumption-plan måste du först välja App Service-plan och sedan välja Flex Consumption igen för att rensa ett problem med dialogrutan.
    Operativsystem Linux Flex Consumption-planen kräver för närvarande Linux.
    Plats Platsen för apptjänsten Välj en plats i en Azure-region som stöds av Flex Consumption-planen. När du väljer en region som inte stöds är knappen Skapa nedtonad.
    Instansminnesstorlek 2048 Minnesstorleken för de virtuella datorinstanser där appen körs är unik för Flex Consumption-planen.
    Azure Storage Ett allmänt lagringskonto Functions-körningen kräver ett lagringskonto. Välj Ny för att konfigurera ett allmänt lagringskonto. Du kan också använda ett befintligt konto som uppfyller kraven för lagringskontot.
    Application Insights En Application Insights-instans Du bör aktivera Application Insights-integrering för din funktionsapp. Välj Ny för att skapa en ny instans, antingen i en ny eller i en befintlig Log Analytics-arbetsyta. Du kan också använda en befintlig instans.

    Skärmbild av dialogrutan Skapa ny funktionsapp. Fält för namn, prenumeration, resursgrupp, plan och andra inställningar fylls i.

  4. Välj Skapa för att skapa en funktionsapp och dess relaterade resurser i Azure. Statusen för resursskapande visas i det nedre vänstra hörnet i fönstret.

  5. Välj Slutför. Fönstret för profilskapandets publiceringsförlopp visas. När profilen har skapats väljer du Stäng.

  6. På sidan Publicera profil väljer du Publicera för att distribuera paketet som innehåller dina projektfiler till din nya funktionsapp i Azure.

    När distributionen är klar visas rot-URL:en för funktionsappen i Azure på publiceringsprofilsidan.

  7. På sidan Publicera profil går du till avsnittet Värd . Välj ellipsen (...) och välj sedan Öppna i Azure-portalen. Den nya funktionsappens Azure-resurs öppnas i Azure Portal.

    Skärmbild av publiceringsprofilsidan. I avsnittet Värd är snabbmenyn med ellipsen öppen och Öppna i Azure-portalen är markerad.

Funktionsappinställningar

Visual Studio laddar inte upp appinställningar automatiskt när du publicerar projektet. Om du lägger till inställningar i local.settings.json-filen måste du också lägga till dem i funktionsappen i Azure.

Det enklaste sättet att ladda upp de inställningar som krävs till funktionsappen i Azure är att hantera dem i Visual Studio. På sidan Publicera profil går du till avsnittet Värd . Välj ellipsen (...) och välj sedan Hantera Azure App Service-inställningar.

Skärmbild av avsnittet Värd på publiceringsprofilsidan. Ellipsmenyn är öppen och alternativet Hantera Azure App Service-inställningar är markerat.

När du gör valet öppnas dialogrutan Programinställningar för funktionsappen. Du kan använda den här dialogrutan för att lägga till programinställningar eller ändra befintliga.

Skärmbild av dialogrutan Programinställningar som visar lokala värden och fjärrvärden för olika inställningar och kontroller för att lägga till och redigera värden.

För varje inställning är det lokala värdet värdet i filenlocal.settings.json och fjärrvärdet är värdet i funktionsappen i Azure.

  • Om du vill skapa en appinställning väljer du Lägg till inställning.
  • Om du vill kopiera ett inställningsvärde från fältet Lokalt till fältet Fjärr väljer du Infoga värde från Lokalt.

Väntande ändringar skrivs till den lokala inställningsfilen och funktionsappen när du väljer OK.

Anteckning

Som standard är local.settings.json-filen inte incheckad i källkontrollen. Om du klonar ett lokalt Functions-projekt från källkontrollen har projektet därför ingen local.settings.json fil. Du måste skapa local.settings.json filen manuellt i projektroten så att dialogrutan Programinställningar fungerar som förväntat.

Du kan också hantera programinställningar på något av följande sätt:

Fjärrfelsökning

Om du vill felsöka funktionsappen via fjärranslutning måste du publicera en felsökningskonfiguration för projektet. Du måste också aktivera fjärrfelsökning i funktionsappen i Azure.

Det här avsnittet förutsätter att en felsökningskonfiguration för funktionsappen publiceras.

Överväganden för fjärrfelsökning

  • Fjärrfelsökning rekommenderas inte för en produktionstjänst.
  • Om du vill använda fjärrfelsökning måste du vara värd för funktionsappen i en Premium- eller App Service-plan.
  • Fjärrfelsökning stöds för närvarande endast när du kör C#-appen i Windows.
  • Om funktionen Just My Code är aktiverad i Visual Studio inaktiverar du den. Anvisningar finns i Aktivera eller inaktivera Just My Code.
  • Undvik långa stopp vid brytpunkter när du använder fjärrfelsökning. När en process stoppas i mer än några minuter behandlar Azure den som en process som inte svarar och stänger av den.
  • När du felsöker skickar servern data till Visual Studio, vilket kan påverka bandbreddsavgifterna. Information om bandbreddspriser finns i Priskalkylatorn.
  • Fjärrfelsökning inaktiveras automatiskt i funktionsappen efter 48 timmar. Därefter måste du aktivera fjärrfelsökning igen.

Bifoga felsökningsprogrammet

När du felsöker en isolerad arbetsprocessapp måste du koppla fjärrfelsökaren till en separat .NET-process. Flera andra konfigurationssteg krävs också.

Utför följande steg för att ansluta en fjärrfelsökare till en funktionsapp som körs i en process som är separat från Functions-värden:

  1. På sidan Publicera profil går du till avsnittet Värd . Välj ellipsen (...) och välj sedan Bifoga felsökningsprogram.

    Visual Studio ansluter till funktionsappen och aktiverar fjärrfelsökning om den inte redan är aktiverad.

    Anteckning

    Eftersom fjärrfelsökaren inte kan ansluta till värdprocessen kan ett felmeddelande visas. I vilket fall som helst kan den lokala felsökaren inte komma åt dina brytpunkter eller ge dig ett sätt att inspektera variabler eller stega igenom kod.

  2. På Visual Studio-felsökningsmenyn väljer du Anslut till process.

  3. I dialogrutan Bifoga till process utför du följande steg:

    1. Bredvid Anslutningstyp väljer du Microsoft Azure App Services.
    2. Bredvid Anslutningsmål väljer du Sök.
  4. I dialogrutan Azure Attach to Process söker du efter och väljer din funktion app och väljer sedan OK.

  5. Om du uppmanas att göra det kan du tillåta Visual Studio-åtkomst via din lokala brandvägg.

  6. I dialogrutan Koppla till process väljer du Visa processer för alla användare. Välj dotnet.exeoch välj sedan Bifoga.

    Skärmbild av dialogrutan Bifoga till process. Anslutningstypen är Microsoft Azure App Services. I processtabellen är dotnet.exe valt.

När åtgärden är klar är du ansluten till din C#-klassbibliotekskod som körs i en isolerad arbetsprocess. Nu kan du felsöka din funktionsapp som vanligt.

För att koppla en fjärrfelsökare till en funktionsapp som körs i process med Functions-värden, utför följande steg.

På sidan Publicera profil går du till avsnittet Värd . Välj ellipsen (...) och välj sedan Bifoga felsökningsprogram.

Visual Studio ansluter till funktionsappen och aktiverar fjärrfelsökning om den inte redan är aktiverad. Den letar också upp och kopplar felsökningsprogrammet till värdprocessen för appen. Nu kan du felsöka din funktionsapp som vanligt.

När du är klar med felsökningen bör du inaktivera fjärrfelsökning.

Inaktivera fjärrfelsökning

När du har slutfört fjärrfelsökningen av koden bör du inaktivera fjärrfelsökning i Azure-portalen. Fjärrfelsökning inaktiveras automatiskt efter 48 timmar, om du glömmer det.

  1. På sidan Publicera profil går du till avsnittet Värd . Välj ellipsen (...) och välj sedan Öppna i Azure-portalen. Azure-portalen öppnas för funktionsappen som ditt projekt distribueras till.

  2. I funktionsappen väljer du Inställningar>Konfiguration och går sedan till fliken Allmänna inställningar . Bredvid Fjärrfelsökning väljer du Av. Välj Spara och välj sedan Fortsätt.

När funktionsappen har startats om kan du inte längre fjärransluta till dina fjärrprocesser. Du kan använda samma flik i Azure-portalen för att aktivera fjärrfelsökning utanför Visual Studio.

Övervaka funktioner

Det rekommenderade sättet att övervaka dina funktioner är genom att integrera funktionsappen med Application Insights. Du bör aktivera den här integreringen när du skapar din funktionsapp under Visual Studio-publicering.

Om integreringen inte har konfigurerats under publiceringen av någon anledning bör du fortfarande aktivera Application Insights-integrering för funktionsappen i Azure.

Mer information om hur du använder Application Insights för övervakning finns i Övervaka körningar i Azure Functions.

Testfunktioner

I det här avsnittet beskrivs hur du skapar ett C#-modellprojekt som du kan testa med hjälp av xUnit, ett testverktyg med öppen källkod för .NET.

Steg 1: Konfiguration

Följ de här stegen för att konfigurera miljön, inklusive appprojektet och funktionerna, som krävs för att stödja dina tester:

  1. Skapa ett Azure Functions-projekt med namnet Functions i Visual Studio.

  2. Skapa en HTTP-funktion från mallen:

    1. Högerklicka på Functions-projektet i Solution Explorer och välj sedan Lägg till>ny Azure-funktion.
    2. I dialogrutan Lägg till nytt objekt väljer du Azure-funktion och sedan Lägg till.
    3. Välj Http-utlösare och välj sedan Lägg till.
    4. Byt namn på den nya klassen MyHttpTrigger.
  3. Skapa en timerfunktion från mallen:

    1. Högerklicka på Functions-projektet i Solution Explorer och välj sedan Lägg till>ny Azure-funktion.
    2. I dialogrutan Lägg till nytt objekt väljer du Azure-funktion och sedan Lägg till.
    3. Välj Timer-utlösare och välj sedan Lägg till.
    4. Byt namn på den nya klassen MyTimerTrigger.
  4. Skapa en xUnit-testapp i lösningen:

    1. Högerklicka på lösningen som innehåller ditt Functions-projekt i Solution Explorer och välj sedan Lägg till>nytt projekt.
    2. Välj mallen xUnit Test Project och välj sedan Nästa.
    3. Ge projektet namnet Functions.Tests.
  5. Ta bort standardtestfilerna från projektet Functions.Tests .

  6. Använd NuGet för att lägga till en referens från testappen till Microsoft.AspNetCore.Mvc. Du kan använda Package Manager-konsolen, eller så kan du utföra följande steg:

    1. Högerklicka på projektet Functions.Tests i Solution Explorer och välj sedan Hantera NuGet-paket.
    2. Sök efter och installera Microsoft.AspNetCore.Mvc.
  7. I appen Functions.Testslägger du till en referens till Functions-appen :

    1. Högerklicka på projektet Functions.Tests i Solution Explorer och välj sedan Lägg till>projektreferens.
    2. Välj Functions-projektet och välj sedan OK.

Steg 2: Skapa testklasser

I det här avsnittet skapar du de klasser som du använder för att köra de automatiserade testerna.

Varje funktion tar en implementering av ILogger för att hantera meddelandeloggning. I vissa tester loggas inga meddelanden, eller så spelar det ingen roll hur loggning implementeras. Andra tester måste utvärdera loggade meddelanden för att avgöra om ett test ska klaras.

  1. Skapa en klass i ditt Functions.Tests-projekt med namnet NullScope och lägg till följande kod. Den här klassen ger ett simulerat omfång. I ett senare steg skapar du en implementering av ILogger som använder det här omfånget.

    using System;
    
    namespace Functions.Tests
    {
        public class NullScope : IDisposable
        {
            public static NullScope Instance { get; } = new NullScope();
    
            private NullScope() { }
    
            public void Dispose() { }
        }
    }
    
  2. Skapa en klass i ditt Functions.Tests-projekt med namnet ListLogger och lägg till följande kod. Den här klassen har en intern lista över meddelanden som ska utvärderas under testningen. För att implementera det erforderliga ILogger gränssnittet använder klassen mockområdet från NullScope-klassen. Testfallen passerar det simulerade omfånget ListLogger till klassen.

    using Microsoft.Extensions.Logging;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Functions.Tests
    {
        public class ListLogger : ILogger
        {
            public IList<string> Logs;
    
            public IDisposable BeginScope<TState>(TState state) => NullScope.Instance;
    
            public bool IsEnabled(LogLevel logLevel) => false;
    
            public ListLogger()
            {
                this.Logs = new List<string>();
            }
    
            public void Log<TState>(LogLevel logLevel,
                                    EventId eventId,
                                    TState state,
                                    Exception exception,
                                    Func<TState, Exception, string> formatter)
            {
                string message = formatter(state, exception);
                this.Logs.Add(message);
            }
        }
    }
    

    Klassen ListLogger implementerar följande medlemmar enligt gränssnittets kontrakt ILogger :

    • BeginScope: Omfång lägger till kontext i loggningen. I det här fallet pekar testet på den statiska instansen NullScope på klassen så att testet kan fungera.
    • IsEnabled: Ett standardvärde på false anges.
    • Log: Den här metoden använder den angivna formatter funktionen för att formatera meddelandet. Metoden lägger sedan till den resulterande texten i Logs samlingen.

    Samlingen Logs är en instans av List<string> och initieras i konstruktorn.

  3. Skapa en kodfil i projektet Functions.Tests med namnet LoggerTypes.cs och lägg till följande kod:

    namespace Functions.Tests
    {
        public enum LoggerTypes
        {
            Null,
            List
        }
    }
    

    Den här uppräkningen anger vilken typ av logger som testerna använder.

  4. Skapa en klass i projektet Functions.Tests med namnet TestFactory och lägg till följande kod:

    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Http.Internal;
    using Microsoft.Extensions.Logging;
    using Microsoft.Extensions.Logging.Abstractions;
    using Microsoft.Extensions.Primitives;
    using System.Collections.Generic;
    
    namespace Functions.Tests
    {
        public class TestFactory
        {
            public static IEnumerable<object[]> Data()
            {
                return new List<object[]>
                {
                    new object[] { "name", "Bernardo" },
                    new object[] { "name", "Ananya" },
                    new object[] { "name", "Vlad" }
    
                };
            }
    
            private static Dictionary<string, StringValues> CreateDictionary(string key, string value)
            {
                var qs = new Dictionary<string, StringValues>
                {
                    { key, value }
                };
                return qs;
            }
    
            public static HttpRequest CreateHttpRequest(string queryStringKey, string queryStringValue)
            {
                var context = new DefaultHttpContext();
                var request = context.Request;
                request.Query = new QueryCollection(CreateDictionary(queryStringKey, queryStringValue));
                return request;
            }
    
            public static ILogger CreateLogger(LoggerTypes type = LoggerTypes.Null)
            {
                ILogger logger;
    
                if (type == LoggerTypes.List)
                {
                    logger = new ListLogger();
                }
                else
                {
                    logger = NullLoggerFactory.Instance.CreateLogger("Null Logger");
                }
    
                return logger;
            }
        }
    }
    

    Klassen TestFactory implementerar följande medlemmar:

    • Data: Den här egenskapen returnerar en IEnumerable-samling med exempeldata. Nyckel/värde-paren representerar värden som skickas till en frågesträng.
    • CreateDictionary: Den här metoden accepterar ett nyckel/värde-par som argument. Den returnerar en ny instans av Dictionary som används för att skapa en instans av QueryCollection för att representera frågesträngsvärden.
    • CreateHttpRequest: Den här metoden skapar en HTTP-begäran som initieras med de angivna frågesträngsparametrarna.
    • CreateLogger: Den här metoden returnerar en implementering av ILogger som används för testning. Implementeringen ILogger beror på den angivna loggningstypen. Om en listtyp anges håller instansen ListLogger reda på loggade meddelanden som är tillgängliga för utvärdering i tester.
  5. Skapa en klass i projektet Functions.Tests med namnet FunctionsTests och lägg till följande kod:

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Logging;
    using Xunit;
    
    namespace Functions.Tests
    {
        public class FunctionsTests
        {
            private readonly ILogger logger = TestFactory.CreateLogger();
    
            [Fact]
            public async void Http_trigger_should_return_known_string()
            {
                var request = TestFactory.CreateHttpRequest("name", "Bernardo");
                var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger);
                Assert.Equal("Hello, Bernardo. This HTTP triggered function executed successfully.", response.Value);
            }
    
            [Theory]
            [MemberData(nameof(TestFactory.Data), MemberType = typeof(TestFactory))]
            public async void Http_trigger_should_return_known_string_from_member_data(string queryStringKey, string queryStringValue)
            {
                var request = TestFactory.CreateHttpRequest(queryStringKey, queryStringValue);
                var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger);
                Assert.Equal($"Hello, {queryStringValue}. This HTTP triggered function executed successfully.", response.Value);
            }
    
            [Fact]
            public void Timer_should_log_message()
            {
                var logger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List);
                new MyTimerTrigger().Run(null, logger);
                var msg = logger.Logs[0];
                Assert.Contains("C# Timer trigger function executed at", msg);
            }
        }
    }
    

    Den här klassen implementerar följande medlemmar:

    • Http_trigger_should_return_known_string: Det här testet använder frågesträngsvärdet name=Bernardo för att skapa en begäran till en HTTP-funktion. Det här testet kontrollerar att det förväntade svaret returneras.
    • Http_trigger_should_return_string_from_member_data: Det här testet använder xUnit-attribut för att tillhandahålla exempeldata till HTTP-funktionen.
    • Timer_should_log_message: Det här testet skapar en instans av ListLogger och skickar den till en timerfunktion. När funktionen har körts kontrolleras loggen för att kontrollera att det förväntade meddelandet finns.
  6. För att få åtkomst till programinställningarna i dina tester kan du mata in en IConfiguration implementering med simulerade miljövariabelvärden i din funktion.

Steg 3: Utför tester

Om du vill köra testerna i Visual Studio väljer du Visa>testutforskaren. I Testutforskaren väljer du Kör>kör alla tester i vyn.

Skärmbild av Visual Studio. TestUtforskaren visar att fem tester har godkänts. I Solution Explorer visas projekten Functions och Functions.Test.

Steg 4: Felsöka tester

Om du vill felsöka testerna anger du en brytpunkt för ett test. I Testutforskaren väljer du Kör>Felsök Senaste körning.