.NET için Azure Event Grid istemci kitaplığı - sürüm 4.14.1
Azure Event Grid, olay temelli mimarilerle kolayca uygulamalar derlemenize olanak tanır. Event Grid hizmeti, herhangi bir uygulama için herhangi bir kaynaktan herhangi bir hedefe tüm olayların yönlendirilmesi işlemini tam olarak yönetir. Azure hizmet olayları ve özel olaylar doğrudan hizmete yayımlanabilir ve burada olaylar filtrelenebilir ve yerleşik işleyiciler veya özel web kancaları gibi çeşitli alıcılara gönderilebilir. Azure Event Grid hakkında daha fazla bilgi edinmek için: Event Grid nedir?
Azure Event Grid için istemci kitaplığını kullanın:
Event Grid Olayı, Bulut Olayı 1.0 veya özel şemaları kullanarak olayları Event Grid hizmetinde yayımlama
Olay işleyicilerine teslim edilen olayları kullanma
Azure Event Grid konu başlıklarında istemci yayımlama olaylarının kimliğini doğrulamak için SAS belirteçleri oluşturma
Kaynak kodu | Paket (NuGet) | API başvuru belgeleri | Ürün belgeleri | Örnekleri | Geçiş kılavuzu
Başlarken
Paketi yükleme
NuGet'ten istemci kitaplığını yükleyin:
dotnet add package Azure.Messaging.EventGrid
Önkoşullar
Özel Event Grid konusuna veya etki alanına sahip bir Azure aboneliğiniz ve Azure kaynak grubunuz olmalıdır. Event Grid kaynak sağlayıcısını kaydetmek ve Azure portal kullanarak Event Grid konuları oluşturmak için bu adım adım öğreticiyi izleyin. Azure CLI'nınkullanıldığı benzer bir öğretici vardır.
İstemcinin Kimliğini Doğrulama
İstemci kitaplığının bir konu veya etki alanıyla etkileşim kurabilmesi için, Event Grid konusunun ve konunun erişim anahtarı kullanılarak oluşturulabilen bir credential
öğesinin olması gerekirendpoint
.
Event Grid konunuzun uç noktasını Azure Portal'da veya aşağıdaki Azure CLI parçacığını kullanarak bulabilirsiniz.
az eventgrid topic show --name <your-resource-name> --resource-group <your-resource-group-name> --query "endpoint"
Erişim anahtarı portal aracılığıyla veya aşağıdaki Azure CLI kod parçacığı kullanılarak da bulunabilir:
az eventgrid topic key list --name <your-resource-name> --resource-group <your-resource-group-name> --query "key1"
Konu Erişim Anahtarı kullanarak kimlik doğrulaması yapma
Erişim anahtarınızı ve konu uç noktanızı aldıktan sonra yayımcı istemcisini aşağıdaki gibi oluşturabilirsiniz:
EventGridPublisherClient client = new EventGridPublisherClient(
new Uri("<endpoint>"),
new AzureKeyCredential("<access-key>"));
Paylaşılan Erişim İmzası kullanarak kimlik doğrulaması
Event Grid, erişim anahtarınızı paylaşmadan süresi belirli bir süre dolan bir kaynağa erişim sağlamaya olanak tanıyan paylaşılan erişim imzası ile kimlik doğrulamayı da destekler. Genellikle iş akışı, bir uygulamanın SAS dizesini oluşturması ve dizeyi dizeyi kullanacak başka bir uygulamaya devretmesi olabilir. SAS'yi oluşturma:
var builder = new EventGridSasBuilder(new Uri(topicEndpoint), DateTimeOffset.Now.AddHours(1));
var keyCredential = new AzureKeyCredential(topicAccessKey);
string sasToken = builder.GenerateSas(keyCredential);
Tüketici açısından şu şekilde kullanılabilir:
var sasCredential = new AzureSasCredential(sasToken);
EventGridPublisherClient client = new EventGridPublisherClient(
new Uri(topicEndpoint),
sasCredential);
EventGridPublisherClient
ayrıca aracılığıyla EventGridPublisherClientOptions
bir dizi yapılandırma seçeneğini kabul eder. Örneğin, olay verilerini JSON'a seri hale getirmek için kullanılacak özel bir seri hale getirici belirtebilirsiniz.
Azure Active Directory'yi kullanarak kimlik doğrulama
Azure Event Grid, isteklerin kimlik tabanlı kimlik doğrulaması için Azure Active Directory (Azure AD) ile tümleştirme sağlar. Azure AD ile kullanıcılara, gruplara veya uygulamalara Azure Event Grid kaynaklarınıza erişim vermek için rol tabanlı erişim denetimini (RBAC) kullanabilirsiniz. Azure Kimlik kitaplığı, kimlik doğrulaması için kolay Azure Active Directory desteği sağlar.
Azure Active Directory kullanarak bir konuya veya etki alanına olay göndermek için, kimliği doğrulanmış kimliğin atanmış "EventGrid Veri Göndereni" rolüne sahip olması gerekir.
EventGridPublisherClient client = new EventGridPublisherClient(
new Uri(topicEndpoint),
new DefaultAzureCredential());
Önemli kavramlar
Genel Event Grid kavramları hakkında bilgi için: Azure Event Grid kavramları.
EventGridPublisherClient
Yayımcı olayları Event Grid hizmetine gönderir. Microsoft, çeşitli Azure hizmetleri için olaylar yayımlar. kullanarak EventGridPublisherClient
kendi uygulamanızdan olayları yayımlayabilirsiniz.
Olay şemaları
Olay, sistemde gerçekleşen bir şeyi tam olarak açıklayan en küçük bilgi miktarıdır. Event Grid, olayları kodlamak için birden çok şemayı destekler. Özel bir konu veya etki alanı oluşturulduğunda, olayları yayımlarken kullanılacak şemayı belirtirsiniz.
Olay Kılavuz şeması
Konunuzu özel bir şema kullanacak şekilde yapılandırabilirsiniz ancak önceden tanımlanmış Event Grid şemasını kullanmak daha yaygındır. Belirtimlere ve gereksinimlere buradan bakın.
CloudEvents v1.0 şeması
Bir diğer seçenek de CloudEvents v1.0 şemasını kullanmaktır. CloudEvents , olay verilerini ortak bir şekilde tanımlamak için belirtim oluşturan bir Cloud Native Computing Foundation projesidir. CloudEvents'in hizmet özetini burada bulabilirsiniz.
Konunuzun veya etki alanınızın hangi şemayı kullanacak şekilde yapılandırıldığına bakılmaksızın, EventGridPublisherClient
olay yayımlamak için kullanılır. Yayımlamak SendEvents
için veya SendEventsAsync
yöntemini kullanın.
Olay teslimi
Event Grid tarafından tüketicilere teslim edilen olaylar JSON olarak teslim edilir. Teslim edilen tüketicinin türüne bağlı olarak, Event Grid hizmeti tek bir yükün parçası olarak bir veya daha fazla olay teslim edebilir. Olayların işlenmesi, olayın hangi şema olarak teslim edildiğine göre farklı olacaktır. Ancak genel desen aynı kalır:
- Olayları JSON'dan ayrı ayrı olaylara ayrıştırma. Olay şemasına (Event Grid veya CloudEvents) bağlı olarak artık zarfta olayla ilgili temel bilgilere erişebilirsiniz (olay zamanı ve türü gibi tüm olaylar için mevcut olan özellikler).
- Olay verilerini seri durumdan çıkarma.
EventGridEvent
veyaCloudEvent
değeri verüldüğünde, kullanıcı belirli bir türe seri durumdan çıkararak olay yüküne veya verilerine erişmeyi deneyebilir. Verilerin kodunu doğru şekilde çözmek için bu noktada özel bir seri hale getirici sağlayabilirsiniz.
İş 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 | Yanıta | erişme Uzun süre çalışan işlemler | Hataları | işleme Tanılama | Alaycı | İstemci ömrü
Örnekler
- Event Grid olaylarını Event Grid Konusuna yayımlama
- CloudEvents'i Event Grid Konusuna Yayımlama
- Event Grid olaylarını Event Grid Etki Alanına yayımlama
- Olayları Alma ve Seri Durumdan Çıkarma
Event Grid olaylarını Event Grid Konusuna yayımlama
Event Grid'de yayımlama olayları kullanılarak EventGridPublisherClient
gerçekleştirilir. Konu başlığında tek bir olay yayımlamak için sağlanan SendEvent
/SendEventAsync
yöntemi kullanın.
// Add EventGridEvents to a list to publish to the topic
EventGridEvent egEvent =
new EventGridEvent(
"ExampleEventSubject",
"Example.EventType",
"1.0",
"This is the event data");
// Send the event
await client.SendEventAsync(egEvent);
Toplu olay yayımlamak için yöntemini kullanın SendEvents
/SendEventsAsync
.
// Example of a custom ObjectSerializer used to serialize the event payload to JSON
var myCustomDataSerializer = new JsonObjectSerializer(
new JsonSerializerOptions()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
// Add EventGridEvents to a list to publish to the topic
List<EventGridEvent> eventsList = new List<EventGridEvent>
{
// EventGridEvent with custom model serialized to JSON
new EventGridEvent(
"ExampleEventSubject",
"Example.EventType",
"1.0",
new CustomModel() { A = 5, B = true }),
// EventGridEvent with custom model serialized to JSON using a custom serializer
new EventGridEvent(
"ExampleEventSubject",
"Example.EventType",
"1.0",
myCustomDataSerializer.Serialize(new CustomModel() { A = 5, B = true })),
};
// Send the events
await client.SendEventsAsync(eventsList);
CloudEvents'i Event Grid Konusuna Yayımlama
Event Grid'de yayımlama olayları kullanılarak EventGridPublisherClient
gerçekleştirilir. Konu başlığında olayları yayımlamak için sağlanan SendEvents
/SendEventsAsync
yöntemi kullanın.
// Example of a custom ObjectSerializer used to serialize the event payload to JSON
var myCustomDataSerializer = new JsonObjectSerializer(
new JsonSerializerOptions()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
// Add CloudEvents to a list to publish to the topic
List<CloudEvent> eventsList = new List<CloudEvent>
{
// CloudEvent with custom model serialized to JSON
new CloudEvent(
"/cloudevents/example/source",
"Example.EventType",
new CustomModel() { A = 5, B = true }),
// CloudEvent with custom model serialized to JSON using a custom serializer
new CloudEvent(
"/cloudevents/example/source",
"Example.EventType",
myCustomDataSerializer.Serialize(new CustomModel() { A = 5, B = true }),
"application/json"),
// CloudEvents also supports sending binary-valued data
new CloudEvent(
"/cloudevents/example/binarydata",
"Example.EventType",
new BinaryData(Encoding.UTF8.GetBytes("This is treated as binary data")),
"application/octet-stream")};
// Send the events
await client.SendEventsAsync(eventsList);
Event Grid olaylarını Event Grid Etki Alanına yayımlama
Olay etki alanı, aynı uygulamayla ilgili çok sayıda Event Grid konusuna yönelik bir yönetim aracıdır. Bunu, binlerce ayrı konuya sahip olabilecek bir meta konu olarak düşünebilirsiniz. Olay etki alanı oluşturduğunuzda, Event Grid'de bir konu oluşturmuş olmanıza benzer bir yayımlama uç noktası verilir.
Olay Etki Alanındaki herhangi bir konuya olay yayımlamak için, olayları özel bir konu için yaptığınız gibi etki alanının uç noktasına gönderin. Tek fark, olayın teslim edilmesi istediğiniz konuyu belirtmeniz gerektiğidir.
// Add EventGridEvents to a list to publish to the domain
// Don't forget to specify the topic you want the event to be delivered to!
List<EventGridEvent> eventsList = new List<EventGridEvent>
{
new EventGridEvent(
"ExampleEventSubject",
"Example.EventType",
"1.0",
"This is the event data")
{
Topic = "MyTopic"
}
};
// Send the events
await client.SendEventsAsync(eventsList);
CloudEvents göndermek için CloudEvent kaynağı, etki alanı konusu olarak kullanılır:
List<CloudEvent> eventsList = new List<CloudEvent>();
for (int i = 0; i < 10; i++)
{
CloudEvent cloudEvent = new CloudEvent(
// the source is mapped to the domain topic
$"Subject-{i}",
"Microsoft.MockPublisher.TestEvent",
"hello")
{
Id = $"event-{i}",
Time = DateTimeOffset.Now
};
eventsList.Add(cloudEvent);
}
await client.SendEventsAsync(eventsList);
Olayları Alma ve Seri Durumdan Çıkarma
Olay işleyicisi olarak davranan birkaç farklı Azure hizmeti vardır.
Not: Event Grid şemasının olay teslimi için Web Kancaları kullanılıyorsa, Event Grid bu uç noktaya olay göndermeye başlamadan önce Web kancası uç noktanızın sahipliğini kanıtlamanızı gerektirir. Olay aboneliği oluşturulurken Event Grid, aşağıda görüldüğü gibi uç noktanıza bir abonelik doğrulama olayı gönderir. El sıkışmasını tamamlama hakkında daha fazla bilgiyi burada bulabilirsiniz: Web kancası olay teslimi. CloudEvents şeması için hizmet, HTTP seçenekleri yöntemini kullanarak bağlantıyı doğrular. Buradan daha fazla bilgi edinin: CloudEvents doğrulaması.
Olaylar olay işleyicisine teslim edildikten sonra JSON yükünün seri durumdan çıkararak olay listesini oluşturabiliriz.
kullanarak EventGridEvent
:
// Parse the JSON payload into a list of events
EventGridEvent[] egEvents = EventGridEvent.ParseMany(BinaryData.FromStream(httpContent));
kullanarak CloudEvent
:
var bytes = await httpContent.ReadAsByteArrayAsync();
// Parse the JSON payload into a list of events
CloudEvent[] cloudEvents = CloudEvent.ParseMany(new BinaryData(bytes));
Olay verilerinin seri durumdan çıkarılması
Buradan, özelliğinde çağrısı ToObjectFromJson<T>()
yaparak belirli bir türe seri durumdan çıkararak olay verilerine Data
erişebilirsiniz. Doğru türe EventType
seri durumdan çıkarabilmek için özelliği (Type
CloudEvents için) farklı olayları ayırt etmeye yardımcı olur. Özel olay verileri genel yöntemi ToObjectFromJson<T>()
kullanılarak seri durumdan çıkarılmalıdır. Olay verilerinin seri durumdan çıkarılması için özel ObjectSerializer
kabul eden bir uzantı yöntemi ToObject<T>()
de vardır.
foreach (CloudEvent cloudEvent in cloudEvents)
{
switch (cloudEvent.Type)
{
case "Contoso.Items.ItemReceived":
// By default, ToObjectFromJson<T> uses System.Text.Json to deserialize the payload
ContosoItemReceivedEventData itemReceived = cloudEvent.Data.ToObjectFromJson<ContosoItemReceivedEventData>();
Console.WriteLine(itemReceived.ItemSku);
break;
case "MyApp.Models.CustomEventType":
// One can also specify a custom ObjectSerializer as needed to deserialize the payload correctly
TestPayload testPayload = cloudEvent.Data.ToObject<TestPayload>(myCustomSerializer);
Console.WriteLine(testPayload.Name);
break;
case SystemEventNames.StorageBlobDeleted:
// Example for deserializing system events using ToObjectFromJson<T>
StorageBlobDeletedEventData blobDeleted = cloudEvent.Data.ToObjectFromJson<StorageBlobDeletedEventData>();
Console.WriteLine(blobDeleted.BlobType);
break;
}
}
kullanarak TryGetSystemEventData()
:
Çoğunlukla sistem olaylarını bekliyorsanız, tek tek olaylar üzerinde işlem yapmak için desen eşleştirmeyi açmak TryGetSystemEventData()
ve kullanmak daha temiz olabilir. Bir olay bir sistem olayı değilse, yöntem false döndürür ve out parametresi null olur.
Uyarı olarak, daha sonra hizmet ve SDK tarafından sistem olayı olarak eklenen bir EventType değeriyle özel bir olay türü kullanıyorsanız, dönüş değeri TryGetSystemEventData
olarak false
true
değişir. Hizmet tarafından zaten gönderilen ancak henüz SDK'ya eklenmemiş olaylar için kendi özel olaylarınızı önceden oluşturuyorsanız bu durum ortaya çıkabilir. Bu durumda, yükseltmeden sonra kod akışınızın otomatik olarak değişmemesi için özelliğinde Data
genel ToObjectFromJson<T>
yöntemi kullanmak daha iyidir (elbette, kodunuzu özel modelinizin aksine yeni yayımlanan sistem olay modelini kullanacak şekilde değiştirmek isteyebilirsiniz).
foreach (EventGridEvent egEvent in egEvents)
{
// If the event is a system event, TryGetSystemEventData will return the deserialized system event
if (egEvent.TryGetSystemEventData(out object systemEvent))
{
switch (systemEvent)
{
case SubscriptionValidationEventData subscriptionValidated:
Console.WriteLine(subscriptionValidated.ValidationCode);
break;
case StorageBlobCreatedEventData blobCreated:
Console.WriteLine(blobCreated.BlobType);
break;
// Handle any other system event type
default:
Console.WriteLine(egEvent.EventType);
// we can get the raw Json for the event using Data
Console.WriteLine(egEvent.Data.ToString());
break;
}
}
else
{
switch (egEvent.EventType)
{
case "MyApp.Models.CustomEventType":
TestPayload deserializedEventData = egEvent.Data.ToObjectFromJson<TestPayload>();
Console.WriteLine(deserializedEventData.Name);
break;
// Handle any other custom event type
default:
Console.Write(egEvent.EventType);
Console.WriteLine(egEvent.Data.ToString());
break;
}
}
}
Sorun giderme
Hizmet Yanıtları
SendEvents()
hizmetten bir HTTP yanıt kodu döndürür. RequestFailedException
başarısız istekler için bir hizmet yanıtı olarak oluşturulur. Özel durum, hizmetten döndürülen yanıt kodu hakkında bilgi içerir.
Olay Verilerini Seri Durumdan Çıkarma
- Olay verileri geçerli JSON değilse, veya
ParseMany
çağrılırkenParse
birJsonException
oluşturulur. - Olay şeması seri durumdan çıkarılmakta olan türe karşılık gelmiyorsa (örneğin bir EventGridSchema olayında çağrılması
CloudEvent.Parse
), birArgumentException
oluşturulur. - Birden çok olay içeren verilerde çağrılırsa
Parse
, birArgumentException
oluşturulur.ParseMany
yerine burada kullanılmalıdır.
Konsol günlüğünü ayarlama
Ayrıca, hizmette yaptığınız istekleri daha ayrıntılı bir şekilde incelemek isterseniz konsol günlüğünü kolayca etkinleştirebilirsiniz .
Dağıtılmış İzleme
Event Grid kitaplığı, izlemenin kutudan dağıtımını destekler. CloudEvents belirtiminin izleme dağıtma yönergelerine uymak için kitaplık, dağıtılmış izleme etkinleştirildiğinde ve tracestate
ExtensionAttributes
CloudEvent
değerini ayarlar.traceparent
Uygulamanızda dağıtılmış izlemeyi etkinleştirme hakkında daha fazla bilgi edinmek için Azure SDK dağıtılmış izleme belgelerine göz atın.
Kubernetes’te Event Grid
Bu kitaplık, Azure Arc kullanılarak Kubernetes'te test edilmiş ve doğrulanmıştır.
Sonraki adımlar
Event Grid istemci kitaplığının yaygın kullanımları için burada daha fazla https://github.com/Azure/azure-sdk-for-net/blob/Azure.Messaging.EventGrid_4.14.1/sdk/eventgrid/Azure.Messaging.EventGrid/samples bilgi bulabilirsiniz: Event Grid Örnekleri.
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 .
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin