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
Uruchom Visual Studio dla komputerów Mac.
Wybierz pozycję Plik > nowe rozwiązanie.
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.
Ustaw nazwę projektu na "AzureFunctionsLab", a następnie kliknij pozycję Utwórz.
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.
Ćwiczenie 2. Tworzenie konta usługi Azure Storage
Zaloguj się do konta platformy Azure pod adresem https://portal.azure.com.
W sekcji Ulubione po lewej stronie ekranu wybierz pozycję Konta magazynu:
Wybierz pozycję Dodaj , aby utworzyć nowe konto magazynu:
Wprowadź globalnie unikatową nazwę nazwy i użyj jej ponownie dla grupy zasobów. Wszystkie inne elementy można zachować jako domyślne.
Kliknij pozycję Utwórz. Utworzenie konta magazynu może potrwać kilka minut. Po pomyślnym utworzeniu otrzymasz powiadomienie.
Wybierz przycisk Przejdź do zasobu z powiadomienia.
Wybierz kartę Klucze dostępu.
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.
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.
Przykład 3. Tworzenie i debugowanie funkcji platformy Azure
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ę:
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ę:
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;
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; }
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.
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.
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.
Ostatnim parametrem metody jest TraceWriter , który może służyć do rejestrowania komunikatów dotyczących diagnostyki i błędów.
Ustaw punkt przerwania w wierszu zwrotnym metody, klikając margines wiersza:
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.
Uruchomienie projektu spowoduje automatyczne otwarcie aplikacji terminalu.
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.
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.
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ść.
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).
Naciśnij klawisz F5 , aby kontynuować działanie.
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ę.
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.
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;
Uruchom aplikację.
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.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.
Zatrzymaj sesję debugowania.
Ćwiczenie 4. Praca z function.json
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.
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.
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.
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.
Kliknij prawym przyciskiem myszy folder Adder i wybierz polecenie Dodaj > nowy plik.
Wybierz kategorię Sieć Web i szablon Pusty plik JSON. Ustaw nazwę na funkcję, a następnie kliknij przycisk Nowy.
Wklej zawartość drugiego function.json (z kroku 3), aby zastąpić domyślną zawartość nowo utworzonego pliku.
Usuń następujące wiersze w górnej części pliku json:
"configurationSource":"attributes", "generatedBy":"Microsoft.NET.Sdk.Functions-1.0.13",
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?}"
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" }
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"
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" }
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:
W Add.cs zastąp metodę
Run
(w tym atrybut) następującą metodą, aby spełnić oczekiwaną funkcję. Jest bardzo podobny doRun
, 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; }
Naciśnij klawisz F5 , aby skompilować i uruchomić projekt.
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ę:
Zwróć okno przeglądarki i przejdź do http://localhost:7071/api/Adder/3/5adresu .
Tym razem metoda działa po raz kolejny, ściągając parametry ze ścieżki i generując sumę.
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.
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; } }
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 }; }
Naciśnij klawisz F5 , aby skompilować i uruchomić projekt.
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.
Wróć do terminalu i poszukaj żądania przychodzącego dla 4 + 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.
Zakończ sesję debugowania.
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,
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; }
Naciśnij klawisz F5 , aby skompilować i uruchomić projekt.
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.
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).
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.