Share via


.NET için Azure Event Hubs Olay İşlemcisi istemci kitaplığı - sürüm 5.8.1

Azure Event Hubs saniyede milyonlarca olay alıp bunları birden çok tüketiciye aktarabilen yüksek oranda ölçeklenebilir bir yayımlama-abone olma hizmetidir. Bu sayede bağlı cihazlarınız ve uygulamalarınız tarafından üretilen çok büyük miktarlardaki verileri işleyip analiz edebilirsiniz. Event Hubs verileri topladıktan sonra, herhangi bir gerçek zamanlı analiz sağlayıcısını kullanarak veya toplu işlem/depolama bağdaştırıcılarıyla verileri alabilir, dönüştürebilir ve depolayabilirsiniz. Azure Event Hubs hakkında daha fazla bilgi edinmek isterseniz şunları gözden geçirmek isteyebilirsiniz: Event Hubs nedir?

Olay İşlemcisi istemci kitaplığı, Azure Event Hubs istemci kitaplığının eşlikçisidir ve olayları üretim senaryolarının çoğuna uygun, sağlam, dayanıklı ve ölçeklenebilir bir şekilde kullanmak için tek başına bir istemci sağlar. Azure Depolama blobları kullanılarak oluşturulan, olay işlemcisi aşağıdakiler için önerilen, düşünceli bir uygulama:

  • Olay Hub'ının tüm bölümlerindeki olayları, geçici hatalara ve aralıklı ağ sorunlarına dayanıklılıkla büyük ölçekte okuma ve işleme.

  • Birden çok işlemcinin bir tüketici grubu bağlamında dinamik olarak dağıttığı ve sorumluluğu paylaştığı, işlemciler eklendikçe ve gruptan kaldırıldığında yükü düzgün bir şekilde yönettiği olayları işbirliği içinde işleme.

  • Temel alınan veri deposu olarak Azure Depolama bloblarını kullanarak denetim noktalarını ve durumu dayanıklı bir şekilde işlemeye yönelik yönetme.

Kaynak kodu | Paket (NuGet) | API başvuru belgeleri | Ürün belgeleri | Sorun giderme kılavuzu

Başlarken

Önkoşullar

  • Azure Aboneliği: Azure Event Hubs dahil olmak üzere Azure hizmetlerini kullanmak için bir aboneliğe ihtiyacınız vardır. Mevcut bir Azure hesabınız yoksa ücretsiz deneme sürümüne kaydolabilir veya hesap oluştururkenVisual Studio Aboneliği avantajlarınızı kullanabilirsiniz.

  • Olay Hub'ı ile Event Hubs ad alanı: Azure Event Hubs etkileşime geçmek için bir ad alanı ve Olay Hub'ına da sahip olmanız gerekir. Azure kaynakları oluşturma hakkında bilginiz yoksa, Azure portal kullanarak Olay Hub'ı oluşturmak için adım adım kılavuzu izlemek isteyebilirsiniz. Burada, Olay Hub'ı oluşturmak için Azure CLI, Azure PowerShell veya Azure Resource Manager (ARM) şablonlarını kullanmaya yönelik ayrıntılı yönergeleri de bulabilirsiniz.

  • Blob depolama ile Azure Depolama hesabı: Denetim noktalarını kalıcı hale getirmek ve Azure Depolama'daki sahipliği yönetmek için bloblar içeren bir Azure Depolama hesabınızın olması gerekir. Azure Depolama hesaplarını tanımıyorsanız, Azure portal kullanarak depolama hesabı oluşturmak için adım adım kılavuzu izlemek isteyebilirsiniz. Burada depolama hesapları oluşturmak için Azure CLI, Azure PowerShell veya Azure Resource Manager (ARM) şablonlarını kullanmaya yönelik ayrıntılı yönergeleri de bulabilirsiniz.

  • Azure Depolama blob kapsayıcısı: Azure Depolama'daki denetim noktası ve sahiplik verileri belirli bir kapsayıcıdaki bloblara yazılır. EventProcessorClient mevcut bir kapsayıcı gerektirir ve yanlışlıkla yanlış yapılandırmaya karşı korunmaya yardımcı olmak için örtük olarak bir kapsayıcı oluşturmaz. Azure Depolama kapsayıcılarını tanımıyorsanız kapsayıcıları yönetme belgelerine başvurmak isteyebilirsiniz. Burada kapsayıcı oluşturmak için .NET, Azure CLI veya Azure PowerShell kullanmaya yönelik ayrıntılı yönergeleri bulabilirsiniz.

  • C# 8.0: Azure Event Hubs istemci kitaplığı, C# 8.0'da tanıtılan yeni özellikleri kullanır. C# 8.0 söz diziminin avantajlarından yararlanmak için dil sürümüyle.NET Core SDK 3.0 veya üzerini latestkullanarak derlemeniz önerilir.

    C# 8.0 söz diziminin tüm avantajlarından yararlanmak isteyen Visual Studio kullanıcılarının Visual Studio 2019 veya sonraki bir sürümünü kullanması gerekir. Ücretsiz Community sürümü de dahil olmak üzere Visual Studio 2019 buradan indirilebilir. Visual Studio 2017 kullanıcıları , Microsoft.Net.Compilers NuGet paketini kullanarak ve dil sürümünü ayarlayarak C# 8 söz diziminin avantajlarından yararlanabilir, ancak düzenleme deneyimi ideal olmayabilir.

    Kitaplığı önceki C# dil sürümleriyle kullanmaya devam edebilirsiniz, ancak yeni söz diziminden yararlanmak yerine zaman uyumsuz numaralandırılabilir ve zaman uyumsuz atılabilir üyeleri el ile yönetmeniz gerekir. .NET Core SDK'nız tarafından desteklenen .NET Core veya .NET framework'ün önceki sürümleri de dahil olmak üzere herhangi bir çerçeve sürümünü hedeflemeye devam edebilirsiniz. Daha fazla bilgi için bkz. Hedef çerçeveleri belirtme.

    Önemli Not:Örnekleri ve örnekleri değişiklik yapmadan derlemek veya çalıştırmak için C# 11.0 kullanılması gerekir. Örnekleri diğer dil sürümleri için ayarlamaya karar verirseniz yine de çalıştırabilirsiniz.

Azure'da gerekli kaynakları hızlı bir şekilde oluşturmak ve bunlara yönelik bağlantı dizelerini almak için, örnek şablonumuzu dağıtmak için şu tıklamalara tıklayabilirsiniz:

Azure’a dağıtın

Paketi yükleme

NuGet kullanarak .NET için Azure Event Hubs Olay İşlemcisi istemci kitaplığını yükleyin:

dotnet add package Azure.Messaging.EventHubs.Processor

İstemcinin kimliğini doğrulama

Event Hubs bağlantı dizesi alma

Event Hubs istemci kitaplığının bir Olay Hub'ı ile etkileşim kurması için, bu kitaplıkla nasıl bağlantı kurulacağını ve yetkilendirileceğini anlaması gerekir. Bunu yapmanın en kolay yolu, Event Hubs ad alanı oluşturulurken otomatik olarak oluşturulan bir bağlantı dizesi kullanmaktır. Event Hubs ile bağlantı dizelerini kullanmayı bilmiyorsanız, Event Hubs bağlantı dizesini almak için adım adım kılavuzu izlemek isteyebilirsiniz.

Azure Depolama bağlantı dizesi alma

Olay işlemcisi istemcisinin denetim noktası oluşturma amacıyla Azure Depolama bloblarını kullanabilmesi için depolama hesabına bağlanmayı ve bu hesapla yetkilendirmeyi anlaması gerekir. Bunu yapmanın en basit yöntemi, depolama hesabının oluşturulduğu sırada oluşturulan bir bağlantı dizesi kullanmaktır. Azure'da depolama hesabı bağlantı dizesi yetkilendirmesi hakkında bilginiz yoksa, Azure Depolama bağlantı dizelerini yapılandırmak için adım adım kılavuzu izlemek isteyebilirsiniz.

Önemli kavramlar

  • Olay işlemcisi, belirli bir Olay Hub'ına bağlanma ve bölümlerinin her birinden olayları işleme ile ilişkili sorumlulukları belirli bir tüketici grubu bağlamında yönetmeye yönelik bir yapıdır. Bölümden okunan olayları işleme ve oluşan hataları işleme eylemi, olay işlemcisi tarafından sağladığınız koda devredilir ve mantığınızın iş değeri sunmaya odaklanmasına olanak tanırken işlemci olayları okuma, bölümleri yönetme ve durumu denetim noktaları biçiminde kalıcı hale getirmekle ilişkili görevleri işler.

  • Denetim noktası oluşturma , okuyucuların bir bölüm için işlenen olaylar için konumlarını işaretlediği ve kalıcı hale getiren bir işlemdir. Denetim noktası oluşturma, tüketicinin sorumluluğundadır ve genellikle belirli bir tüketici grubu bağlamında bölüm başına gerçekleşir. EventProcessorClientiçin bu, bir tüketici grubu ve bölüm bileşimi için işlemcinin olay akışındaki geçerli konumunu izlemesi gerektiği anlamına gelir. Daha fazla bilgi edinmek isterseniz lütfen Event Hubs ürün belgelerindeki denetim noktalarına bakın.

    Bir olay işlemcisi bağlandığında, daha önce o tüketici grubundaki bölümün son işlemcisi tarafından kalıcı hale gelen denetim noktasındaki olayları (varsa) okumaya başlar. Olay işlemcisi bölümdeki olayları okur ve üzerinde işlem yaparken, hem olayları aşağı akış uygulamaları tarafından "tamamlandı" olarak işaretlemek hem de bir olay işlemcisi veya onu barındıran ortamın başarısız olması durumunda dayanıklılık sağlamak için düzenli aralıklarla denetim noktaları oluşturmalıdır. Gerekli olması halinde, bu denetim noktası oluşturma işlemi aracılığıyla daha önceki bir uzaklık belirterek daha önce "tamamlandı" olarak işaretlenmiş olayları yeniden işlemek mümkündür.

  • Bölüm, Olay Hub'ında tutulan sıralı bir olay dizisidir. Bölümler, olay tüketicilerinin gerektirdiği paralellikle ilişkili bir veri düzenleme aracıdır. Azure Event Hubs, her tüketicinin ileti akışının yalnızca belirli bir alt kümesini veya bölümünü okuduğu bölümlenmiş bir tüketici deseni üzerinden ileti akışı sağlar. Yeni olaylar geldikçe dizinin sonuna eklenir. Bölüm sayısı bir Olay Hub'ı oluşturulduğunda belirtilir ve değiştirilemez.

  • Tüketici grubu, Olay Hub'ının tamamının görünümüdür. Tüketici grupları, her biri olay akışının ayrı bir görünümüne sahip olmak ve akışı kendi hızlarında ve kendi konumlarından bağımsız olarak okumak için birden çok kullanan uygulama sağlar. Tüketici grubu başına bir bölümde en fazla 5 eşzamanlı okuyucu olabilir; ancak belirli bir bölüm ve tüketici grubu eşleştirmesi için yalnızca bir etkin tüketici olması önerilir. Her etkin okuyucu, bölümünden tüm olayları alır; Aynı bölümde birden çok okuyucu varsa, yinelenen olayları alırlar.

Daha fazla kavram ve daha ayrıntılı tartışma için bkz. Event Hubs Özellikleri.

İstemci ömrü

EventProcessorClient önbelleğe almak ve uygulamanın ömrü boyunca tekil olarak kullanmak güvenlidir; bu, olaylar düzenli olarak okunurken en iyi uygulamadır. İstemciler, etkin olmayan dönemlerde kullanımı düşük tutmak için çalışan ağ, CPU ve bellek kullanımının verimli yönetiminden sorumludur. Ağ kaynaklarının ve diğer yönetilmeyen nesnelerin düzgün bir şekilde temizlendiğinden emin olmak için işlemcide veya StopProcessing çağrısı StopProcessingAsync yapılması gerekir.

İş parçacığı güvenliği

Tüm istemci örneği yöntemlerinin iş parçacığı açısından güvenli ve birbirinden bağımsız olduğunu garanti ediyoruz (kılavuz). Bu, istemci örneklerini yeniden kullanma önerisinin iş parçacıkları arasında bile her zaman güvenli olmasını sağlar.

ve EventDataBatch gibi EventData veri modeli türleri iş parçacığı açısından güvenli değildir. bunlar iş parçacıkları arasında paylaşılmamalı veya istemci yöntemleriyle eşzamanlı olarak kullanılmamalıdır.

Ek kavramlar

İstemci seçenekleri | Olay işleyicileri | Hataları | işleme Tanılama | Sahte (işlemci) | Sahte oluşturma (istemci türleri)

Örnekler

Olay İşlemcisi istemcisi oluşturma

EventProcessorClient durumunun kalıcılığı için Azure Depolama bloblarına bağımlılığı olduğundan, kullanılacak depolama hesabı ve kapsayıcı için yapılandırılmış olan işlemci için bir BlobContainerClient sağlamanız gerekir. öğesini yapılandırmak için kullanılan kapsayıcının EventProcessorClient mevcut olması gerekir.

EventProcessorClient var olmayan bir kapsayıcı belirtme amacını bilmenin hiçbir yolu olmadığından, kapsayıcıyı örtük olarak oluşturmaz. Bu, hatalı yapılandırılmış bir kapsayıcıya karşı koruma görevi görür ve bu da dolandırıcı bir işlemcinin sahipliği paylaşamamasına ve tüketici grubundaki diğer işlemcilerle karışmasına neden olur.

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

Olay ve hata işleyicilerini yapılandırma

kullanmak EventProcessorClientiçin, olay işleme ve hatalar için işleyiciler sağlanmalıdır. Bu işleyiciler bağımsız olarak kabul edilir ve işleyici kodundaki özel durumların hesaba yüklenmesinden geliştiriciler sorumludur.

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;

İşlemeyi başlatma ve durdurma

açıkça EventProcessorClient başlatıldıktan sonra arka planda işlemesini gerçekleştirir ve açıkça durdurulana kadar bunu yapmaya devam eder. Bu, uygulama kodunun diğer görevleri gerçekleştirmesine izin verirken, gerçekleştirilen başka görev yoksa işleme sırasında işlemin sonlandırılmamasını sağlama sorumluluğunu da getirir.

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

Olay İşlemcisi istemcisiyle Active Directory sorumlusu kullanma

Azure Kimlik kitaplığı, Event Hubs ve Azure Depolama dahil olmak üzere Azure istemci kitaplıkları için kullanılabilecek Azure Active Directory kimlik doğrulaması desteği sağlar.

Bir Active Directory sorumlusunu kullanmak için, Event Hubs istemcisi oluşturulurken kitaplıktan kullanılabilir kimlik bilgilerinden Azure.Identity biri belirtilir. Buna ek olarak, tam Event Hubs ad alanı ve istenen Olay Hub'ının adı Event Hubs bağlantı dizesi yerine sağlanır.

Azure Depolama blob kapsayıcıları ile Active Directory sorumlusu kullanmak için, depolama istemcisi oluşturulurken kapsayıcının tam URL'si sağlanmalıdır. Blob depolamaya erişmek için geçerli URI biçimleri hakkındaki ayrıntılar Kapsayıcıları, Blobları ve Meta Verileri Adlandırma ve Bunlara Başvurma makalesinde bulunabilir.

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

Azure Active Directory'yi Event Hubs ile kullanırken, sorumlunuza rol gibi Azure Event Hubs Data Receiver Event Hubs'tan okumaya izin veren bir rol atanmalıdır. Event Hubs ile Azure Active Directory yetkilendirmesini kullanma hakkında daha fazla bilgi için lütfen ilişkili belgelere bakın.

Azure Active Directory'yi Azure Depolama ile kullanırken, sorumlunuza rol gibi Storage Blob Data Contributor bloblara okuma, yazma ve silme erişimi sağlayan bir rol atanmalıdır. Azure Depolama ile Active Directory Yetkilendirmesi'ni kullanma hakkında daha fazla bilgi için lütfen ilişkili belgelere ve Azure Depolama yetkilendirme örneğine bakın.

Sorun giderme

Ayrıntılı sorun giderme bilgileri için lütfen Event Hubs Sorun Giderme Kılavuzu'na bakın.

Özel durum işleme

Olay İşlemcisi istemci özel durumları

Olay İşlemcisi istemcisi, özel durumlar karşısında dayanıklı olmak için her girişimi gerçekleştirir ve bunu yapmak mümkün olmadığı sürece işlemeye devam etmek için gerekli eylemleri gerçekleştirir. Bunun gerçekleşmesi için geliştiricilerden herhangi bir işlem yapılması gerekmez; yerel olarak işlemcinin davranışının bir parçasıdır.

Geliştiricilerin Olay İşlemcisi istemci işlemleri içinde gerçekleşen özel durumları inceleme ve bunlara tepki verme fırsatı vermek için, olay aracılığıyla ProcessError ortaya çıkarılırlar. Bu olayın bağımsız değişkenleri, özel durum ve gözlemlendiği bağlam hakkında ayrıntılar sunar. Geliştiriciler bu olay işleyicisinin içinden Olay İşlemcisi istemcisinde hatalara yanıt olarak durdurma ve/veya yeniden başlatma gibi normal işlemler gerçekleştirebilir, ancak işlemcinin özel durum davranışını etkilemeyebilir.

Hata işleyicisini uygulamayla ilgili temel bir örnek için lütfen şu örne bakın: Olay İşlemcisi İşleyicileri.

Olay işleyicilerindeki özel durumlar

Olay İşlemcisi istemcisi, geliştiricilerin sağladığı olay işleyicileri içindeki özel durumların önem derecesini anlamak için uygun bağlama sahip olmadığından, hangi eylemlerin onlara makul bir yanıt olacağını varsayamaz. Sonuç olarak, geliştiriciler bloklar ve diğer standart dil yapıları kullanılarak try/catch sağladıkları olay işleyicileri içinde oluşan özel durumlardan sorumlu kabul edilir.

Olay İşlemcisi istemcisi, geliştirici kodundaki özel durumları algılamaya çalışmaz veya bunları açıkça ortaya çıkarmayacak. Sonuçta elde edilen davranış, işlemcinin barındırma ortamına ve olay işleyicisinin çağrıldığı bağlama bağlıdır. Bu farklı senaryolar arasında farklılık gösterebileceğinden, geliştiricilerin olay işleyicilerini savunmalı olarak kodlayıp olası özel durumları hesaba katın.

Günlüğe kaydetme ve tanılama

Olay İşlemcisi istemci kitaplığı, bilgileri yaymak için .NET EventSource kullanarak çeşitli ayrıntı düzeylerinde bilgileri günlüğe kaydetmek için tam olarak izlenmiştir. Günlük her işlem için gerçekleştirilir ve işlemin başlangıç noktasını, tamamlanmasını ve karşılaşılan özel durumları işaretleme desenini izler. İçgörü sunabilecek ek bilgiler de ilişkili işlem bağlamında günlüğe kaydedilir.

Olay İşlemcisi istemci günlükleri, "Azure-Messaging-EventHubs-Processor-EventProcessorClient" adlı kaynağı kabul ederek veya "AzureEventSource" özelliğine sahip tüm kaynakları kabul ederek herhangi bir EventListener kullanıcı tarafından kullanılabilir. Azure istemci kitaplıklarından günlükleri yakalamayı kolaylaştırmak için Event Azure.Core Hubs tarafından kullanılan kitaplık bir AzureEventSourceListenersunar. Daha fazla bilgi için bkz. AzureEventSourceListener kullanarak Event Hubs günlüklerini yakalama.

Olay İşlemcisi kitaplığı, Application Insights veya OpenTelemetry kullanılarak dağıtılmış izleme için de izlenmiştir. Azure.Core Tanılama örneğinde daha fazla bilgi bulabilirsiniz.

Sonraki adımlar

Azure Event Hubs İşlemci kitaplığı, tartışılan senaryoların ötesinde, tüm özellik kümesinden EventProcessorClientyararlanmaya yardımcı olmak için ek senaryolar için destek sunar. Bu senaryolardan bazılarını keşfetmeye yardımcı olmak için Event Hubs İşlemcisi istemci kitaplığı, yaygın senaryolara yönelik bir çizim görevi görecek örneklerden oluşan bir proje sunar. Ayrıntılar için lütfen BENIOKU örneklerine bakın.

Katkıda bulunma

Bu proje, katkı ve önerilere açıktır. Çoğu durumda, sağladığınız katkıyı kullanmamız için bize hak tanıma hakkına sahip olduğunuzu ve bu hakkı bize tanıdığınızı bildiren bir Katkıda Bulunan Lisans Sözleşmesi’ni (CLA) kabul etmeniz gerekir. Ayrıntılar için bkz. https://cla.microsoft.com.

Bir çekme isteği gönderdiğinizde, CLA robotu bir CLA sağlamanız gerekip gerekmediğini otomatik olarak belirler ve çekme isteğini uygun şekilde donatır (örn. etiket, açıklama). Robot tarafından sağlanan yönergeleri izlemeniz yeterlidir. Bu işlemi, CLA’mızı kullanarak tüm depolarda yalnızca bir kere yapmanız gerekir.

Bu proje Microsoft Open Source Code of Conduct (Microsoft Açık Kaynak Kullanım Kuralları) belgesinde listelenen kurallara uygundur. Daha fazla bilgi için Kullanım Kuralları SSS bölümüne bakın veya ek sorular veya yorumlarla iletişime geçin opencode@microsoft.com .

Daha fazla bilgi için lütfen katkıda bulunma kılavuzumuza bakın.

İzlenimler