Samouczek: wprowadzenie do usługi Azure Functions i Visual Studio dla komputerów Mac

Ważne

Visual Studio dla komputerów Mac ma zostać wycofany 31 sierpnia 2024 r.Nowoczesne zasady cyklu życia. Mimo że możesz nadal pracować z Visual Studio dla komputerów Mac, istnieje kilka innych opcji dla deweloperów na komputerze Mac, takich jak wersja zapoznawcza nowego rozszerzenia zestawu deweloperskiego języka C# dla programu VS Code.

Dowiedz się więcej o osiach czasu pomocy technicznej i alternatywach.

W tym laboratorium dowiesz się, jak rozpocząć tworzenie usługi Azure Functions przy użyciu Visual Studio dla komputerów Mac. Zintegrujesz się również z tabelami usługi Azure Storage, które reprezentują jeden z wielu rodzajów powiązań i wyzwalaczy dostępnych dla deweloperów usługi Azure Functions.

Cele

  • Tworzenie i debugowanie lokalnej usługi Azure Functions
  • Integracja z zasobami internetowymi i zasobami usługi Azure Storage
  • Organizowanie przepływu pracy obejmującego wiele funkcji platformy Azure

Wymagania

  • Visual Studio dla komputerów Mac wersji 7.5 lub nowszej.
  • Subskrypcja platformy Azure (dostępna bezpłatnie).https://azure.com/free

Ćwiczenie 1. Tworzenie projektu usługi Azure Functions

  1. Uruchom Visual Studio dla komputerów Mac.

  2. Wybierz pozycję Plik > nowe rozwiązanie.

  3. W kategorii Ogólne chmury > wybierz szablon usługi Azure Functions. Użyjesz języka C# do utworzenia biblioteki klas platformy .NET, która hostuje usługę Azure Functions. Kliknij przycisk Dalej.

    Azure Functions template selection

  4. Ustaw nazwę projektu na "AzureFunctionsLab", a następnie kliknij pozycję Utwórz.

    naming and creating your Azure function project

  5. Rozwiń węzły w oknie rozwiązania. Domyślny szablon projektu zawiera odwołania NuGet do różnych pakietów usługi Azure WebJobs, a także pakiet Newtonsoft.Json.

    Istnieją również trzy pliki: — host.json opisujących globalne opcje konfiguracji hosta — local.settings.json do konfigurowania ustawień usługi. — Szablon projektu tworzy również domyślny element HttpTrigger. Ze względu na to laboratorium należy usunąć plik HttpTrigger.cs z projektu.

    Otwórz local.settings.json. Domyślnie ma dwa puste ustawienia parametry połączenia.

    solution window displaying local.settings.json file

Ćwiczenie 2. Tworzenie konta usługi Azure Storage

  1. Zaloguj się do konta platformy Azure pod adresem https://portal.azure.com.

  2. W sekcji Ulubione po lewej stronie ekranu wybierz pozycję Konta magazynu:

    favorites section of Azure portal showing storage accounts item

  3. Wybierz pozycję Dodaj , aby utworzyć nowe konto magazynu:

    Button to add new storage account

  4. Wprowadź globalnie unikatową nazwę nazwy i użyj jej ponownie dla grupy zasobów. Wszystkie inne elementy można zachować jako domyślne.

    new storage account details

  5. Kliknij pozycję Utwórz. Utworzenie konta magazynu może potrwać kilka minut. Po pomyślnym utworzeniu otrzymasz powiadomienie.

    deployment successful notification

  6. Wybierz przycisk Przejdź do zasobu z powiadomienia.

  7. Wybierz kartę Klucze dostępu.

    access key setting

  8. Skopiuj pierwszy ciąg Połączenie ion. Ten ciąg służy do integracji usługi Azure Storage z usługą Azure Functions później.

    information for key 1

  9. Wróć do Visual Studio dla komputerów Mac i wklej pełne parametry połączenia w obszarze jako ustawienie AzureWebJobsStorage w local.settings.json. Teraz możesz odwołać się do nazwy ustawienia w atrybutach funkcji, które wymagają dostępu do jej zasobów.

    local settings file with connection key entered

Przykład 3. Tworzenie i debugowanie funkcji platformy Azure

  1. Teraz możesz rozpocząć dodawanie kodu. Podczas pracy z biblioteką klas platformy .NET usługa Azure Functions jest dodawana jako metody statyczne. W oknie rozwiązania kliknij prawym przyciskiem myszy węzeł projektu AzureFunctions i wybierz pozycję Dodaj > funkcję:

    Add function option

  2. W oknie dialogowym Nowe funkcje platformy Azure wybierz szablon Ogólny element webhook. Ustaw nazwę na Dodaj, a następnie kliknij przycisk OK, aby utworzyć funkcję:

    New Azure Functions dialog

  3. W górnej części nowego pliku dodaj poniższe dyrektywy using :

    using Microsoft.Azure.WebJobs.Extensions.Http;
    using System.Web;
    using Microsoft.WindowsAzure.Storage.Table;
    
  4. Usuń istniejącą Run metodę i dodaj następującą metodę do klasy jako funkcję platformy Azure:

    [FunctionName("Add")]
    public static int Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)]
    HttpRequestMessage req,
    TraceWriter log)
    {
        int x = 1;
        int y = 2;
    
        return x + y;
    }
    
  5. Przyjrzyjmy się fragmentowi definicji metody po kawałku.

    Pierwszą rzeczą, którą zobaczysz, jest atrybut FunctionName , który oznacza tę metodę jako funkcję platformy Azure. Atrybut wyznacza publiczną nazwę funkcji. Nazwa atrybutu nie musi być zgodna z rzeczywistą nazwą metody.

    New run method with FunctionName attribute highlighted

  6. Następnie metoda jest oznaczona jako publiczna metoda statyczna , która jest wymagana. Zauważysz również, że wartość zwracana jest int. Jeśli nie określono inaczej przy użyciu atrybutów metody, każda wartość zwracana przez funkcję platformy Azure nie jest pusta jako tekst. Domyślnie jest zwracany jako kod XML, ale można go zmienić na format JSON, który wykonasz później w laboratorium.

    New run method with method initialization highlighted

  7. Pierwszy parametr jest oznaczony atrybutem HttpTrigger , który wskazuje, że ta metoda jest wywoływana przez żądanie HTTP. Atrybut określa również poziom autoryzacji metody, a także obsługiwane czasowniki (tylko "GET" w tym przypadku). Opcjonalnie możesz również zdefiniować trasę , która zastępuje ścieżkę do metody i oferuje sposób automatycznego wyodrębniania zmiennych ze ścieżki. Ponieważ trasa ma wartość null w tym miejscu, ścieżka do tej metody będzie domyślnie ustawiona na /api/Add.

    New run method with parameter highlighted

  8. Ostatnim parametrem metody jest TraceWriter , który może służyć do rejestrowania komunikatów dotyczących diagnostyki i błędów.

    New run method with TraceWriter highlighted

  9. Ustaw punkt przerwania w wierszu zwrotnym metody, klikając margines wiersza:

    Breakpoint set at return line

  10. Skompiluj i uruchom projekt w sesji debugowania, naciskając klawisz F5 lub wybierając pozycję Uruchom rozpocznij > debugowanie. Możesz też kliknąć przycisk Uruchom . Wszystkie te opcje wykonują to samo zadanie. Reszta tego laboratorium odwołuje się do języka F5, ale możesz użyć metody, która jest najbardziej wygodna.

    Build and Run project

  11. Uruchomienie projektu spowoduje automatyczne otwarcie aplikacji terminalu.

  12. Projekt przechodzi przez proces wykrywania usługi Azure Functions na podstawie atrybutów metody i konwencji pliku omówionej w dalszej części tego artykułu. W tym przypadku wykrywa pojedynczą funkcję platformy Azure i "generuje" 1 funkcję zadania.

    Output of Azure function in Terminal

  13. W dolnej części komunikatów uruchamiania host usługi Azure Functions wyświetla adresy URL dowolnych interfejsów API wyzwalacza HTTP. Powinien istnieć tylko jeden. Skopiuj ten adres URL i wklej go na nowej karcie przeglądarki.

    Azure function API URL

  14. Punkt przerwania powinien być wyzwalany natychmiast. Żądanie internetowe zostało przekierowane do funkcji i można je teraz debugować. Umieść wskaźnik myszy na zmiennej x , aby zobaczyć jej wartość.

    Breakpoint triggered

  15. Usuń punkt przerwania przy użyciu tej samej metody użytej do dodania go wcześniej (kliknij margines lub wybierz wiersz i naciśnij klawisz F9).

  16. Naciśnij klawisz F5 , aby kontynuować działanie.

  17. W przeglądarce zostanie renderowany wynik XML metody . Zgodnie z oczekiwaniami, zakodowana na stałe operacja dodawania generuje wiarygodną sumę. Uwaga: jeśli w przeglądarce Safari widzisz tylko pozycję "3", przejdź do obszaru Preferencje przeglądarki > Safari > i zaznacz pole wyboru "Pokaż menu programowania na pasku menu" i załaduj ponownie stronę.

  18. W Visual Studio dla komputerów Mac kliknij przycisk Zatrzymaj, aby zakończyć sesję debugowania. Aby upewnić się, że nowe zmiany zostaną pobrane, nie zapomnij uruchomić ponownie (zatrzymać, a następnie uruchomić) sesji debugowania.

    Stop debugging option

  19. W metodzie Run zastąp definicje x i y następującym kodem. Ten kod wyodrębnia wartości z ciągu zapytania adresu URL, aby można było wykonywać operację dodawania dynamicznie na podstawie podanych parametrów.

    var query = HttpUtility.ParseQueryString(req.RequestUri.Query);
    
    int x = int.Parse(query["x"]);
    
    int y = int.Parse(query["y"]);
    
    return x + y;
    
  20. Uruchom aplikację.

  21. Wróć do okna przeglądarki i dołącz ciąg /?x=2&y=3 do adresu URL. Cały adres URL powinien teraz mieć wartość http://localhost:7071/api/Add?x=2&y=3. Przejdź do nowego adresu URL.

  22. Tym razem wynik powinien odzwierciedlać nowe parametry. Możesz uruchomić projekt z różnymi wartościami. Należy pamiętać, że nie ma żadnego sprawdzania błędów, dlatego nieprawidłowe lub brakujące parametry spowodują wystąpienie błędu.

  23. Zatrzymaj sesję debugowania.

Ćwiczenie 4. Praca z function.json

  1. We wcześniejszym ćwiczeniu wspomniano, że Visual Studio dla komputerów Mac "wygenerował" funkcję zadania dla funkcji platformy Azure zdefiniowanej w bibliotece. Dzieje się tak, ponieważ usługa Azure Functions nie używa atrybutów metody w czasie wykonywania, ale używa konwencji systemu plików w czasie kompilacji do konfigurowania miejsca i sposobu udostępniania usługi Azure Functions. W oknie rozwiązania kliknij prawym przyciskiem myszy węzeł projektu i wybierz polecenie Ujawnij w narzędziu Finder.

    Reveal in Finder menu option

  2. Przejdź w dół do systemu plików, dopóki nie osiągniesz wartości bin/Debug/netstandard2.0. Powinien istnieć folder o nazwie Dodaj. Ten folder został utworzony w celu odpowiadania atrybutowi nazwy funkcji w kodzie języka C#. Rozwiń folder Dodaj, aby wyświetlić pojedynczy plik function.json . Ten plik jest używany przez środowisko uruchomieniowe do hostowania funkcji platformy Azure i zarządzania nią. W przypadku innych modeli językowych bez obsługi czasu kompilacji (takich jak skrypt języka C# lub JavaScript) te foldery muszą być tworzone ręcznie i konserwowane. W przypadku deweloperów języka C# są one generowane automatycznie na podstawie metadanych atrybutów podczas kompilacji. Kliknij prawym przyciskiem myszy function.json i wybierz, aby otworzyć go w programie Visual Studio.

    function.json in the file directory

  3. Biorąc pod uwagę poprzednie kroki tego samouczka, musisz mieć podstawową wiedzę na temat atrybutów języka C#. Biorąc to pod uwagę, ten kod JSON powinien wyglądać znajomo. Jednak istnieje kilka elementów, które nie zostały omówione we wcześniejszych ćwiczeniach. Na przykład każde powiązanie musi mieć ustawiony kierunek . Jak można wywnioskować, "in" oznacza, że parametr jest wejściowy, natomiast "out" wskazuje, że parametr jest wartością zwracaną (za pośrednictwem $return) lub parametrem wyjściowym metody. Należy również określić plik scriptFile (względem tej lokalizacji końcowej) i metodę entryPoint (publiczną i statyczną) w zestawie. W następnych kilku krokach dodasz niestandardową ścieżkę funkcji przy użyciu tego modelu, więc skopiuj zawartość tego pliku do schowka.

    function.json file open in Visual Studio for mac

  4. W oknie rozwiązania kliknij prawym przyciskiem myszy węzeł projektu AzureFunctionsLab i wybierz polecenie Dodaj > nowy folder. Nazwij nowy folder Adder. Domyślnie nazwa tego folderu zdefiniuje ścieżkę do interfejsu API, taką jak api/Adder.

    New folder option

  5. Kliknij prawym przyciskiem myszy folder Adder i wybierz polecenie Dodaj > nowy plik.

    New file option

  6. Wybierz kategorię Sieć Web i szablon Pusty plik JSON. Ustaw nazwę na funkcję, a następnie kliknij przycisk Nowy.

    Empty json file option

  7. Wklej zawartość drugiego function.json (z kroku 3), aby zastąpić domyślną zawartość nowo utworzonego pliku.

  8. Usuń następujące wiersze w górnej części pliku json:

    "configurationSource":"attributes",
    "generatedBy":"Microsoft.NET.Sdk.Functions-1.0.13",
    
  9. Na końcu pierwszego powiązania (po wierszu "name": "req" dodaj następujące właściwości. Nie zapomnij dołączyć przecinka w poprzednim wierszu. Ta właściwość zastępuje domyślny katalog główny, tak aby teraz wyodrębniał parametry int ze ścieżki i umieszczał je w parametrach metody o nazwach x i y.

    "direction": "in",
    "route": "Adder/{x:int?}/{y:int?}"
    
  10. Dodaj kolejne powiązanie poniżej pierwszego. To powiązanie obsługuje zwracaną wartość funkcji. Nie zapomnij dołączyć przecinka w poprzednim wierszu:

    {
    "name": "$return",
    "type": "http",
    "direction": "out"
    }
    
  11. Zaktualizuj również właściwość entryPoint w dolnej części pliku, aby użyć metody o nazwie "Add2", takiej jak pokazano poniżej. Ma to na celu zilustrowanie, że interfejs API ścieżki /Dodatek... może mapować na odpowiednią metodę o dowolnej nazwie (Dodaj2 tutaj).

    "entryPoint": "<project-name>.<function-class-name>.Add2"
    
  12. Ostateczny plik function.json powinien wyglądać następująco:

    {
    "bindings": [
        {
        "type": "httpTrigger",
        "methods": [
            "get"
        ],
        "authLevel": "function",
        "direction": "in",
        "name": "req",
        "route": "Adder/{x:int?}/{y:int?}"
        },
        {
        "name": "$return",
        "type": "http",
        "direction": "out"
        }
    ],
    "disabled": false,
    "scriptFile": "../bin/AzureFunctionsProject.dll",
    "entryPoint": "AzureFunctionsProject.Add.Add2"
    }
    
  13. Ostatnim krokiem wymaganym do wykonania tej wszystkich czynności jest poinstruowanie Visual Studio dla komputerów Mac skopiować ten plik do tej samej ścieżki względnej w katalogu wyjściowym za każdym razem, gdy zmieni się. Po wybraniu pliku wybierz kartę właściwości na pasku po prawej stronie, a w obszarze Kopiuj do katalogu wyjściowego wybierz pozycję Kopiuj, jeśli jest nowsza:

    Properties options for json file

  14. W Add.cs zastąp metodę Run (w tym atrybut) następującą metodą, aby spełnić oczekiwaną funkcję. Jest bardzo podobny do Run, z tą różnicą, że nie używa żadnych atrybutów i ma jawne parametry dla x i y.

    public static int Add2(
        HttpRequestMessage req,
        int x,
        int y,
        TraceWriter log)
    {
        return x + y;
    }
    
  15. Naciśnij klawisz F5 , aby skompilować i uruchomić projekt.

  16. Po zakończeniu kompilacji i uruchamianiu platformy będzie ona teraz wskazywać, że istnieje druga trasa dostępna dla żądań mapujących na nowo dodaną metodę:

    URL for HTTP functions

  17. Zwróć okno przeglądarki i przejdź do http://localhost:7071/api/Adder/3/5adresu .

  18. Tym razem metoda działa po raz kolejny, ściągając parametry ze ścieżki i generując sumę.

  19. Wróć do Visual Studio dla komputerów Mac i zakończ sesję debugowania.

Ćwiczenie 5. Praca z tabelami usługi Azure Storage

Często tworzona usługa może być znacznie bardziej złożona niż to, co zostało utworzone do tej pory i wymaga znacznego czasu lub infrastruktury do wykonania. W takim przypadku może okazać się skuteczne akceptowanie żądań, które są kolejkowane do przetwarzania, gdy zasoby staną się dostępne, dla których usługa Azure Functions zapewnia obsługę. W innych przypadkach należy centralnie przechowywać dane. Tabele usługi Azure Storage umożliwiają szybkie wykonywanie tych czynności.

  1. Dodaj następującą klasę do Add.cs. Powinna ona znajdować się wewnątrz przestrzeni nazw, ale poza istniejącą klasą.

    public class TableRow : TableEntity
    {
        public int X { get; set; }
        public int Y { get; set; }
        public int Sum { get; set; }
    }
    
  2. W klasie Add dodaj następujący kod, aby wprowadzić inną funkcję. Należy pamiętać, że ta jest unikatowa do tej pory w tym, że nie obejmuje odpowiedzi HTTP. Ostatni wiersz zwraca nowy element TableRow wypełniony pewnymi kluczowymi informacjami, które ułatwią ich późniejsze pobranie (PartitionKey i RowKey), a także jego parametrów i sum. Kod w metodzie używa również narzędzia TraceWriter , aby ułatwić poznanie, kiedy funkcja jest uruchamiana.

    [FunctionName("Process")]
    [return: Table("Results")]
    public static TableRow Process(
        [HttpTrigger(AuthorizationLevel.Function, "get",
            Route = "Process/{x:int}/{y:int}")]
        HttpRequestMessage req,
        int x,
        int y,
        TraceWriter log)
    {
        log.Info($"Processing {x} + {y}");
    
        return new TableRow()
        {
            PartitionKey = "sums",
            RowKey = $"{x}_{y}",
            X = x,
            Y = y,
            Sum = x + y
        };
    }
    
  3. Naciśnij klawisz F5 , aby skompilować i uruchomić projekt.

  4. Na karcie przeglądarki przejdź do http://localhost:7071/api/Process/4/6adresu . Spowoduje to umieszczenie kolejnego komunikatu w kolejce, co ostatecznie spowoduje dodanie kolejnego wiersza do tabeli.

  5. Wróć do terminalu i poszukaj żądania przychodzącego dla 4 + 6.

    Terminal output showing addition request

  6. Wróć do przeglądarki, aby odświeżyć żądanie do tego samego adresu URL. Tym razem zobaczysz błąd po metodzie Process . Dzieje się tak, ponieważ kod próbuje dodać wiersz do tabeli usługi Azure Table Storage przy użyciu kombinacji klucza partycji i wiersza, która już istnieje.

    System.Private.CoreLib: Exception while executing function: Process. Microsoft.Azure.WebJobs.Host: Error while handling parameter $return after function returned:. Microsoft.Azure.WebJobs.Host: The specified entity already exists.

  7. Zakończ sesję debugowania.

  8. Aby wyeliminować ten błąd, dodaj następujący parametr do definicji metody bezpośrednio przed parametrem TraceWriter . Ten parametr instruuje platformę Azure Functions, aby próbowała pobrać tabelę TableRow z tabeli Results w kluczu PartitionKey , której używaliśmy do przechowywania wyników. Jednak niektóre z rzeczywistych magii wchodzi w grę, gdy zauważysz, że RowKey jest dynamicznie generowany na podstawie innych parametrów x i y dla tej samej metody. Jeśli ten wiersz już istnieje, funkcja tableRow będzie miała go, gdy metoda rozpoczyna się od braku dodatkowej pracy wymaganej przez dewelopera. Jeśli wiersz nie istnieje, będzie to tylko wartość null. Taka wydajność umożliwia deweloperom skupienie się na ważnej logice biznesowej, a nie na infrastrukturze.

    [Table("Results", "sums", "{x}_{y}")]
    TableRow tableRow,
    
  9. Dodaj następujący kod na początku metody . Jeśli parametr tableRow nie ma wartości null, mamy już wyniki żądanej operacji i można je natychmiast zwrócić. W przeciwnym razie funkcja będzie kontynuowana tak jak poprzednio. Chociaż może to nie być najbardziej niezawodny sposób zwracania danych, ilustruje to, że można zorganizować niezwykle zaawansowane operacje w wielu skalowalnych warstwach z bardzo małą ilością kodu.

    if (tableRow != null)
    {
        log.Info($"{x} + {y} already exists");
        return null;
    }
    
  10. Naciśnij klawisz F5 , aby skompilować i uruchomić projekt.

  11. Na karcie przeglądarki odśwież adres URL pod adresem http://localhost:7071/api/Process/4/6. Ponieważ wiersz tabeli dla tego rekordu istnieje, powinien zostać zwrócony natychmiast i bez błędu. Ponieważ nie ma danych wyjściowych HTTP, dane wyjściowe są widoczne w terminalu.

    Terminal output showing table row already exists

  12. Zaktualizuj adres URL, aby odzwierciedlał kombinację, która nie jest jeszcze przetestowana, na przykład http://localhost:7071/api/Process/5/7. Zwróć uwagę na komunikat w terminalu, który wskazuje, że wiersz tabeli nie został znaleziony (zgodnie z oczekiwaniami).

    Terminal output showing new process

  13. Wróć do Visual Studio dla komputerów Mac i zakończ sesję debugowania.

Podsumowanie

W tym laboratorium przedstawiono sposób rozpoczynania tworzenia usługi Azure Functions przy użyciu Visual Studio dla komputerów Mac.