Tworzenie i testowanie prostej funkcji platformy Azure w środowisku lokalnym za pomocą programu Visual Studio

Ukończone

Użytkownicy mogą pisać, debugować i wdrażać funkcję platformy Azure z poziomu witryny Azure Portal. Jednak pisanie funkcji bezpośrednio w środowisku produkcyjnym, przejściowym lub testowym może nie być odpowiednie. Na przykład pisanie automatycznych testów jednostkowych dla usługi Azure Functions lub używanie wdrożenia usługi Azure Functions na żądanie do aplikacji funkcji na platformie Azure. Zazwyczaj deweloperzy wolą używać edytora kodu i narzędzi programistycznych, a nie środowiska udostępnianego przez witrynę Azure Portal. Program Visual Studio umożliwia tworzenie kodu usługi Azure Functions i zarządzanie nim przy użyciu innego kodu i usług w jednym projekcie.

W scenariuszu z luksusowym zegarkiem online deweloperzy znają już program Visual Studio 2022. Wybierasz więc program Visual Studio jako podstawowe środowisko deweloperskie do tworzenia funkcji usługi Azure Functions. Dodatkowo program Visual Studio oferuje doskonałe środowisko do lokalnego testowania funkcji przed wdrożeniem ich na platformie Azure.

W tej lekcji dowiesz się, jak używać narzędzi dostępnych w programie Visual Studio do tworzenia i testowania funkcji platformy Azure na komputerze lokalnym.

Ważne

W tym artykule są obsługiwane funkcje biblioteki klas platformy .NET, które są uruchamiane w procesie w środowisku uruchomieniowym. Funkcje języka C# mogą również wyprowadzić proces i odizolować je od środowiska uruchomieniowego usługi Functions. Model izolowanego procesu roboczego to jedyny sposób uruchamiania wersji innych niż LTS aplikacji .NET i .NET Framework w bieżących wersjach środowiska uruchomieniowego usługi Functions. Aby dowiedzieć się więcej, zobacz Funkcje procesów procesu roboczego izolowanego platformy .NET.

Modyfikowanie instalacji programu Visual Studio

Najpierw skonfigurujmy program Visual Studio przy użyciu narzędzi internetowych i w chmurze potrzebnych dla środowiska deweloperskiego.

  1. Po zainstalowaniu programu Visual Studio 2022 lokalnie otwórz Instalator programu Visual Studio, a następnie w programie Visual Studio Community 2022 wybierz pozycję Modyfikuj.

    Zrzut ekranu przedstawiający Instalator programu Visual Studio z wyróżnionym poleceniem Modyfikuj.

  2. Zostanie wyświetlona strona Modyfikowanie — Visual Studio.

    Zrzut ekranu przedstawiający kartę Modyfikowanie obciążeń programu Visual Studio Community 2022 z wyróżnioną ASP.NET i programowaniem w Internecie oraz programowaniem na platformie Azure.

  3. Na karcie Obciążenia zaznacz pola wyboru ASP.NET i Tworzenie aplikacji internetowych i programowania na platformie Azure, a następnie wybierz pozycję Modyfikuj.

  4. W oknie dialogowym weryfikacji wybierz pozycję Tak. Zostanie wyświetlona strona Instalator programu Visual Studio zawierająca postęp instalowanych pakietów.

Rozszerzenie narzędzi usługi Azure Functions dla programu Visual Studio

Narzędzia usługi Azure Functions to rozszerzenie programu Visual Studio, które umożliwia tworzenie, testowanie i wdrażanie usługi Azure Functions w lokalnym środowisku projektowym. Aby szybko utworzyć nową aplikację funkcji platformy Azure, to rozszerzenie udostępnia szablon umożliwiający skompilowanie, a następnie wdrożenie funkcji bezpośrednio na platformie Azure z poziomu programu Visual Studio.

Rozszerzenie Azure Functions i Web Jobs Tools jest dostępne w programie Visual Studio 2022.

Aplikacja funkcji platformy Azure

Aplikacja funkcji hostuje co najmniej jedną funkcję. Zapewnia środowisko i środowisko uruchomieniowe dla kodu funkcji.

Funkcja jest wyzwalana przez zdarzenie, a nie wywoływane bezpośrednio z aplikacji. Określasz typ zdarzenia wyzwalającego każdą funkcję w aplikacji funkcji platformy Azure. Dostępne zdarzenia to:

  • Wyzwalacz obiektu blob. Funkcje tego typu są uruchamiane po przekazaniu lub zmodyfikowaniu pliku w usłudze Azure Blob Storage.
  • Wyzwalacz centrum zdarzeń. Wyzwalacz usługi Event Hubs uruchamia funkcję, gdy centrum zdarzeń odbiera komunikat.
  • Wyzwalacz usługi Azure Cosmos DB. Ten wyzwalacz jest uruchamiany po dodaniu lub zmodyfikowaniu dokumentu w bazie danych usługi Azure Cosmos DB. Możesz używać go do integracji usługi Azure Cosmos DB z innymi usługami. Możesz na przykład użyć wyzwalacza, aby wysłać kopię zamówienia do kolejki w celu przetworzenia, gdy do bazy danych zostanie dokument zawierający zamówienie klienta.
  • Wyzwalacz HTTP. Wyzwalacz HTTP uruchamia funkcję, gdy w aplikacji internetowej wystąpi żądanie HTTP. Możesz użyć go także do odpowiadania na elementy webhook. Element webhook to wywołanie zwrotne występujące po zmodyfikowaniu elementu hostowanego przez witrynę internetową. Na przykład można utworzyć funkcję wyzwalaną przez element webhook z repozytorium GitHub, gdy element w repozytorium ulegnie zmianie.
  • Wyzwalacz kolejki. Ten wyzwalacz uruchamia funkcję po dodaniu nowego elementu do kolejki usługi Azure Storage.
  • Wyzwalacz kolejki usługi Service Bus. Ten wyzwalacz uruchamia funkcję po dodaniu nowego elementu do kolejki usługi Azure Service Bus.
  • Wyzwalacz tematu usługi Service Bus. Ten wyzwalacz uruchamia funkcję w odpowiedzi na nowe komunikaty przychodzące do tematu usługi Service Bus.
  • Wyzwalacz czasomierza. To zdarzenie uruchamia funkcję w regularnych odstępach czasu zgodnie z zdefiniowanym harmonogramem.

Zrzut ekranu przedstawiający dostępne wyzwalacze funkcji platformy Azure z wyróżnionym wyzwalaczem HTTP.

W poniższej tabeli przedstawiono najwyższy poziom platformy .NET Core lub .NET Framework, którego można używać z określoną wersją usługi Functions.

Wersja środowiska uruchomieniowego usługi Functions Wewnątrz procesu Proces izolowanego procesu roboczego
Functions 4.x .NET 6.0 .NET 6.0
.NET 7.0
.NET 8.0
.NET Framework 4.8
Functions w wersji 1.x .NET Framework 4.8 nie dotyczy

Aplikacja funkcji platformy Azure przechowuje informacje o zarządzaniu, kodzie i dziennikach w usłudze Azure Storage. Aby przechowywać te dane, należy utworzyć konto magazynu. Konto magazynu musi obsługiwać magazyn usług Azure Blob, Queue, Files i Table Storage — w tym celu użyj konta usługi Azure Storage ogólnego przeznaczenia. Konto magazynu używane na potrzeby funkcji należy wybrać w pokazanym wcześniej oknie dialogowym.

Funkcja może wykonywać operacje uprzywilejowane lub wrażliwe. Funkcja wyzwalana przez żądanie HTTP może być uwidoczniona publicznie. Może więc być wymagane ograniczenie możliwości uruchamiania tej funkcji tylko do wybranych grup użytkowników. Funkcję można chronić, określając prawa dostępu wymagane do wyzwolenia funkcji. Funkcja wyzwalana przez żądanie HTTP obsługuje trzy poziomy praw dostępu:

  • Anonimowe. Nie jest wymagane uwierzytelnianie, a funkcję może uruchomić każdy użytkownik.
  • Funkcja. Żądanie HTTP musi określać klucz umożliwiający autoryzację żądania przez środowisko uruchomieniowe funkcji platformy Azure. Ten klucz jest tworzony osobno i można nim zarządzać w witrynie Azure Portal.
  • Administrator. Podobnie jak funkcja. Użytkownik musi określić klucz z żądaniem HTTP, które wyzwala funkcję. Różnica polega na tym, że jest to klucz administratora. Ten klucz umożliwia dostęp do dowolnej funkcji w ramach aplikacji funkcji. Tak samo jak klucz funkcji ten klucz jest tworzony osobno.

Jeśli tworzysz funkcję wyzwalaną innymi zdarzeniami niż żądania HTTP, musisz podać parametry połączenia i inne szczegóły wymagane przez aplikację funkcji w celu uzyskania dostępu do zasobu wyzwalającego zdarzenie. Jeśli na przykład piszesz funkcję wyzwalaną przez zdarzenie usługi Blob Storage, musisz określić parametry połączenia odpowiedniego konta usługi Blob Storage.

Struktura funkcji platformy Azure

Funkcja platformy Azure jest wdrażana jako klasa statyczna. Ta klasa zawiera statyczną metodę asynchroniczną o nazwie Run, działającą jako punkt wejścia klasy.

Parametry wprowadzone w metodzie Run określają kontekst wyzwalacza. Jeśli jest to wyzwalacz HTTP, funkcja odbiera obiekt HttpRequest . Ten obiekt zawiera nagłówek i treść żądania. Możesz uzyskać dostęp do danych zawartych w żądaniu za pomocą takich samych technik, jakie dostępne są w dowolnej aplikacji HTTP. Atrybuty zastosowane do tej funkcji określają wymagania autoryzacji (w tym przypadku anonimowe ) oraz operacje HTTP, na które odpowiada funkcja (GET i POST).

Poniższy przykład kodu wygenerowany przez program Visual Studio analizuje ciąg zapytania podany jako część adresu URL żądania i szuka parametru o nazwie name. Kod używa również elementu StreamReader do deserializacji treści żądania i próbuje odczytać wartość właściwości nazywanej również nazwą żądania. Jeśli nazwa zostanie znaleziona w ciągu zapytania lub w treści żądania, wartość nazwy jest zwracana w odpowiedzi. W przeciwnym razie funkcja generuje odpowiedź o błędzie z komunikatem: Przekaż nazwę w ciągu zapytania lub w treści żądania.

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

Funkcja zwraca wartość zawierającą dane wyjściowe i wyniki opakowane w obiekt IActionResult . Wartość jest zwracana w treści odpowiedzi HTTP na przesłane żądanie.

Różne typy wyzwalaczy otrzymują różne parametry wejściowe i zwracane typy. Kolejny przykład przedstawia kod wygenerowany w przypadku wyzwalacza obiektu blob. W tym przykładzie zawartość obiektu blob jest zwracana za pośrednictwem obiektu Stream , a nazwa obiektu blob jest również podana. Wyzwalacz nie zwraca żadnych danych; jego celem jest odczytywanie i przetwarzanie danych w nazwanym obiekcie blob.

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

We wszystkich przypadkach funkcja jest przekazywana jako parametr ILogger . Funkcja może użyć tego parametru do zapisywania komunikatów dziennika, które aplikacja funkcji zapisuje w magazynie na potrzeby późniejszej analizy.

Funkcja zawiera również metadane, które określają typ wyzwalacza, wymagania dotyczące zabezpieczeń i inne specyficzne wymagania dotyczące informacji. Metadane można modyfikować przy użyciu atrybutów HttpTrigger, BlobTrigger lub innych atrybutów wyzwalacza, jak pokazano w przykładach. Atrybut FunctionName poprzedzający funkcję jest identyfikatorem funkcji używanej przez aplikację funkcji. Nie musi być taki sam, jak nazwa funkcji, ale warto dbać o zgodność tych nazw, aby uniknąć pomyłek.

Lokalne testowanie aplikacji funkcji platformy Azure

Możesz użyć debugera wizualnego do kompilowania i testowania aplikacji funkcji platformy Azure lokalnie. Aby uruchomić debuger, naciśnij F5 lub w menu Debuguj wybierz pozycję Rozpocznij debugowanie. Zostanie uruchomiona lokalna wersja środowiska uruchomieniowego funkcji. Funkcje są dostępne do testowania. W przykładzie pokazano, że środowisko uruchomieniowe hostuje funkcję Function1, funkcję wyzwalaną przez zdarzenie HTTP. Adres URL wskazuje punkt końcowy, do którego jest obecnie dołączona funkcja.

Zrzut ekranu przedstawiający środowisko uruchomieniowe funkcji platformy Azure — przykład 1.

Jeśli otworzysz przeglądarkę internetową i odwiedzisz ten adres URL, wyzwolisz funkcję. Na poniższej ilustracji przedstawiono odpowiedź wygenerowaną przez żądanie HTTP GET niezawierające treści. Komunikat wygenerowany przez kod, który zwraca obiekt BadRequestObjectResult z funkcji.

Zrzut ekranu przedstawiający środowisko uruchomieniowe funkcji platformy Azure.

Jeśli podasz ciąg zapytania zawierający parametr nazwy , funkcja odczytuje i przetwarza wartość.

Zrzut ekranu przedstawiający środowisko uruchomieniowe funkcji platformy Azure — przykład 2.

Gdy kod jest uruchomiony, w oknie Środowisko uruchomieniowe funkcji są wyświetlane komunikaty śledzenia. Jeśli chcesz ustawić punkty przerwania i sprawdzić przepływ sterowania w funkcji, możesz skorzystać ze standardowych funkcji debugowania w programie Visual Studio.