Opracowywanie funkcji usługi Azure Functions przy użyciu programu Visual Studio

Program Visual Studio umożliwia tworzenie, testowanie i wdrażanie funkcji biblioteki klas języka C# na platformie Azure. Jeśli to środowisko jest pierwszym z Azure Functions, zobacz Wprowadzenie do Azure Functions.

Program Visual Studio zapewnia następujące korzyści podczas tworzenia funkcji:

  • Edytowanie, kompilowanie i uruchamianie funkcji na lokalnym komputerze deweloperów.
  • Opublikuj projekt Azure Functions bezpośrednio na platformie Azure i w razie potrzeby utwórz zasoby platformy Azure.
  • Użyj atrybutów języka C#, aby zadeklarować powiązania funkcji bezpośrednio w kodzie języka C#.
  • Twórz i wdrażaj wstępnie skompilowane funkcje języka C#. Funkcje wstępnie zgodne zapewniają lepszą wydajność zimnego startu niż funkcje oparte na skryptach języka C#.
  • Kodowanie funkcji w języku C# przy jednoczesnym zachowaniu wszystkich korzyści z programowania w programie Visual Studio.

Ten artykuł zawiera szczegółowe informacje o sposobie używania programu Visual Studio do tworzenia funkcji biblioteki klas języka C# i publikowania ich na platformie Azure. Przed przeczytaniem tego artykułu rozważ ukończenie przewodnika Szybki start usługi Functions dla programu Visual Studio.

Jeśli nie określono inaczej, pokazano procedury i przykłady dla programu Visual Studio 2022. Aby uzyskać więcej informacji na temat wersji programu Visual Studio 2022, zobacz informacje o wersji lub informacje o wersji zapoznawczej.

Wymagania wstępne

  • narzędzia Azure Functions. Aby dodać narzędzia funkcji platformy Azure, uwzględnij obciążenie programistyczne platformy Azure w instalacji programu Visual Studio. Jeśli używasz programu Visual Studio 2017, może być konieczne wykonanie dodatkowych kroków instalacji.

  • Inne potrzebne zasoby, takie jak konto usługi Azure Storage, są tworzone w ramach subskrypcji podczas procesu publikowania.

  • Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure .

Tworzenie projektu usługi Azure Functions

Szablon projektu Azure Functions w programie Visual Studio tworzy projekt biblioteki klas języka C#, który można opublikować w aplikacji funkcji na platformie Azure. Za pomocą aplikacji funkcji można grupować funkcje jako jednostkę logiczną, aby ułatwić zarządzanie, wdrażanie, skalowanie i udostępnianie zasobów.

  1. W menu programu Visual Studio wybierz pozycję Plik>nowy>projekt.

  2. W obszarze Tworzenie nowego projektu wprowadź funkcje w polu wyszukiwania, wybierz szablon Azure Functions, a następnie wybierz przycisk Dalej.

  3. W obszarze Konfigurowanie nowego projektu wprowadź nazwę projektu, a następnie wybierz pozycję Utwórz. Nazwa aplikacji funkcji musi być prawidłową nazwą przestrzeni nazw C#, dlatego nie należy używać znaków podkreślenia, łączników ani znaków innych niż alfanumeryczne.

  4. W obszarze Tworzenie nowych ustawień aplikacji Azure Functions użyj wartości w poniższej tabeli:

    Ustawienie Wartość Opis
    Wersja platformy .NET .NET 6 Ta wartość tworzy projekt funkcji, który jest uruchamiany w procesie z wersją 4.x środowiska uruchomieniowego Azure Functions. Usługa Azure Functions 1.x obsługuje program .NET Framework. Aby uzyskać więcej informacji, zobacz omówienie wersji środowiska uruchomieniowego Azure Functions.
    Szablon funkcji Wyzwalacz HTTP Ta wartość tworzy funkcję wyzwalaną przez żądanie HTTP.
    Konto magazynu (AzureWebJobsStorage) Emulator magazynu Ponieważ aplikacja funkcji na platformie Azure wymaga konta magazynu, jest on przypisany lub tworzony podczas publikowania projektu na platformie Azure. Wyzwalacz HTTP nie używa parametrów połączenia konta usługi Azure Storage; wszystkie inne typy wyzwalaczy wymagają prawidłowych parametrów połączenia konta usługi Azure Storage.
    Poziom autoryzacji Anonimowe Utworzona funkcja może zostać wyzwolona przez dowolnego klienta bez podawania klucza. To ustawienie autoryzacji ułatwia testowanie nowej funkcji. Aby uzyskać więcej informacji na temat kluczy i autoryzacji, zobacz Klucze autoryzacji oraz powiązania protokołu HTTP i elementu webhook.

    ustawienia projektu Azure Functions

    Upewnij się, że ustawiono poziom autoryzacji na Anonimowy. Jeśli wybierzesz domyślny poziom funkcji, musisz przedstawić klucz funkcji w żądaniach dostępu do punktu końcowego funkcji.

  5. Wybierz pozycję Utwórz, aby utworzyć projekt funkcji i funkcję wyzwalacza HTTP.

Po utworzeniu projektu Azure Functions szablon projektu tworzy projekt języka C#, instaluje Microsoft.NET.Sdk.Functions pakiet NuGet i ustawia strukturę docelową. Nowy projekt ma następujące pliki:

  • host.json: umożliwia skonfigurowanie hosta usługi Functions. Te ustawienia mają zastosowanie zarówno podczas uruchamiania lokalnego, jak i na platformie Azure. Aby uzyskać więcej informacji, zobacz dokumentacja pliku host.json.

  • local.settings.json: zachowuje ustawienia używane podczas lokalnego uruchamiania funkcji. Te ustawienia nie są używane podczas uruchamiania na platformie Azure. Aby uzyskać więcej informacji, zobacz Plik ustawień lokalnych.

    Ważne

    Ponieważ plik local.settings.json może zawierać wpisy tajne, należy wykluczyć go z kontroli źródła projektu. Upewnij się, że dla tego pliku ustawiono ustawienie Kopiuj do katalogu wyjściowego , jeśli jest nowsze.

Aby uzyskać więcej informacji, zobacz Projekt biblioteki klas usługi Functions.

Ustawienia lokalne

W przypadku uruchamiania w aplikacji funkcji na platformie Azure ustawienia wymagane przez funkcje są bezpiecznie przechowywane w ustawieniach aplikacji. Podczas tworzenia lokalnego Values te ustawienia są zamiast tego dodawane do obiektu w pliku local.settings.json. Plik local.settings.json przechowuje również ustawienia używane przez lokalne narzędzia programistyczne.

Ponieważ plik local.settings.json może zawierać wpisy tajne, takie jak parametry połączenia, nigdy nie należy przechowywać go w repozytorium zdalnym. Aby dowiedzieć się więcej o ustawieniach lokalnych, zobacz Plik ustawień lokalnych.

Program Visual Studio nie przekazuje automatycznie ustawień w pliku local.settings.json podczas publikowania projektu. Aby upewnić się, że te ustawienia również istnieją w aplikacji funkcji na platformie Azure, przekaż je po opublikowaniu projektu. Aby uzyskać więcej informacji, zobacz Ustawienia aplikacji funkcji. Wartości w ConnectionStrings kolekcji nigdy nie są publikowane.

Kod może również odczytywać wartości ustawień aplikacji funkcji jako zmienne środowiskowe. Aby uzyskać więcej informacji, zobacz Zmienne środowiskowe.

Konfigurowanie projektu na potrzeby programowania lokalnego

Środowisko uruchomieniowe usługi Functions używa konta usługi Azure Storage wewnętrznie. Dla wszystkich typów wyzwalaczy innych niż HTTP i webhook ustaw Values.AzureWebJobsStorage klucz na prawidłowe parametry połączenia konta usługi Azure Storage. Aplikacja funkcji może również użyć emulatora Azurite dla AzureWebJobsStorage ustawienia połączenia wymaganego przez projekt. Aby użyć emulatora, ustaw wartość na AzureWebJobsStorageUseDevelopmentStorage=true. Zmień to ustawienie na rzeczywiste parametry połączenia konta magazynu przed wdrożeniem. Aby uzyskać więcej informacji, zobacz Emulator magazynu lokalnego.

Aby ustawić parametry połączenia konta magazynu:

  1. W witrynie Azure Portal przejdź do swojego konta magazynu.

  2. Na karcie Klucze dostępu poniżej pola Zabezpieczenia i sieć skopiuj parametry połączeniaklucza key1.

  3. W projekcie otwórz plik local.settings.json i ustaw wartość AzureWebJobsStorage klucza na skopiowane parametry połączenia.

  4. Powtórz poprzedni krok, aby dodać unikatowe klucze do Values tablicy dla innych połączeń wymaganych przez funkcje.

Dodawanie funkcji do projektu

W funkcjach biblioteki klas języka C# powiązania używane przez funkcję są definiowane przez zastosowanie atrybutów w kodzie. Podczas tworzenia wyzwalaczy funkcji na podstawie podanych szablonów są stosowane atrybuty wyzwalacza.

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy węzeł projektu i wybierz polecenie Dodaj>nowy element.

  2. Wybierz pozycję Funkcja platformy Azure, wprowadź nazwę klasy, a następnie wybierz pozycję Dodaj.

  3. Wybierz wyzwalacz, ustaw właściwości powiązania, a następnie wybierz pozycję Dodaj. W poniższym przykładzie przedstawiono ustawienia tworzenia funkcji wyzwalacza usługi Queue Storage.

    Tworzenie funkcji wyzwalacza usługi Queue Storage

    Następnie zostanie wyświetlony monit o wybranie między emulatorem magazynu Azurite lub odwoływaniem się do aprowizowanego konta usługi Azure Storage.

    W tym przykładzie wyzwalacza użyto parametrów połączenia z kluczem o nazwie QueueStorage. Ten klucz, przechowywany w pliku local.settings.json, odwołuje się do emulatora Azurite lub konta usługi Azure Storage.

  4. Sprawdź nowo dodaną klasę. Zostanie wyświetlona metoda statyczna Run() przypisana za pomocą atrybutu FunctionName . Ten atrybut wskazuje, że metoda jest punktem wejścia dla funkcji.

    Na przykład następująca klasa języka C# reprezentuje podstawową funkcję wyzwalacza usługi Queue Storage:

    using System;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    
    namespace FunctionApp1
    {
        public static class Function1
        {
            [FunctionName("QueueTriggerCSharp")]
            public static void Run([QueueTrigger("myqueue-items", 
                Connection = "QueueStorage")]string myQueueItem, ILogger log)
            {
                log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            }
        }
    }
    

Atrybut specyficzny dla powiązania jest stosowany do każdego parametru powiązania dostarczonego do metody punktu wejścia. Atrybut przyjmuje informacje o powiązaniu jako parametry. W poprzednim przykładzie pierwszy parametr ma QueueTrigger zastosowany atrybut wskazujący funkcję wyzwalacza usługi Queue Storage. Nazwa kolejki i nazwa ustawienia parametrów połączenia są przekazywane jako parametry do atrybutu QueueTrigger . Aby uzyskać więcej informacji, zobacz Powiązania usługi Azure Queue Storage dla Azure Functions.

Użyj powyższej procedury, aby dodać więcej funkcji do projektu aplikacji funkcji. Każda funkcja w projekcie może mieć inny wyzwalacz, ale funkcja musi mieć dokładnie jeden wyzwalacz. Aby uzyskać więcej informacji, zobacz pojęcia dotyczące wyzwalaczy i powiązań Azure Functions.

Dodawanie powiązań

Podobnie jak w przypadku wyzwalaczy, powiązania wejściowe i wyjściowe są dodawane do funkcji jako atrybuty powiązania. Dodaj powiązania do funkcji w następujący sposób:

  1. Upewnij się, że projekt został skonfigurowany pod kątem programowania lokalnego.

  2. Dodaj odpowiedni pakiet rozszerzenia NuGet dla określonego powiązania, wyszukując wymagania dotyczące pakietu NuGet specyficzne dla powiązania w artykule referencyjnym dotyczącym powiązania. Na przykład znajdź wymagania dotyczące pakietu dla wyzwalacza usługi Event Hubs w artykule dokumentacji powiązań usługi Event Hubs.

  3. Użyj następującego polecenia w konsoli menedżera pakietów, aby zainstalować określony pakiet:

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

    W tym przykładzie zastąp <BINDING_TYPE> ciąg nazwą specyficzną dla rozszerzenia powiązania i <TARGET_VERSION> określoną wersją pakietu, taką jak 3.0.0-beta5. Prawidłowe wersje są wyświetlane na poszczególnych stronach pakietów w NuGet.org. Główne wersje odpowiadające środowisku uruchomieniowemu usługi Functions w wersji 1.x lub 2.x są określone w artykule referencyjnym dotyczącym powiązania.

  4. Jeśli istnieją ustawienia aplikacji wymagane przez powiązanie, dodaj je do Values kolekcji w pliku ustawień lokalnych.

    Funkcja używa tych wartości podczas uruchamiania lokalnego. Gdy funkcja jest uruchamiana w aplikacji funkcji na platformie Azure, używa ustawień aplikacji funkcji.

  5. Dodaj odpowiedni atrybut powiązania do podpisu metody. W poniższym przykładzie komunikat kolejki wyzwala funkcję, a powiązanie wyjściowe tworzy nowy komunikat kolejki z tym samym tekstem w innej kolejce.

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

    Połączenie z usługą AzureWebJobsStorage Queue Storage jest uzyskiwane z ustawienia . Aby uzyskać więcej informacji, zobacz artykuł referencyjny dotyczący określonego powiązania.

Aby uzyskać pełną listę powiązań obsługiwanych przez funkcje, zobacz Obsługiwane powiązania.

Uruchamianie funkcji lokalnie

Podstawowe narzędzia usługi Azure Functions umożliwiają uruchamianie projektu usługi Azure Functions na lokalnym komputerze deweloperskim. Po naciśnięciu klawisza F5 w celu debugowania projektu usługi Functions lokalny host usługi Functions (func.exe) zaczyna nasłuchiwać na porcie lokalnym (zwykle 7071). Wszystkie wywoływane punkty końcowe funkcji są zapisywane w danych wyjściowych i można ich używać do testowania funkcji. Aby uzyskać więcej informacji, zobacz Praca z narzędziami Azure Functions Core Tools. Zostanie wyświetlony monit o zainstalowanie tych narzędzi przy pierwszym uruchomieniu funkcji z poziomu programu Visual Studio.

Aby uruchomić funkcję w programie Visual Studio w trybie debugowania:

  1. Naciśnij F5. Po wyświetleniu monitu zaakceptuj żądanie programu Visual Studio dotyczące pobrania i zainstalowania podstawowych narzędzi usługi Azure Functions (CLI). Może być również konieczne włączenie wyjątku zapory, aby narzędzia mogły obsługiwać żądania HTTP.

  2. Po uruchomieniu projektu przetestuj kod tak, jak w przypadku testowania wdrożonej funkcji.

    Po uruchomieniu programu Visual Studio w trybie debugowania punkty przerwania są osiągane zgodnie z oczekiwaniami.

Aby uzyskać bardziej szczegółowy scenariusz testowania przy użyciu programu Visual Studio, zobacz Funkcje testowania.

Publikowanie na platformie Azure

Podczas publikowania z programu Visual Studio jest używana jedna z dwóch metod wdrażania:

Wykonaj poniższe kroki, aby opublikować projekt w aplikacji funkcji na platformie Azure.

  1. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz polecenie Opublikuj. W obszarze Cel wybierz pozycję Azure , a następnie pozycję Dalej.

    Zrzut ekranu przedstawiający okno publikowania.

  2. Wybierz pozycję Aplikacja funkcji platformy Azure (Windows) dla określonego elementu docelowego, która tworzy aplikację funkcji działającą w systemie Windows, a następnie wybierz przycisk Dalej.

    Zrzut ekranu przedstawiający okno publikowania z określonym elementem docelowym.

  3. W wystąpieniu funkcji wybierz pozycję Utwórz nową funkcję platformy Azure...

    Zrzut ekranu przedstawiający tworzenie nowego wystąpienia aplikacji funkcji.

  4. Utwórz nowe wystąpienie przy użyciu wartości określonych w poniższej tabeli:

    Ustawienie Wartość Opis
    Nazwa Nazwa unikatowa w skali globalnej Unikatowa nazwa identyfikująca nową aplikację funkcji. Zaakceptuj tę nazwę lub wprowadź nową nazwę. Prawidłowe znaki to: a-z, 0-9i -.
    Subskrypcja Twoja subskrypcja Subskrypcja platformy Azure, która ma być używana. Zaakceptuj tę subskrypcję lub wybierz nową z listy rozwijanej.
    Grupa zasobów Nazwa grupy zasobów Grupa zasobów, w której chcesz utworzyć aplikację funkcji. Wybierz istniejącą grupę zasobów z listy rozwijanej lub wybierz pozycję Nowy , aby utworzyć nową grupę zasobów.
    Typ planu Zużycie Podczas publikowania projektu w aplikacji funkcji uruchamianej w planie Zużycie płacisz tylko za wykonania aplikacji funkcji. Inne plany hostingu generują wyższe koszty.
    Lokalizacja Lokalizacja usługi App Service Wybierz lokalizację w regionie w pobliżu Ciebie lub innych usług, do których uzyskujesz dostęp do funkcji.
    Azure Storage Konto magazynu ogólnego przeznaczenia Środowisko uruchomieniowe usługi Functions wymaga konta magazynu platformy Azure. Wybierz pozycję Nowy , aby skonfigurować konto magazynu ogólnego przeznaczenia. Możesz również wybrać istniejące konto spełniające wymagania dotyczące konta magazynu.

    Zrzut ekranu przedstawiający okno dialogowe Tworzenie App Service.

  5. Wybierz pozycję Utwórz , aby utworzyć aplikację funkcji i powiązane z nią zasoby na platformie Azure. Stan tworzenia zasobów jest wyświetlany w lewym dolnym rogu okna.

  6. W wystąpieniu usługi Functions upewnij się, że pole wyboru Uruchom z pliku pakietu jest zaznaczone. Aplikacja funkcji jest wdrażana przy użyciu narzędzia Zip Deploy z włączonym trybem Run-From-Package . Zip Deploy to zalecana metoda wdrażania dla projektu funkcji, co zapewnia lepszą wydajność.

    Zrzut ekranu przedstawiający kończenie tworzenia profilu.

  7. Wybierz pozycję Zakończ, a na stronie Publikowanie wybierz pozycję Publikuj , aby wdrożyć pakiet zawierający pliki projektu w nowej aplikacji funkcji na platformie Azure.

    Po zakończeniu wdrażania główny adres URL aplikacji funkcji na platformie Azure jest wyświetlany na karcie Publikowanie .

  8. Na karcie Publikowanie w sekcji Hosting wybierz pozycję Otwórz w Azure Portal. Spowoduje to otwarcie nowego zasobu platformy Azure aplikacji funkcji w Azure Portal.

    Zrzut ekranu przedstawiający komunikat o powodzeniu publikowania.

Ustawienia aplikacji funkcji

Program Visual Studio nie przekazuje tych ustawień automatycznie podczas publikowania projektu. Wszystkie ustawienia dodane w pliku local.settings.json należy również dodać do aplikacji funkcji na platformie Azure.

Najprostszym sposobem przekazania wymaganych ustawień do aplikacji funkcji na platformie Azure jest rozwinięcie trzech kropek obok sekcji Hosting i wybranie linku Zarządzaj ustawieniami Azure App Service, który zostanie wyświetlony po pomyślnym opublikowaniu projektu.

Ustawienia w oknie Publikowanie

Wybranie tego linku powoduje wyświetlenie okna dialogowego Ustawienia aplikacji dla aplikacji funkcji, w którym można dodać nowe ustawienia aplikacji lub zmodyfikować istniejące.

Ustawienia aplikacji

Ustawienie lokalne wyświetla wartość ustawienia w pliku local.settings.json, a funkcja Remote wyświetla bieżącą wartość ustawienia w aplikacji funkcji na platformie Azure. Wybierz pozycję Dodaj ustawienie , aby utworzyć nowe ustawienie aplikacji. Użyj linku Wstaw wartość z lokalnego , aby skopiować wartość ustawienia do pola Zdalne . Oczekujące zmiany są zapisywane w pliku ustawień lokalnych i aplikacji funkcji po wybraniu przycisku OK.

Uwaga

Domyślnie plik local.settings.json nie jest zaewidencjonowany w kontroli źródła. Oznacza to, że w przypadku klonowania lokalnego projektu usługi Functions z kontroli źródła projekt nie ma pliku local.settings.json. W takim przypadku należy ręcznie utworzyć plik local.settings.json w katalogu głównym projektu, aby okno dialogowe Ustawienia aplikacji działało zgodnie z oczekiwaniami.

Ustawienia aplikacji można również zarządzać na jeden z następujących sposobów:

Debugowanie zdalne

Aby zdalnie debugować aplikację funkcji, musisz opublikować konfigurację debugowania projektu. Należy również włączyć zdalne debugowanie w aplikacji funkcji na platformie Azure.

W tej sekcji założono, że aplikacja funkcji została już opublikowana przy użyciu konfiguracji wydania.

Zagadnienia dotyczące zdalnego debugowania

  • Debugowanie zdalne nie jest zalecane w usłudze produkcyjnej.
  • Jeśli masz włączone debugowanie Tylko mój kod , wyłącz go.
  • Unikaj długich zatrzymań w punktach przerwania podczas zdalnego debugowania. Platforma Azure traktuje proces, który jest zatrzymywany dłużej niż kilka minut jako proces nieodpowiadujący, i wyłącza go.
  • Podczas debugowania serwer wysyła dane do programu Visual Studio, co może mieć wpływ na opłaty za przepustowość. Aby uzyskać informacje o szybkościach przepustowości, zobacz Cennik platformy Azure.
  • Debugowanie zdalne jest automatycznie wyłączone w aplikacji funkcji po 48 godzinach. Po 48 godzinach należy ponownie włączyć zdalne debugowanie.

Dołączanie debugera

Sposób dołączania debugera zależy od trybu wykonywania. Podczas debugowania aplikacji izolowanego procesu roboczego należy obecnie dołączyć zdalny debuger do oddzielnego procesu platformy .NET i wykonać kilka innych kroków konfiguracji.

Po zakończeniu należy wyłączyć debugowanie zdalne.

Aby dołączyć zdalny debuger do aplikacji funkcji uruchomionej w procesie przy użyciu hosta usługi Functions:

  • Na karcie Publikowanie wybierz wielokropek (...) w sekcji Hosting , a następnie wybierz pozycję Dołącz debuger.

    Zrzut ekranu przedstawiający dołączanie debugera z programu Visual Studio.

Program Visual Studio łączy się z aplikacją funkcji i włącza zdalne debugowanie, jeśli nie jest jeszcze włączone. Lokalizuje również debuger i dołącza go do procesu hosta aplikacji. W tym momencie możesz debugować aplikację funkcji w zwykły sposób.

Wyłączanie debugowania zdalnego

Po zakończeniu zdalnego debugowania kodu należy wyłączyć debugowanie zdalne w Azure Portal. Zdalne debugowanie jest automatycznie wyłączone po 48 godzinach, jeśli zapomnisz.

  1. Na karcie Publikowanie w projekcie wybierz wielokropek (...) w sekcji Hosting, a następnie wybierz pozycję Otwórz w Azure Portal. Ta akcja powoduje otwarcie aplikacji funkcji w Azure Portal, do której wdrożono projekt.

  2. W aplikacji funkcji wybierz pozycję Konfiguracja w obszarze ustawień, wybierz pozycję Ustawienia ogólne, ustaw opcję Debugowanie zdalne na Wyłączone, a następnie wybierz pozycję Zapisz , a następnie pozycję Kontynuuj.

Po ponownym uruchomieniu aplikacji funkcji nie można już zdalnie łączyć się z procesami zdalnymi. Możesz użyć tej samej karty w Azure Portal, aby włączyć zdalne debugowanie poza programem Visual Studio.

Funkcje monitorowania

Zalecanym sposobem monitorowania wykonywania funkcji jest zintegrowanie aplikacji funkcji z usługą aplikacja systemu Azure Insights. Po utworzeniu aplikacji funkcji w Azure Portal ta integracja jest domyślnie wykonywana. Jednak po utworzeniu aplikacji funkcji podczas publikowania programu Visual Studio integracja z aplikacją funkcji na platformie Azure nie jest wykonywana. Aby dowiedzieć się, jak połączyć usługę Application Insights z aplikacją funkcji, zobacz Włączanie integracji usługi Application Insights.

Aby dowiedzieć się więcej na temat monitorowania przy użyciu usługi Application Insights, zobacz Monitorowanie Azure Functions.

Testowanie funkcji

W tej sekcji opisano sposób tworzenia projektu aplikacji funkcji w języku C# w programie Visual Studio oraz uruchamiania i testowania za pomocą narzędzia xUnit.

Testowanie Azure Functions za pomocą języka C# w programie Visual Studio

Konfigurowanie

Aby skonfigurować środowisko, utwórz funkcję i przetestuj aplikację. Poniższe kroki ułatwiają tworzenie aplikacji i funkcji wymaganych do obsługi testów:

  1. Tworzenie nowej aplikacji usługi Functions i nadaj jej nazwę Functions
  2. Utwórz funkcję HTTP na podstawie szablonu i nadaj jej nazwę MyHttpTrigger.
  3. Utwórz funkcję czasomierza na podstawie szablonu i nadaj jej nazwę MyTimerTrigger.
  4. Utwórz aplikację xUnit Test w rozwiązaniu i nadaj jej nazwę Functions.Tests. Usuń domyślne pliki testowe.
  5. Dodawanie odwołania z aplikacji testowej do witryny Microsoft.AspNetCore.Mvc przy użyciu narzędzia NuGet
  6. Odwołanie do aplikacji Functions z aplikacji Functions.Tests.

Tworzenie klas testowych

Po utworzeniu projektów można utworzyć klasy używane do uruchamiania testów automatycznych.

Każda funkcja przyjmuje wystąpienie usługi ILogger do obsługi rejestrowania komunikatów. Niektóre testy nie rejestrują komunikatów lub nie mają wątpliwości co do sposobu implementowania rejestrowania. Inne testy muszą ocenić zarejestrowane komunikaty, aby określić, czy test przechodzi.

Utworzysz nową klasę o nazwie ListLogger, która zawiera wewnętrzną listę komunikatów do oceny podczas testowania. Aby zaimplementować wymagany ILogger interfejs, klasa potrzebuje zakresu. Poniższa klasa wyśmiewa zakres przypadków testowych do przekazania do ListLogger klasy.

Utwórz nową klasę w projekcie Functions.Tests o nazwie NullScope.cs i wprowadź następujący kod:

using System;

namespace Functions.Tests
{
    public class NullScope : IDisposable
    {
        public static NullScope Instance { get; } = new NullScope();

        private NullScope() { }

        public void Dispose() { }
    }
}

Następnie utwórz nową klasę w projekcie Functions.Tests o nazwie ListLogger.cs i wprowadź następujący kod:

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

Klasa ListLogger implementuje następujące elementy członkowskie zgodnie z umową interfejsu ILogger :

  • BeginScope: Zakresy dodają kontekst do rejestrowania. W takim przypadku test wskazuje tylko wystąpienie statyczne w NullScope klasie, aby umożliwić działanie testu.

  • IsEnabled: podano wartość domyślną false .

  • Log: ta metoda używa podanej formatter funkcji do formatowania komunikatu, a następnie dodaje wynikowy tekst do Logs kolekcji.

Kolekcja Logs jest wystąpieniem List<string> i jest inicjowana w konstruktorze.

Następnie utwórz nowy plik w projekcie Functions.Tests o nazwie LoggerTypes.cs i wprowadź następujący kod:

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

Wyliczenie określa typ rejestratora używanego przez testy.

Teraz utwórz nową klasę w projekcie Functions.Tests o nazwie TestFactory.cs i wprowadź następujący 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", "Bill" },
                new object[] { "name", "Paul" },
                new object[] { "name", "Steve" }

            };
        }

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

Klasa TestFactory implementuje następujące elementy członkowskie:

  • Dane: ta właściwość zwraca kolekcję IEnumerable przykładowych danych. Pary wartości klucza reprezentują wartości przekazywane do ciągu zapytania.

  • CreateDictionary: ta metoda akceptuje parę klucz/wartość jako argumenty i zwraca nową Dictionary użytą do utworzenia QueryCollection w celu reprezentowania wartości ciągu zapytania.

  • CreateHttpRequest: ta metoda tworzy żądanie HTTP zainicjowane przy użyciu podanych parametrów ciągu zapytania.

  • CreateLogger: na podstawie typu rejestratora ta metoda zwraca klasę rejestratora używaną do testowania. Program ListLogger śledzi zarejestrowane komunikaty dostępne do oceny w testach.

Na koniec utwórz nową klasę w projekcie Functions.Tests o nazwie FunctionsTests.cs i wprowadź następujący 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", "Bill");
            var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger);
            Assert.Equal("Hello, Bill. 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);
        }
    }
}

Elementy członkowskie zaimplementowane w tej klasie to:

  • Http_trigger_should_return_known_string: Ten test tworzy żądanie z wartościami ciągu zapytania dla name=Bill funkcji HTTP i sprawdza, czy zwracana jest oczekiwana odpowiedź.

  • Http_trigger_should_return_string_from_member_data: ten test używa atrybutów xUnit do dostarczania przykładowych danych do funkcji HTTP.

  • Timer_should_log_message: Ten test tworzy wystąpienie ListLogger obiektu i przekazuje je do funkcji czasomierza. Po uruchomieniu funkcji dziennik jest sprawdzany, aby upewnić się, że oczekiwany komunikat jest obecny.

Jeśli chcesz uzyskać dostęp do ustawień aplikacji w testach, możesz wstrzyknąćIConfiguration wystąpienie z wyśmiewanymi wartościami zmiennych środowiskowych do funkcji.

Uruchom testy

Aby uruchomić testy, przejdź do Eksploratora testów i wybierz pozycję Uruchom wszystkie testy w widoku.

Testowanie Azure Functions za pomocą języka C# w programie Visual Studio

Debugowanie testów

Aby debugować testy, ustaw punkt przerwania w teście, przejdź do Eksploratora testów i wybierz pozycję Uruchom > ostatnie uruchomienie debugowania.

narzędzia Azure Functions za pomocą programu Visual Studio 2017

Azure Functions Tools jest dostępny w obciążeniu programistycznym platformy Azure, począwszy od programu Visual Studio 2017. W programie Visual Studio 2017 obciążenie programistyczne platformy Azure instaluje Azure Functions Tools jako oddzielne rozszerzenie. W programie Visual Studio 2019 lub nowszym rozszerzenie narzędzi Azure Functions jest aktualizowane w ramach programu Visual Studio.

Podczas aktualizowania instalacji programu Visual Studio 2017 upewnij się, że używasz najnowszej wersji narzędzi Azure Functions Tools. W poniższych sekcjach pokazano, jak sprawdzić i (w razie potrzeby) zaktualizować rozszerzenie Azure Functions Tools w programie Visual Studio 2017.

Sprawdzanie wersji narzędzi w programie Visual Studio 2017

  1. W menu Narzędzia wybierz pozycję Rozszerzenia i Aktualizacje. Rozwiń węzeł Zainstalowane>narzędzia, a następnie wybierz pozycję Azure Functions i Narzędzia zadań internetowych.

    Weryfikowanie wersji narzędzi usługi Functions

  2. Zwróć uwagę na zainstalowaną wersję i porównaj tę wersję z najnowszą wersją wymienioną w informacjach o wersji.

  3. Jeśli wersja jest starsza, zaktualizuj narzędzia w programie Visual Studio, jak pokazano w poniższej sekcji.

Aktualizowanie narzędzi w programie Visual Studio

  1. W oknie dialogowym Rozszerzenia i Aktualizacje rozwiń węzeł AktualizacjeVisual Studio Marketplace, wybierz pozycję Azure Functions >i Narzędzia zadań internetowych, a następnie wybierz pozycję Aktualizuj.

    Aktualizowanie wersji narzędzi usługi Functions

  2. Po pobraniu aktualizacji narzędzi wybierz pozycję Zamknij, a następnie zamknij program Visual Studio, aby wyzwolić aktualizację narzędzi za pomocą Instalatora VSIX.

  3. W instalatorze VSIX wybierz pozycję Modyfikuj , aby zaktualizować narzędzia.

  4. Po zakończeniu aktualizacji wybierz pozycję Zamknij, a następnie uruchom ponownie program Visual Studio.

Następne kroki

Aby uzyskać więcej informacji na temat narzędzi Azure Functions Core Tools, zobacz Praca z narzędziami Azure Functions Core Tools.

Aby uzyskać więcej informacji na temat tworzenia funkcji jako bibliotek klas platformy .NET, zobacz Azure Functions dokumentacja dla deweloperów języka C#. Ten artykuł zawiera również linki do przykładów użycia atrybutów do deklarowania różnych typów powiązań obsługiwanych przez Azure Functions.