Übung: Lokales Erstellen und Testen einer einfachen Azure-Funktion mit Visual Studio

Abgeschlossen

Visual Studio bietet eine ausgezeichnete Umgebung zum Erstellen und Testen einer Azure-Funktions-App. Sie können eine Azure-Funktion lokal entwickeln und überprüfen, ob sie ordnungsgemäß funktioniert, bevor Sie sie in der Cloud bereitstellen.

Im Szenario mit der Website für Luxusuhren ist eine Funktion erforderlich, die detaillierte Information zu einer Uhr zurückgibt, wenn die Modellnummer der Uhr angegeben wird. Die Daten, die zurückgegeben werden sollen, umfassen den Hersteller, die Art des Gehäusebodens (fest, transparent, graviert), die Lünette, den Stil des Zifferblatts, die Verarbeitung des Gehäuses, die Anzahl der Steine usw.

In dieser Übung implementieren und testen Sie eine Version dieser Funktion lokal mit Visual Studio.

Hinweis

Bevor Sie mit dieser Übung beginnen, stellen Sie sicher, dass Sie Visual Studio 2022 zusammen mit den Web- und Cloudworkloaderweiterungen ASP.NET und Webentwicklung und Azure-Entwicklung installiert haben.

Erstellen einer Azure-Funktions-App

Erstellen Sie mithilfe der Azure Functions-Vorlage eine Azure-Funktions-App.

  1. Starten Sie den Visual Studio-Installer, und wählen Sie auf der Startseite von Visual Studio 2022 die Option Anpassen aus.

  2. Stellen Sie sicher, dass ASP.NET and web development und Azure development ausgewählt und verfügbar sind (wenn dies nicht der Fall ist, wählen Sie Beim Herunterladen installieren aus), und wählen Sie dann Schließen aus.

    Screenshot: Visual Studio 2022 mit den hervorgehobenen Workloads „ASP.NET“ und „Azure development“

  3. Wählen Sie auf der Startseite von Visual Studio 2022 die Option Starten aus.

  4. Wählen Sie im Menü Erste Schritte die Option Neues Projekt erstellen aus. Die Seite Neues Projekt erstellen wird angezeigt.

  5. Suchen Sie nach der Azure Functions-Vorlage, oder scrollen Sie zu ihr, und wählen Sie dann Weiter aus.

    Screenshot: Die Seite „Neues Projekt erstellen“ in Visual Studio 2022 mit hervorgehobener Azure Functions-Vorlage

  6. Die Seite Neues Projekt konfigurieren wird angezeigt. Geben Sie die folgenden Werte ein.

    Feld Wert
    Projektname WatchPortalFunction
    Location Wählen Sie einen Speicherort für Ihr Projekt aus, indem Sie auf Ihrem lokalen Computer zu einem Ordner navigieren oder einen Ordner erstellen.
    Lösungsname Übernehmen Sie WatchPortalFunction (Standard).
    Legen Sie die Projektmappe und das Projekt im selben Verzeichnis ab. Nicht aktiviert (NICHT ausgewählt) Durch diese Einstellung wird sichergestellt, dass die richtige Ordnerstruktur für dieses Modul erstellt wird.

    Screenshot: Die Seite „Neues Projekt konfigurieren“ mit hervorgehobener „Erstellen“-Schaltfläche

  7. Klicken Sie auf Weiter.

  8. Die Seite Weitere Informationen wird angezeigt.

  9. Wählen Sie folgende Werte aus:

    Feld Wert
    Dotnet version (Dotnet-Version) *.NET 6.0 (LTS)
    Function trigger (Funktions-Trigger) HTTP-Trigger
    Verwenden von Azurite für das Runtimespeicherkonto (AzureWebJobsStorage) Überprüft
    Aktivieren von Docker Nicht aktiviert
    Autorisierungsstufe Anonym

    Wenn eine Benachrichtigung in Visual Studio angezeigt wird, die besagt, das Updates bereit sind, wählen Sie Aktualisieren aus.

  10. Klicken Sie auf Erstellen.

    Screenshot: Azure Functions-Trigger mit hervorgehobenem HTTP-Trigger

    Visual Studio erstellt das Projekt WatchPortalFunction und zeigt die Quellcodedatei Function1.cs der Funktions-App im Code-Editor-Fenster an. Die Datei enthält den Code für eine Klasse namens Function1.

    Wie im folgenden Codebeispiel gezeigt, enthält die Klasse Function1 Codebausteine aus der HTTP-Triggervorlage. Die Run-Methode ist mit dem Attribut [FunctionName ("Function1")] versehen. In der vorherigen Lerneinheit haben Sie erfahren, dass die Bausteinparameter für die Run-Methode ein HttpRequest-Objekt sind, das die Details der Anforderung enthält, die die Funktion ausgelöst hat, sowie einen Ablaufverfolgungsprotokolleintrag zum Aufzeichnen von Ablaufverfolgungsinformationen.

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

Erstellen der WatchInfo-Azure-Funktion

  1. Wählen Sie im Menü „Ansicht“ die Option Projektmappen-Explorer aus. Klicken Sie im Fenster Projektmappen-Explorer mit der rechten Maustaste auf das Azure Functions-Projekt WatchPortalFunction, und wählen Sie im Kontextmenü Hinzufügen>Neue Azure-Funktion aus.

    Screenshot: Fenster des Projektmappen-Explorers. Die Benutzerin bzw. der Benutzer hat „Hinzufügen“ > „Neue Azure-Funktion“ ausgewählt.

  2. Klicken Sie im Fenster Neues Element hinzufügen – WatchPortalFunction auf Azure-Funktion. Geben Sie im Feld Name die Bezeichnung WatchInfo.cs ein, und klicken Sie anschließend auf Hinzufügen.

    Screenshot: Fenster „Neues Element hinzufügen“ Die Azure-Funktionsvorlage wird ausgewählt, und die neue Funktion erhält den Namen „WatchInfo.cs“.

  3. Klicken Sie im Fenster Neue Azure-Funktion – WatchInfo auf HTTP-Trigger. Wählen Sie in der Dropdownliste Autorisierungsstufe die Option Anonym und anschließend Hinzufügen aus.

    Screenshot: Fenster „Neue Azure-Funktion“. Der HTTP-Trigger mit anonymen Zugriffsrechten wird ausgewählt.

    Visual Studio erstellt eine neue Funktion, und die Run-Methode wird mit dem [FunctionName("WatchInfo")]-Attribut annotiert.

  4. Löschen Sie im Text der Run-Funktion den Code nach der Zeile log.LogInformation. Das Ergebnis sollte wie folgt aussehen:

    namespace WatchPortalFunction
    {
        public static class WatchInfo
        {
            [FunctionName("WatchInfo")]
            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.");
            }
        }
    }
    
  5. Fügen Sie den folgenden Code in den Text der Run-Methode nach der Zeile log.LogInformation ein.

    // Retrieve the model id from the query string
    string model = req.Query["model"];
    
    // If the user specified a model id, find the details of the model of watch
    if (model != null)
    {
        // Use dummy data for this example
        dynamic watchinfo = new { Manufacturer = "abc", CaseType = "Solid", Bezel = "Titanium", Dial = "Roman", CaseFinish = "Silver", Jewels = 15 };
    
        return (ActionResult)new OkObjectResult($"Watch Details: {watchinfo.Manufacturer}, {watchinfo.CaseType}, {watchinfo.Bezel}, {watchinfo.Dial}, {watchinfo.CaseFinish}, {watchinfo.Jewels}");
    }
    return new BadRequestObjectResult("Please provide a watch model in the query string");
    

    Dieser Code liest den model-Parameter aus der Abfragezeichenfolge in der HTTP-Anforderung und gibt die Details für das Uhrenmodell zurück. In diesem Beispielcode haben Sie watchinfo-Beispieldaten erstellt, die unabhängig vom Wert von model zurückgegeben werden. Die Funktion gibt eine Antwort zurück, die diese Details enthält. Wenn die HTTP-Anforderung keine Abfragezeichenfolge enthält, gibt die Funktion eine Fehlermeldung zurück. In einem realen Beispiel würden Sie den model-Wert verwenden, um einen Lookupvorgang für den richtigen watchinfo-Wert durchzuführen, der zurückgegeben werden soll.

Lokales Testen der Azure-Funktion

  1. Wählen Sie auf der Befehlsleiste Debuggen>Debuggen starten aus.

    Visual Studio erstellt die Azure-Funktions-App und startet die Azure Functions-Runtime. Ein Ausgabefenster wird geöffnet, in dem Meldungen angezeigt werden, wenn die Runtime gestartet wird. Wenn die Runtime bereit ist, werden eine Liste der HTTP-Funktionen und die URL angezeigt, die Sie zum Auslösen der einzelnen Funktionen verwenden können.

    Screenshot: Fenster „Azure Functions Runtime“ Die Runtime startet die Azure-Funktions-App und zeigt die URLs für die Azure-Funktionen „Function1“ und „WatchInfo“ an.

  2. Öffnen Sie einen Webbrowser, und geben Sie die im Fenster „Runtime“ angezeigte URL ein. Die Standard-URL lautet http://localhost:7071/api/WatchInfo?model=abc, die Sie auch in dieser Übung verwenden. Diese Anforderung löst die WatchInfo-Funktion aus und übergibt das Modell abc als Parameter der Abfragezeichenfolge. Der Webbrowser sollte die Pseudodetails anzeigen, die von der Funktion generiert werden.

    Screenshot: Ein Webbrowser, der die WatchInfo-Azure-Funktion auslöst. Die Funktion gibt Platzhalterdetails für das Modell zurück, das in der Abfragezeichenfolge der bereitgestellten URL angegeben ist.

  3. Geben Sie die URL http://localhost:7071/api/WatchInfo ein. Diese Anforderung enthält keine Abfragezeichenfolge. Der Trigger gibt die Fehlerantwort zurück, und der Webbrowser zeigt die Meldung Please provide a watch model in the query string an.

  4. Schließen Sie den Webbrowser, führen Sie die Azure-Funktions-App jedoch weiterhin aus.

  5. Legen Sie in Visual Studio einen Breakpoint in der Codezeile fest, die das Modell aus der Abfragezeichenfolge abruft.

    Screenshot: Visual Studio mit einem Breakpoint in der Anweisung, die das Modell aus der Abfragezeichenfolge liest

  6. Starten Sie den Webbrowser neu, und geben Sie die URL ohne die Abfragezeichenfolge http://localhost:7071/api/WatchInfo ein.

    Visual Studio hebt den Code an dem Haltepunkt hervor, an dem die Ausführung angehalten wird.

  7. Drücken Sie in Visual Studio F10, um die Anweisung am Breakpoint zu überspringen.

  8. Überprüfen Sie auf der Registerkarte Auto des Fensters Debugger, ob die model-Variable null ist. Die Variable zeigt diesen Wert an, da die Abfragezeichenfolge keinen Modellparameter enthält.

    Screenshot: Visual Studio-Debugger mit dem Wert der Modellvariablen

  9. Drücken Sie F10 erneut, und stellen Sie sicher, dass die Steuerung zu der Anweisung springt, die ein BadRequestObjectResult-Objekt zurückgibt.

  10. Drücken Sie F5, um die Methode weiterhin auszuführen und zum Webbrowser zurückzukehren. Die gleiche Fehlermeldung sollte angezeigt werden.

  11. Geben Sie im Webbrowser die URL mit einer Abfragezeichenfolge und einem Modellparameter ein. Durchlaufen Sie die Funktion im Debugger, und stellen Sie sicher, dass das Modell richtig abgerufen wird. Die model-Variable sollte mit dem Wert des Parameters aufgefüllt werden, und die Details des Modells sollten als ein OkObjectResult-Objekt zurückgegeben werden.

  12. Wählen Sie in der Menüleiste Debuggen>Debuggen beenden aus.

In dieser Übung haben Sie gesehen, wie die Erweiterung Azure Functions-Tools in Visual Studio das Erstellen einer Azure-Funktions-App vereinfacht und Ihnen ermöglicht, vertraute Tools zum Erstellen und Debuggen Ihres Codes zu verwenden.