Udostępnij za pośrednictwem


biblioteka klienta procesora zdarzeń Azure Event Hubs dla platformy .NET — wersja 5.8.1

Azure Event Hubs to wysoce skalowalna usługa publikowania-subskrybowania, która może pozyskiwać miliony zdarzeń na sekundę i przesyłać je strumieniowo do wielu użytkowników. Umożliwia to przetwarzanie i analizowanie ogromnych ilości danych generowanych przez połączone urządzenia i aplikacje. Po zebraniu danych przez usługę Event Hubs można je pobrać, przekształcić i przechowywać za pomocą dowolnego dostawcy analizy w czasie rzeczywistym lub adapterów przetwarzania wsadowego/magazynu. Jeśli chcesz dowiedzieć się więcej na temat Azure Event Hubs, warto przejrzeć artykuł Co to jest usługa Event Hubs.

Biblioteka klienta procesora zdarzeń jest towarzyszem biblioteki klienta Azure Event Hubs, zapewniając autonomicznego klienta do korzystania z zdarzeń w niezawodny, trwały i skalowalny sposób odpowiedni dla większości scenariuszy produkcyjnych. Zalecana jest zalecana implementacja utworzona przy użyciu obiektów blob usługi Azure Storage:

  • Odczytywanie i przetwarzanie zdarzeń we wszystkich partycjach centrum zdarzeń na dużą skalę z odpornością na przejściowe awarie i sporadyczne problemy z siecią.

  • Przetwarzanie zdarzeń kooperacyjnie, gdzie wiele procesorów dynamicznie dystrybuuje i współdziel odpowiedzialność w kontekście grupy odbiorców, bezpiecznie zarządzając obciążeniem w miarę dodawania i usuwania procesorów z grupy.

  • Zarządzanie punktami kontrolnymi i stanem przetwarzania w trwały sposób przy użyciu obiektów blob usługi Azure Storage jako bazowego magazynu danych.

Kod | źródłowy Pakiet (NuGet) | Dokumentacja referencyjna interfejsu | API Dokumentacja | produktu Przewodnik rozwiązywania problemów

Wprowadzenie

Wymagania wstępne

  • Subskrypcja platformy Azure: Do korzystania z usług platformy Azure, w tym Azure Event Hubs, potrzebna jest subskrypcja. Jeśli nie masz istniejącego konta platformy Azure, możesz utworzyć konto bezpłatnej wersji próbnej lub skorzystać z korzyści z subskrypcji programu Visual Studio podczas tworzenia konta.

  • Przestrzeń nazw usługi Event Hubs z centrum zdarzeń: Aby korzystać z Azure Event Hubs, musisz również mieć dostępną przestrzeń nazw i centrum zdarzeń. Jeśli nie znasz tworzenia zasobów platformy Azure, możesz skorzystać z przewodnika krok po kroku dotyczącego tworzenia centrum zdarzeń przy użyciu Azure Portal. W tym miejscu można również znaleźć szczegółowe instrukcje dotyczące tworzenia centrum zdarzeń przy użyciu interfejsu wiersza polecenia platformy Azure, Azure PowerShell lub szablonów usługi Azure Resource Manager (ARM).

  • Konto usługi Azure Storage z magazynem obiektów blob: Aby zachować punkty kontrolne i zarządzać własnością w usłudze Azure Storage, musisz mieć konto usługi Azure Storage z dostępnymi obiektami blob. Jeśli nie znasz kont usługi Azure Storage, możesz skorzystać z przewodnika krok po kroku dotyczącego tworzenia konta magazynu przy użyciu Azure Portal. W tym miejscu można również znaleźć szczegółowe instrukcje dotyczące tworzenia kont magazynu przy użyciu interfejsu wiersza polecenia platformy Azure, Azure PowerShell lub szablonów usługi Azure Resource Manager (ARM).

  • Kontener obiektów blob usługi Azure Storage: Dane punktu kontrolnego i własności w usłudze Azure Storage zostaną zapisane w obiektach blob w określonym kontenerze. Kontener EventProcessorClient wymaga istniejącego kontenera i nie utworzy go niejawnie, aby chronić go przed przypadkową błędną konfiguracją. Jeśli nie znasz kontenerów usługi Azure Storage, zapoznaj się z dokumentacją dotyczącą zarządzania kontenerami. W tym miejscu można znaleźć szczegółowe instrukcje dotyczące tworzenia kontenera przy użyciu platformy .NET, interfejsu wiersza polecenia platformy Azure lub Azure PowerShell.

  • C# 8.0: Biblioteka klienta Azure Event Hubs korzysta z nowych funkcji, które zostały wprowadzone w języku C# 8.0. Aby korzystać ze składni języka C# 8.0, zaleca się skompilowanie przy użyciu zestawu .NET Core SDK 3.0 lub nowszego latestz wersją języka .

    Użytkownicy programu Visual Studio, którzy chcą w pełni korzystać ze składni języka C# 8.0, muszą korzystać z programu Visual Studio 2019 lub nowszego. Program Visual Studio 2019, w tym bezpłatna wersja Community, można pobrać tutaj. Użytkownicy programu Visual Studio 2017 mogą korzystać ze składni języka C# 8, korzystając z pakietu NuGet Microsoft.Net.Compilers i ustawiając wersję języka, chociaż środowisko edycji może nie być idealne.

    Nadal można używać biblioteki z poprzednimi wersjami języka C#, ale trzeba będzie zarządzać asynchronicznymi wyliczalnymi i asynchronicznymi członkami jednorazowymi ręcznie, zamiast korzystać z nowej składni. Nadal możesz kierować dowolną wersję platformy obsługiwaną przez zestaw .NET Core SDK, w tym wcześniejsze wersje platformy .NET Core lub .NET Framework. Aby uzyskać więcej informacji, zobacz: jak określić platformy docelowe.

    Ważna uwaga: Aby skompilować lub uruchomić przykłady oraz przykłady bez modyfikacji, konieczne jest użycie języka C# 11.0. Nadal możesz uruchomić przykłady, jeśli zdecydujesz się dostosować je dla innych wersji językowych.

Aby szybko utworzyć potrzebne zasoby na platformie Azure i odebrać dla nich parametry połączenia, możesz wdrożyć nasz przykładowy szablon, klikając:

Wdróż na platformie Azure

Instalowanie pakietu

Zainstaluj bibliotekę klienta procesora zdarzeń Azure Event Hubs dla platformy .NET przy użyciu narzędzia NuGet:

dotnet add package Azure.Messaging.EventHubs.Processor

Uwierzytelnianie klienta

Uzyskiwanie parametrów połączenia usługi Event Hubs

Aby biblioteka klienta usługi Event Hubs współdziałała z centrum zdarzeń, musi zrozumieć, jak nawiązać z nią połączenie i autoryzować je. Najprostszym sposobem jest użycie parametrów połączenia, które są tworzone automatycznie podczas tworzenia przestrzeni nazw usługi Event Hubs. Jeśli nie znasz parametrów połączenia z usługą Event Hubs, możesz skorzystać z przewodnika krok po kroku, aby uzyskać parametry połączenia usługi Event Hubs.

Uzyskiwanie parametrów połączenia usługi Azure Storage

Aby klient procesora zdarzeń korzystał z obiektów blob usługi Azure Storage na potrzeby tworzenia punktów kontrolnych, musi wiedzieć, jak nawiązać połączenie z kontem magazynu i autoryzować go. Najprostszą metodą jest użycie parametrów połączenia, które są generowane w momencie utworzenia konta magazynu. Jeśli nie znasz autoryzacji parametrów połączenia konta magazynu na platformie Azure, możesz skorzystać z przewodnika krok po kroku, aby skonfigurować parametry połączenia usługi Azure Storage.

Kluczowe pojęcia

  • Procesor zdarzeń to konstrukcja przeznaczona do zarządzania obowiązkami skojarzonymi z nawiązywaniem połączenia z danym centrum zdarzeń i przetwarzaniem zdarzeń z każdej z jego partycji w kontekście określonej grupy odbiorców. Czynność przetwarzania zdarzeń odczytywanych z partycji i obsługi wszelkich błędów, które występują, jest delegowana przez procesor zdarzeń do podanego kodu, co pozwala logiki skoncentrować się na dostarczaniu wartości biznesowej, podczas gdy procesor obsługuje zadania związane z odczytywaniem zdarzeń, zarządzanie partycjami i umożliwia utrwalanie stanu w postaci punktów kontrolnych.

  • Tworzenie punktów kontrolnych to proces, za pomocą którego czytelnicy oznaczają i utrzymują swoją pozycję dla zdarzeń przetworzonych dla partycji. Tworzenie punktów kontrolnych to odpowiedzialność konsumenta i występuje na poszczególnych partycjach, zazwyczaj w kontekście określonej grupy odbiorców. W przypadku klasy EventProcessorClientoznacza to, że w przypadku grupy odbiorców i kombinacji partycji procesor musi śledzić swoją bieżącą pozycję w strumieniu zdarzeń. Jeśli chcesz uzyskać więcej informacji, zapoznaj się z tworzeniem punktów kontrolnych w dokumentacji produktu Event Hubs.

    Po nawiązaniu połączenia przez procesor zdarzeń rozpocznie odczytywanie zdarzeń w punkcie kontrolnym, który był wcześniej utrwalany przez ostatni procesor tej partycji w tej grupie odbiorców, jeśli istnieje. Jako procesor zdarzeń odczytuje zdarzenia i działa na zdarzeniach w partycji, powinien okresowo tworzyć punkty kontrolne, aby oznaczyć zdarzenia jako "kompletne" przez aplikacje podrzędne i zapewnić odporność, jeśli procesor zdarzeń lub środowisko go hostuje. W razie potrzeby można ponownie przetworzyć zdarzenia, które zostały wcześniej oznaczone jako "ukończone", określając wcześniejsze przesunięcie za pośrednictwem tego procesu tworzenia punktów kontrolnych.

  • Partycja to uporządkowana sekwencja zdarzeń przechowywanych w centrum zdarzeń. Partycje to sposób organizacji danych skojarzonych z równoległością wymaganą przez odbiorców zdarzeń. Azure Event Hubs zapewnia przesyłanie strumieniowe komunikatów za pośrednictwem partycjonowanego wzorca konsumenta, w którym każdy odbiorca odczytuje tylko określony podzbiór lub partycję strumienia komunikatów. Po nadejściu nowszych zdarzeń są one dodawane na końcu sekwencji. Liczba partycji jest określana w momencie utworzenia centrum zdarzeń i nie można jej zmienić.

  • Grupa odbiorców jest widokiem całego centrum zdarzeń. Grupy odbiorców umożliwiają wielu aplikacjom korzystającym z każdego z nich oddzielny widok strumienia zdarzeń oraz odczytywanie strumienia niezależnie we własnym tempie i na własną rękę. W partycji na grupę odbiorców może znajdować się co najwyżej 5 jednoczesnych czytników; jednak zaleca się, aby dla danej partycji i grupy odbiorców istniał tylko jeden aktywny odbiorca. Każdy aktywny czytnik odbiera wszystkie zdarzenia z partycji; Jeśli na tej samej partycji znajduje się wiele czytników, otrzymają one zduplikowane zdarzenia.

Aby uzyskać więcej pojęć i głębszą dyskusję, zobacz: Event Hubs Features (Funkcje usługi Event Hubs).

Okres istnienia klienta

Element EventProcessorClient jest bezpieczny do buforowania i używany jako pojedynczy element w okresie istnienia aplikacji, co jest najlepszym rozwiązaniem w przypadku regularnego odczytywania zdarzeń. Klienci są odpowiedzialni za efektywne zarządzanie siecią, procesorem i pamięcią, pracując nad utrzymaniem niskiego użycia w okresach braku aktywności. Wywoływanie StopProcessingAsync lub StopProcessing na procesorze jest wymagane, aby zapewnić prawidłowe czyszczenie zasobów sieciowych i innych niezarządzanych obiektów.

Bezpieczeństwo wątkowe

Gwarantujemy, że wszystkie metody wystąpienia klienta są bezpieczne wątkowo i niezależne od siebie (wytyczne). Dzięki temu zalecenie ponownego obsługi wystąpień klienta jest zawsze bezpieczne, nawet w wątkach.

Typy modeli danych, takie jak EventData i EventDataBatch , nie są bezpieczne wątkowo. Nie powinny być współużytkowane przez wątki ani używane współbieżnie z metodami klienta.

Dodatkowe pojęcia

Opcje | klienta Programy obsługi | zdarzeń Obsługa błędów | Diagnostyka | Pozorowanie (procesor) | Pozorowanie (typy klientów)

Przykłady

Tworzenie klienta procesora zdarzeń

EventProcessorClient Ponieważ obiekt ma zależność od obiektów blob usługi Azure Storage na potrzeby trwałości jego stanu, należy podać BlobContainerClient dla procesora, który został skonfigurowany dla konta magazynu i kontenera, który powinien być używany. Kontener używany do konfigurowania EventProcessorClient musi istnieć.

Ponieważ element EventProcessorClient nie ma możliwości poznania intencji określenia kontenera, który nie istnieje, nie utworzy niejawnie kontenera. Działa to jako ochrona przed nieprawidłowo skonfigurowanym kontenerem, co powoduje, że nieautoryzowany procesor nie może współdzielić własności i zakłócać działania innych procesorów w grupie odbiorców.

// The container specified when creating the BlobContainerClient must exist; it will
// not be implicitly created.

var storageConnectionString = "<< CONNECTION STRING FOR THE STORAGE ACCOUNT >>";
var blobContainerName = "<< NAME OF THE BLOB CONTAINER >>";

var eventHubsConnectionString = "<< CONNECTION STRING FOR THE EVENT HUBS NAMESPACE >>";
var eventHubName = "<< NAME OF THE EVENT HUB >>";
var consumerGroup = "<< NAME OF THE EVENT HUB CONSUMER GROUP >>";

var storageClient = new BlobContainerClient(storageConnectionString, blobContainerName);
var processor = new EventProcessorClient(storageClient, consumerGroup, eventHubsConnectionString, eventHubName);

Konfigurowanie programów obsługi zdarzeń i błędów

Aby można było użyć EventProcessorClientprogramu , należy podać programy obsługi przetwarzania zdarzeń i błędów. Te procedury obsługi są uznawane za samodzielne, a deweloperzy są odpowiedzialni za zapewnienie, że są uwzględniane wyjątki w kodzie programu obsługi.

var storageConnectionString = "<< CONNECTION STRING FOR THE STORAGE ACCOUNT >>";
var blobContainerName = "<< NAME OF THE BLOB CONTAINER >>";

var eventHubsConnectionString = "<< CONNECTION STRING FOR THE EVENT HUBS NAMESPACE >>";
var eventHubName = "<< NAME OF THE EVENT HUB >>";
var consumerGroup = "<< NAME OF THE EVENT HUB CONSUMER GROUP >>";

async Task processEventHandler(ProcessEventArgs eventArgs)
{
    try
    {
        // Perform the application-specific processing for an event.  This method
        // is intended for illustration and is not defined in this snippet.

        await DoSomethingWithTheEvent(eventArgs.Partition, eventArgs.Data);
    }
    catch
    {
        // Handle the exception from handler code
    }
}

async Task processErrorHandler(ProcessErrorEventArgs eventArgs)
{
    try
    {
        // Perform the application-specific processing for an error.  This method
        // is intended for illustration and is not defined in this snippet.

        await DoSomethingWithTheError(eventArgs.Exception);
    }
    catch
    {
        // Handle the exception from handler code
    }
}

var storageClient = new BlobContainerClient(storageConnectionString, blobContainerName);
var processor = new EventProcessorClient(storageClient, consumerGroup, eventHubsConnectionString, eventHubName);

processor.ProcessEventAsync += processEventHandler;
processor.ProcessErrorAsync += processErrorHandler;

Uruchamianie i zatrzymywanie przetwarzania

Funkcja EventProcessorClient wykona swoje przetwarzanie w tle po jawnym uruchomieniu i będzie kontynuować, dopóki nie zostanie jawnie zatrzymana. Chociaż umożliwia to kodowi aplikacji wykonywanie innych zadań, również odpowiedzialność za zapewnienie, że proces nie zakończy się podczas przetwarzania, jeśli nie ma żadnych innych zadań, które są wykonywane.

var cancellationSource = new CancellationTokenSource();
cancellationSource.CancelAfter(TimeSpan.FromSeconds(45));

var storageConnectionString = "<< CONNECTION STRING FOR THE STORAGE ACCOUNT >>";
var blobContainerName = "<< NAME OF THE BLOB CONTAINER >>";

var eventHubsConnectionString = "<< CONNECTION STRING FOR THE EVENT HUBS NAMESPACE >>";
var eventHubName = "<< NAME OF THE EVENT HUB >>";
var consumerGroup = "<< NAME OF THE EVENT HUB CONSUMER GROUP >>";

Task processEventHandler(ProcessEventArgs eventArgs) => Task.CompletedTask;
Task processErrorHandler(ProcessErrorEventArgs eventArgs) => Task.CompletedTask;

var storageClient = new BlobContainerClient(storageConnectionString, blobContainerName);
var processor = new EventProcessorClient(storageClient, consumerGroup, eventHubsConnectionString, eventHubName);

processor.ProcessEventAsync += processEventHandler;
processor.ProcessErrorAsync += processErrorHandler;

await processor.StartProcessingAsync();

try
{
    // The processor performs its work in the background; block until cancellation
    // to allow processing to take place.

    await Task.Delay(Timeout.Infinite, cancellationSource.Token);
}
catch (TaskCanceledException)
{
    // This is expected when the delay is canceled.
}

try
{
    await processor.StopProcessingAsync();
}
finally
{
    // To prevent leaks, the handlers should be removed when processing is complete.

    processor.ProcessEventAsync -= processEventHandler;
    processor.ProcessErrorAsync -= processErrorHandler;
}

Używanie jednostki usługi Active Directory z klientem procesora zdarzeń

Biblioteka tożsamości platformy Azure zapewnia obsługę uwierzytelniania usługi Azure Active Directory, która może być używana dla bibliotek klienta platformy Azure, w tym usług Event Hubs i Azure Storage.

Aby korzystać z jednostki usługi Active Directory, podczas tworzenia klienta usługi Event Hubs jest określane jedno z dostępnych poświadczeń z Azure.Identity biblioteki. Ponadto w pełni kwalifikowana przestrzeń nazw usługi Event Hubs i nazwa żądanego centrum zdarzeń są dostarczane zamiast parametrów połączenia usługi Event Hubs.

Aby można było korzystać z jednostki usługi Active Directory z kontenerami obiektów blob usługi Azure Storage, podczas tworzenia klienta magazynu należy podać w pełni kwalifikowany adres URL kontenera. Szczegółowe informacje o prawidłowych formatach identyfikatora URI na potrzeby uzyskiwania dostępu do usługi Blob Storage można znaleźć w temacie Nazewnictwo i odwoływanie się do kontenerów, obiektów blob i metadanych.

var credential = new DefaultAzureCredential();
var blobStorageUrl ="<< FULLY-QUALIFIED CONTAINER URL (like https://myaccount.blob.core.windows.net/mycontainer) >>";

var fullyQualifiedNamespace = "<< FULLY-QUALIFIED EVENT HUBS NAMESPACE (like something.servicebus.windows.net) >>";
var eventHubName = "<< NAME OF THE EVENT HUB >>";
var consumerGroup = "<< NAME OF THE EVENT HUB CONSUMER GROUP >>";

var storageClient = new BlobContainerClient(new Uri(blobStorageUrl), credential);

var processor = new EventProcessorClient
(
    storageClient,
    consumerGroup,
    fullyQualifiedNamespace,
    eventHubName,
    credential
);

W przypadku korzystania z usługi Azure Active Directory z usługą Event Hubs podmiot zabezpieczeń musi mieć przypisaną rolę, która umożliwia odczytywanie z usługi Event Hubs, takich jak Azure Event Hubs Data Receiver rola. Aby uzyskać więcej informacji na temat używania autoryzacji usługi Azure Active Directory z usługą Event Hubs, zapoznaj się z skojarzona dokumentacja.

W przypadku korzystania z usługi Azure Active Directory z usługą Azure Storage podmiot zabezpieczeń musi mieć przypisaną rolę, która umożliwia dostęp do obiektów blob odczytu, zapisu i usuwania, takich jak Storage Blob Data Contributor rola. Aby uzyskać więcej informacji na temat używania autoryzacji usługi Active Directory z usługą Azure Storage, zapoznaj się z skojarzą dokumentacją i przykładem autoryzacji usługi Azure Storage.

Rozwiązywanie problemów

Aby uzyskać szczegółowe informacje dotyczące rozwiązywania problemów, zapoznaj się z przewodnikiem rozwiązywania problemów z usługą Event Hubs.

Obsługa wyjątków

Wyjątki klienta procesora zdarzeń

Klient procesora zdarzeń podejmuje każdą próbę odporności na wyjątki i podejmie niezbędne działania w celu kontynuowania przetwarzania, chyba że nie można tego zrobić. Do wykonania tej czynności nie są potrzebne żadne działania od deweloperów; jest natywnie częścią zachowania procesora.

Aby umożliwić deweloperom inspekcję i reagowanie na wyjątki występujące w operacjach klienta procesora zdarzeń, są one udostępniane za pośrednictwem ProcessError zdarzenia. Argumenty dla tego zdarzenia oferują szczegółowe informacje o wyjątku i kontekście, w którym został zaobserwowany. Deweloperzy mogą wykonywać normalne operacje na kliencie procesora zdarzeń z poziomu tej procedury obsługi zdarzeń, takich jak zatrzymywanie i/lub ponowne uruchamianie go w odpowiedzi na błędy, ale może nie wpływać na zachowanie wyjątku procesora.

Aby zapoznać się z podstawowym przykładem implementacji procedury obsługi błędów, zobacz przykład: Procedury obsługi procesora zdarzeń.

Wyjątki w procedurach obsługi zdarzeń

Ponieważ klient procesora zdarzeń nie ma odpowiedniego kontekstu, aby zrozumieć ważność wyjątków w programach obsługi zdarzeń, które udostępniają deweloperzy, nie może przyjąć, jakie działania byłyby rozsądną odpowiedzią na nie. W rezultacie deweloperzy są traktowani jako odpowiedzialni za wyjątki występujące w programach obsługi zdarzeń, które udostępniają przy użyciu try/catch bloków i innych standardowych konstrukcji językowych.

Klient procesora zdarzeń nie będzie próbował wykrywać wyjątków w kodzie dewelopera ani jawnie je wyświetlać. Wynikowe zachowanie będzie zależeć od środowiska hostingu procesora i kontekstu, w którym wywoływano procedurę obsługi zdarzeń. Ponieważ może się to różnić w różnych scenariuszach, zdecydowanie zaleca się, aby deweloperzy kodowali programy obsługi zdarzeń w defensywie i uwzględniały potencjalne wyjątki.

Rejestrowanie i diagnostyka

Biblioteka klienta procesora zdarzeń jest w pełni instrumentowana do rejestrowania informacji na różnych poziomach szczegółów przy użyciu platformy .NET EventSource do emitowania informacji. Rejestrowanie jest wykonywane dla każdej operacji i jest zgodne ze wzorcem oznaczania punktu początkowego operacji, ukończenia i napotkanych wyjątków. Dodatkowe informacje, które mogą oferować szczegółowe informacje, są również rejestrowane w kontekście skojarzonej operacji.

Dzienniki klienta procesora zdarzeń są dostępne dla wszystkich EventListener źródeł, decydując się na źródło o nazwie "Azure-Messaging-EventHubs-Processor-EventProcessorClient" lub decydując się na wszystkie źródła, które mają cechę "AzureEventSource". Aby ułatwić przechwytywanie dzienników z bibliotek klienckich platformy Azure, Azure.Core biblioteka używana przez usługę Event Hubs oferuje element AzureEventSourceListener. Więcej informacji można znaleźć w temacie Przechwytywanie dzienników usługi Event Hubs przy użyciu elementu AzureEventSourceListener.

Biblioteka procesora zdarzeń jest również instrumentowana do śledzenia rozproszonego przy użyciu usługi Application Insights lub OpenTelemetry. Więcej informacji można znaleźć w przykładzie Diagnostyka Azure.Core.

Następne kroki

Poza omówionymi scenariuszami biblioteka procesora Azure Event Hubs oferuje obsługę dodatkowych scenariuszy, które ułatwiają korzystanie z pełnego zestawu funkcji .EventProcessorClient Aby ułatwić zapoznanie się z niektórymi z tych scenariuszy, biblioteka klienta procesora usługi Event Hubs oferuje projekt przykładów, aby służyć jako ilustracja dla typowych scenariuszy. Aby uzyskać szczegółowe informacje, zobacz przykłady README .

Współtworzenie

W tym projekcie zachęcamy do współtworzenia i zgłaszania sugestii. Współtworzenie w większości przypadków wymaga zgody na umowę licencyjną dotyczącą współautorów (CLA, Contributor License Agreement), zgodnie z którą współautor ma prawo udzielić i faktycznie udziela nam praw do używania wytworzonej przez siebie zawartości. Aby uzyskać szczegółowe informacje, odwiedź stronę https://cla.microsoft.com.

Po przesłaniu żądania ściągnięcia robot CLA automatycznie określi, czy musisz przekazać umowę CLA, i doda odpowiednie informacje do tego żądania (na przykład etykietę czy komentarz). Po prostu postępuj zgodnie z instrukcjami robota. Wystarczy zrobić to raz dla wszystkich repozytoriów, w przypadku których jest używana nasza umowa CLA.

W tym projekcie przyjęto Kodeks postępowania oprogramowania Open Source firmy Microsoft. Aby uzyskać więcej informacji, zobacz Często zadawane pytania dotyczące kodeksu postępowania lub skontaktuj się z opencode@microsoft.com dodatkowymi pytaniami lub komentarzami.

Aby uzyskać więcej informacji, zobacz nasz przewodnik dotyczący współtworzenia .

Wrażenia