.NET için Azure Service Bus istemci kitaplığı - sürüm 7.13.1
Azure Service Bus, üreticiler ve tüketiciler arasında ileti aracılık yapmak için son derece güvenilir bir hizmet kullanarak zaman uyumsuz mesajlaşma desenlerinden yararlanan uygulamalar oluşturmanıza olanak tanır. Azure Service Bus, istemci ve sunucu arasında esnek, aracılı mesajlaşmanın yanı sıra karmaşık yönlendirme ile yapılandırılmış ilk giriş, ilk çıkış (FIFO) mesajlaşma ve yayımlama/abone olma özellikleri sağlar. Azure Service Bus hakkında daha fazla bilgi edinmek isterseniz şunları gözden geçirmek isteyebilirsiniz: Azure Service Bus nedir?
Azure Service Bus için istemci kitaplığını kullanın:
İş verilerini aktarma: Satış veya satın alma siparişleri, günlükler veya stok hareketleri gibi kalıcı bilgi alışverişi için mesajlaşmadan yararlanın.
Uygulamaları ayırma: Uygulamaların ve hizmetlerin güvenilirliğini ve ölçeklenebilirliğini geliştirerek gönderenleri ve alıcıları aynı anda çevrimiçi olma gereksinimini giderin.
İletilerin nasıl işlendiğini denetleme: Kuyrukları kullanan iletiler için geleneksel rakip tüketicileri destekleyin veya konu başlıklarını ve abonelikleri kullanarak her tüketicinin kendi ileti örneğine izin verin.
Karmaşık iş akışları uygulama: İleti oturumları, ileti sıralama veya ileti erteleme gerektiren senaryoları destekler.
Kaynak kodu | Paket (NuGet) | API başvuru belgeleri | Ürün belgeleri | Geçiş kılavuzu | Sorun giderme kılavuzu
Başlarken
Önkoşullar
Microsoft Azure Aboneliği: Azure Service Bus 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ştururken MSDN abone avantajlarınızı kullanabilirsiniz.
Service Bus ad alanı: Azure Service Bus ile etkileşime geçmek için kullanılabilir bir ad alanınız da olması gerekir. Azure kaynakları oluşturma hakkında bilginiz yoksa, Azure portal kullanarak Service Bus ad alanı oluşturmak için adım adım kılavuzu izlemek isteyebilirsiniz. Burada, Service Bus varlığı 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.
C# 8.0: Azure Service Bus 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
latest
kullanarak 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 herhangi bir çerçeve sürümünü(.NET Core veya .NET framework'ün önceki sürümleri de dahil) yine de hedefleyebilirsiniz. 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# 8.0 kullanmak zorunludur. Diğer dil sürümleri için ayarlama yapmaya karar verirseniz örnekleri yine de çalıştırabilirsiniz.
Azure'da gerekli Service Bus kaynaklarını hızla oluşturmak ve bunlara yönelik bir bağlantı dizesi almak için, aşağıdakilere tıklayarak örnek şablonumuzu dağıtabilirsiniz:
Paketi yükleme
NuGet ile .NET için Azure Service Bus istemci kitaplığını yükleyin:
dotnet add package Azure.Messaging.ServiceBus
İstemcinin kimliğini doğrulama
Service Bus istemci kitaplığının bir kuyruk veya konu başlığıyla etkileşim kurabilmesi için, bu kitaplıkla nasıl bağlantı kurulacağını ve bu kitaplıkla nasıl yetkilendirileceğini anlaması gerekir. Bunu yapmanın en kolay yolu, Service Bus ad alanı oluşturulurken otomatik olarak oluşturulan bir bağlantı dizesi kullanmaktır. Azure'da paylaşılan erişim ilkeleri hakkında bilginiz yoksa, Service Bus bağlantı dizesini almak için adım adım kılavuzu izlemek isteyebilirsiniz.
Bir bağlantı dizeniz olduğunda, istemcinizin kimliğini bu dizeyle doğrulayabilirsiniz.
// Create a ServiceBusClient that will authenticate using a connection string
string connectionString = "<connection_string>";
await using var client = new ServiceBusClient(connectionString);
Azure.Identity kullanarak kimlik doğrulamasını görmek için bu örneği görüntüleyin.
Özel uç noktayla bağlantının nasıl başlatıldığını görmek için bu örneği görüntüleyin.
ASP.NET Core
bir ASP.NET Core uygulamasına bağımlılık olarak eklemek ServiceBusClient
için ASP.NET Core paketi için Azure istemci kitaplığı tümleştirmesini yükleyin.
dotnet add package Microsoft.Extensions.Azure
Ardından istemcisini yöntemine Startup.ConfigureServices
kaydedin:
public void ConfigureServices(IServiceCollection services)
{
services.AddAzureClients(builder =>
{
builder.AddServiceBusClient(Configuration.GetConnectionString("ServiceBus"));
});
services.AddControllers();
}
Önceki kodu kullanmak için bunu yapılandırmanıza ekleyin:
{
"ConnectionStrings": {
"ServiceBus": "<connection_string>"
}
}
Diğer ayrıntılar için bkz. .NET için Azure SDK ile bağımlılık ekleme.
Önemli kavramlar
bir ServiceBusClient
başlatıldıktan sonra, bir Service Bus Ad Alanı içindeki birincil kaynak türleriyle etkileşim kurabilirsiniz. Bu türlerde birden çok kaynak bulunabilir ve gerçek ileti iletiminin gerçekleştiği ad alanı genellikle bir uygulama kapsayıcısı görevi görür:
Kuyruk: İleti gönderme ve alma için izin verir. Genellikle noktadan noktaya iletişim için kullanılır.
Konu: Kuyruklar yerine, Konular yayımlama/abone olma senaryolarına daha uygundur. Konusu adresine gönderilebilir, ancak bunun için birden çok paralel seçeneğinin kullanılabilmesi için bir abonelik gerekir.
Abonelik: Bir Konu başlığından kullanılacak mekanizma. Her abonelik bağımsızdır ve konuya gönderilen her iletinin bir kopyasını alır. Kurallar ve Filtreler, belirli bir abonelik tarafından alınan iletileri uyarlamak için kullanılabilir.
Bu kaynaklar hakkında daha fazla bilgi için bkz. Azure Service Bus nedir?.
Bu kaynaklarla etkileşime geçmek için aşağıdaki SDK kavramları hakkında bilgi sahibi olmanız gerekir:
Service Bus istemcisi, Service Bus istemci kitaplığıyla etkileşim kuran geliştiriciler için birincil arabirimdir. Kitaplıkla tüm etkileşimin gerçekleşeceği ağ geçidi görevi görür.
Service Bus göndereninin kapsamı belirli bir kuyruk veya konu başlığı altındadır ve Service Bus istemcisi kullanılarak oluşturulur. Gönderen, bir kuyruğa veya konuya ileti göndermenizi sağlar. Ayrıca, zamanlama iletilerinin belirtilen bir tarihte teslim için kullanılabilir olmasını sağlar.
Service Bus alıcısının kapsamı belirli bir kuyruk veya abonelikle belirlenmiştir ve Service Bus istemcisi kullanılarak oluşturulur. Alıcı, kuyruktan veya abonelikten ileti almanızı sağlar. Ayrıca iletilerin alındıktan sonra kapatılmasını sağlar. İletileri kapatmanın dört yolu vardır:
- Tamamlandı - iletinin kuyruktan veya konu başlığından silinmesine neden olur.
- Abandon - İletinin diğer alıcılar tarafından alınmasına izin veren iletideki alıcının kilidini serbest bırakır.
- Ertele - iletinin normal yollarla alınmasını engeller. Ertelenmiş iletileri almak için iletinin sıra numarasının korunması gerekir.
- DeadLetter - iletiyi Teslim Edilemeyen İleti kuyruğuna taşır. Bu, iletinin yeniden alınmasını engeller. Teslim Edilemeyen İleti kuyruğundan ileti almak için, Teslim Edilemeyen İleti kuyruğu kapsamına sahip bir alıcı gereklidir.
Service Bus oturum alıcısının kapsamı belirli bir oturum etkinleştirilmiş kuyruk veya abonelik olarak belirlenmiştir ve Service Bus istemcisi kullanılarak oluşturulur. Oturum alıcısı standart alıcıyla neredeyse aynıdır ve fark, oturum yönetimi işlemlerinin yalnızca oturum etkin varlıklar için geçerli olmasıdır. Bu işlemler oturum durumunu alma ve ayarlamanın yanı sıra oturum kilitlerini yenilemeyi içerir.
Service Bus işlemcisinin kapsamı belirli bir kuyruk veya abonelikle belirlenir ve Service Bus istemcisi kullanılarak oluşturulur. ,
ServiceBusProcessor
bir dizi alıcı etrafında bir soyutlama olarak düşünülebilir. Bir ileti alındığında ve bir özel durum oluştuğunda kodun belirtilmesine izin vermek için bir geri çağırma modeli kullanır. İşlenen iletilerin otomatik olarak tamamlanmasını, otomatik ileti kilidi yenilemesini ve kullanıcı tarafından belirtilen olay işleyicilerinin eşzamanlı olarak yürütülmesini sağlar. Özellik kümesi nedeniyle, Service Bus varlıklarından alınan uygulamaları yazmaya yönelik bir araç olmalıdır. ServiceBusReceiver, işlemcinin ServiceBusReceiver'ı doğrudan kullanırken bekleyebileceğiniz ayrıntılı denetimi sağlayamadığı daha karmaşık senaryolar için önerilir.Service Bus oturum işlemcisi, belirli bir oturum etkin kuyruk veya abonelik kapsamındadır ve Service Bus istemcisi kullanılarak oluşturulur. Oturum işlemcisi standart işlemciyle neredeyse aynıdır ve fark, oturum yönetimi işlemlerinin yalnızca oturum etkin varlıklar için geçerli olmasıdır.
Daha fazla kavram ve daha ayrıntılı tartışma için bkz. Service Bus Gelişmiş Özellikleri.
İstemci ömrü
ServiceBusClient
, gönderenleri, alıcıları ve işlemcileri önbelleğe almak ve uygulamanın ömrü boyunca tekil olarak kullanmak için güvenlidir; bu, iletiler düzenli olarak gönderilirken veya alınırken en iyi uygulamadır. 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.
Bu türler atılabilir ve çağrılır DisposeAsync
veya CloseAsync
ağ kaynaklarının ve diğer yönetilmeyen nesnelerin düzgün bir şekilde temizlendiğinden emin olmak için gereklidir. Bir ServiceBusClient
örnek atıldığında, kullanılarak oluşturulan tüm gönderenleri, alıcıları ve işlemcileri otomatik olarak kapatacağını ve temizleyeceğini unutmayın.
İş 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.
Ek kavramlar
İstemci seçenekleri | Tanılama | Alaycı
Örnekler
- İleti gönderme ve alma
- Toplu ileti gönderme
- Toplu ileti alma
- İletiyi tamamlama
- İletiyi bırakma
- İletiyi erteleme
- İletinin teslim edilmediği mektup
- İşlemciyi kullanma
- Azure.Identity ile kimlik doğrulama
- Oturumlarla çalışma
- Daha fazla örnek
İleti gönderme ve alma
İleti gönderme işlemi kullanılarak ServiceBusSender
gerçekleştirilir. Alma işlemi kullanılarak ServiceBusReceiver
gerçekleştirilir.
string connectionString = "<connection_string>";
string queueName = "<queue_name>";
// since ServiceBusClient implements IAsyncDisposable we create it with "await using"
await using var client = new ServiceBusClient(connectionString);
// create the sender
ServiceBusSender sender = client.CreateSender(queueName);
// create a message that we can send. UTF-8 encoding is used when providing a string.
ServiceBusMessage message = new ServiceBusMessage("Hello world!");
// send the message
await sender.SendMessageAsync(message);
// create a receiver that we can use to receive the message
ServiceBusReceiver receiver = client.CreateReceiver(queueName);
// the received message is a different type as it contains some service set properties
ServiceBusReceivedMessage receivedMessage = await receiver.ReceiveMessageAsync();
// get the message body as a string
string body = receivedMessage.Body.ToString();
Console.WriteLine(body);
Toplu ileti gönderme
Aynı anda birkaç ileti göndermenin iki yolu vardır. Bunu yapmanın ilk yolu güvenli toplu işlemi kullanır. Güvenli toplu işleme ile, yöntemini kullanarak TryAdd
toplu işleme birer birer ileti eklemeye çalışmanızı sağlayacak bir ServiceBusMessageBatch
nesne oluşturabilirsiniz. İleti toplu iş içine sığamazsa false TryAdd
döndürür.
// add the messages that we plan to send to a local queue
Queue<ServiceBusMessage> messages = new Queue<ServiceBusMessage>();
messages.Enqueue(new ServiceBusMessage("First message"));
messages.Enqueue(new ServiceBusMessage("Second message"));
messages.Enqueue(new ServiceBusMessage("Third message"));
// create a message batch that we can send
// total number of messages to be sent to the Service Bus queue
int messageCount = messages.Count;
// while all messages are not sent to the Service Bus queue
while (messages.Count > 0)
{
// start a new batch
using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
// add the first message to the batch
if (messageBatch.TryAddMessage(messages.Peek()))
{
// dequeue the message from the .NET queue once the message is added to the batch
messages.Dequeue();
}
else
{
// if the first message can't fit, then it is too large for the batch
throw new Exception($"Message {messageCount - messages.Count} is too large and cannot be sent.");
}
// add as many messages as possible to the current batch
while (messages.Count > 0 && messageBatch.TryAddMessage(messages.Peek()))
{
// dequeue the message from the .NET queue as it has been added to the batch
messages.Dequeue();
}
// now, send the batch
await sender.SendMessagesAsync(messageBatch);
// if there are any remaining messages in the .NET queue, the while loop repeats
}
İkinci yol, bir IEnumerable ServiceBusMessage
kabul eden aşırı yüklemeyi kullanırSendMessagesAsync
. Bu yöntemle, sağlanan tüm iletileri hizmete gönderacağımız tek bir ileti toplu işlemine sığdırmayı deneyeceğiz. İletiler tek bir toplu işleme sığamayacak kadar büyükse, işlem bir özel durum oluşturur.
IList<ServiceBusMessage> messages = new List<ServiceBusMessage>();
messages.Add(new ServiceBusMessage("First"));
messages.Add(new ServiceBusMessage("Second"));
// send the messages
await sender.SendMessagesAsync(messages);
Toplu ileti alma
// create a receiver that we can use to receive the messages
ServiceBusReceiver receiver = client.CreateReceiver(queueName);
// the received message is a different type as it contains some service set properties
// a batch of messages (maximum of 2 in this case) are received
IReadOnlyList<ServiceBusReceivedMessage> receivedMessages = await receiver.ReceiveMessagesAsync(maxMessages: 2);
// go through each of the messages received
foreach (ServiceBusReceivedMessage receivedMessage in receivedMessages)
{
// get the message body as a string
string body = receivedMessage.Body.ToString();
}
İletiyi tamamlama
Kuyruktan veya abonelikten bir iletiyi kaldırmak için yöntemini çağırabiliriz CompleteAsync
.
string connectionString = "<connection_string>";
string queueName = "<queue_name>";
// since ServiceBusClient implements IAsyncDisposable we create it with "await using"
await using var client = new ServiceBusClient(connectionString);
// create the sender
ServiceBusSender sender = client.CreateSender(queueName);
// create a message that we can send
ServiceBusMessage message = new ServiceBusMessage("Hello world!");
// send the message
await sender.SendMessageAsync(message);
// create a receiver that we can use to receive and settle the message
ServiceBusReceiver receiver = client.CreateReceiver(queueName);
// the received message is a different type as it contains some service set properties
ServiceBusReceivedMessage receivedMessage = await receiver.ReceiveMessageAsync();
// complete the message, thereby deleting it from the service
await receiver.CompleteMessageAsync(receivedMessage);
İletiyi bırakma
Bir iletinin bırakılması, alıcının kilidini serbest bırakır ve bu da iletinin bu veya diğer alıcılar tarafından alınmasına olanak tanır.
ServiceBusReceivedMessage receivedMessage = await receiver.ReceiveMessageAsync();
// abandon the message, thereby releasing the lock and allowing it to be received again by this or other receivers
await receiver.AbandonMessageAsync(receivedMessage);
İletiyi erteleme
İletinin ertelenmesi, veya ReceiveMessagesAsync
yöntemleri kullanılarak iletinin ReceiveMessageAsync
yeniden alınmasını engeller. Bunun yerine, ReceiveDeferredMessageAsync
ertelenen iletileri almak için ayrı ReceiveDeferredMessagesAsync
yöntemler vardır.
ServiceBusReceivedMessage receivedMessage = await receiver.ReceiveMessageAsync();
// defer the message, thereby preventing the message from being received again without using
// the received deferred message API.
await receiver.DeferMessageAsync(receivedMessage);
// receive the deferred message by specifying the service set sequence number of the original
// received message
ServiceBusReceivedMessage deferredMessage = await receiver.ReceiveDeferredMessageAsync(receivedMessage.SequenceNumber);
İletinin teslim edilmediği mektup
İletinin yanıtsız olarak yazılması, iletilerin belirli sayıda alındıktan sonra hizmet tarafından otomatik olarak teslim edilmeyecek olması gibi bir temel farkla ertelenmeye benzer. Uygulamalar, gereksinimlerine göre el ile teslim edilemeyen iletileri seçebilir. İleti teslim edilmediğinde, aslında özgün kuyruğun bir alt sırasına taşınır. ana kuyruğun ServiceBusReceiver
oturum etkin olup olmamasına bakılmaksızın, teslim edilemeyen harf alt sırasından ileti almak için kullanıldığını unutmayın.
ServiceBusReceivedMessage receivedMessage = await receiver.ReceiveMessageAsync();
// Dead-letter the message, thereby preventing the message from being received again without receiving from the dead letter queue.
// We can optionally pass a dead letter reason and dead letter description to further describe the reason for dead-lettering the message.
await receiver.DeadLetterMessageAsync(receivedMessage, "sample reason", "sample description");
// receive the dead lettered message with receiver scoped to the dead letter queue.
ServiceBusReceiver dlqReceiver = client.CreateReceiver(queueName, new ServiceBusReceiverOptions
{
SubQueue = SubQueue.DeadLetter
});
ServiceBusReceivedMessage dlqMessage = await dlqReceiver.ReceiveMessageAsync();
// The reason and the description that we specified when dead-lettering the message will be available in the received dead letter message.
string reason = dlqMessage.DeadLetterReason;
string description = dlqMessage.DeadLetterErrorDescription;
Daha fazla bilgi için bkz. ServiceBus teslim edilemeyen ileti kuyruklarına genel bakış.
İşlemciyi Kullanma
bir ServiceBusProcessor
dizi alıcı etrafında bir soyutlama olarak düşünülebilir. Bir ileti alındığında ve özel durum oluştuğunda kodun belirtilmesine izin vermek için bir geri çağırma modeli kullanır. İşlenen iletilerin otomatik olarak tamamlanmasını, otomatik ileti kilidi yenilemesini ve kullanıcı tarafından belirtilen olay işleyicilerinin eşzamanlı yürütülmesini sağlar. Özellik kümesi nedeniyle, Service Bus varlıklarından alınan uygulamaları yazmaya yönelik bir araç olmalıdır. ServiceBusReceiver, işlemcinin ServiceBusReceiver'ı doğrudan kullanırken bekleyebileceğiniz ayrıntılı denetimi sağlayamadığı daha karmaşık senaryolar için önerilir.
string connectionString = "<connection_string>";
string queueName = "<queue_name>";
// since ServiceBusClient implements IAsyncDisposable we create it with "await using"
await using var client = new ServiceBusClient(connectionString);
// create the sender
ServiceBusSender sender = client.CreateSender(queueName);
// create a set of messages that we can send
ServiceBusMessage[] messages = new ServiceBusMessage[]
{
new ServiceBusMessage("First"),
new ServiceBusMessage("Second")
};
// send the message batch
await sender.SendMessagesAsync(messages);
// create the options to use for configuring the processor
var options = new ServiceBusProcessorOptions
{
// By default or when AutoCompleteMessages is set to true, the processor will complete the message after executing the message handler
// Set AutoCompleteMessages to false to [settle messages](/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock) on your own.
// In both cases, if the message handler throws an exception without settling the message, the processor will abandon the message.
AutoCompleteMessages = false,
// I can also allow for multi-threading
MaxConcurrentCalls = 2
};
// create a processor that we can use to process the messages
await using ServiceBusProcessor processor = client.CreateProcessor(queueName, options);
// configure the message and error handler to use
processor.ProcessMessageAsync += MessageHandler;
processor.ProcessErrorAsync += ErrorHandler;
async Task MessageHandler(ProcessMessageEventArgs args)
{
string body = args.Message.Body.ToString();
Console.WriteLine(body);
// we can evaluate application logic and use that to determine how to settle the message.
await args.CompleteMessageAsync(args.Message);
}
Task ErrorHandler(ProcessErrorEventArgs args)
{
// the error source tells me at what point in the processing an error occurred
Console.WriteLine(args.ErrorSource);
// the fully qualified namespace is available
Console.WriteLine(args.FullyQualifiedNamespace);
// as well as the entity path
Console.WriteLine(args.EntityPath);
Console.WriteLine(args.Exception.ToString());
return Task.CompletedTask;
}
// start processing
await processor.StartProcessingAsync();
// since the processing happens in the background, we add a Console.ReadKey to allow the processing to continue until a key is pressed.
Console.ReadKey();
Azure.Identity ile kimlik doğrulama
Azure Kimlik kitaplığı, kimlik doğrulaması için kolay Azure Active Directory desteği sağlar.
// Create a ServiceBusClient that will authenticate through Active Directory
string fullyQualifiedNamespace = "yournamespace.servicebus.windows.net";
await using var client = new ServiceBusClient(fullyQualifiedNamespace, new DefaultAzureCredential());
Oturumlarla Çalışma
Oturumlar , ilgili iletileri gruplandırma mekanizması sağlar. Oturumları kullanmak için oturum etkin bir varlıkla çalışıyor olmanız gerekir.
Sorun giderme
Lütfen Service Bus Sorun Giderme Kılavuzu'na bakın.
Sonraki adımlar
Azure Service Bus istemci kitaplığı, açıklanan giriş senaryolarının ötesinde, Azure Service Bus hizmetinin tam özellik kümesinden yararlanmaya yardımcı olmak için ek senaryolar için destek sunar. Service Bus istemci kitaplığı, bu senaryolardan bazılarını keşfetmeye yardımcı olmak için yaygın senaryolar için 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.