CommunitySchreiben & Editierengithub.com

Azure Event Grid SDK für .NET

Clientbibliothek zum Veröffentlichen und Empfangen von Ereignissen mit Azure Event Grid. Geeignet für ereignisgesteuerte Architekturen, Pub/Sub-Messaging, CloudEvents und EventGridEvents.

Was ist Azure Event Grid SDK für .NET?

Das `Azure.Messaging.EventGrid` SDK für .NET ermöglicht Entwicklern das Veröffentlichen und Empfangen von Ereignissen mit Azure Event Grid. Es unterstützt sowohl das native Event Grid-Schema als auch den CloudEvents 1.0-Standard, der die Interoperabilität zwischen Plattformen fördert. Das SDK bietet zwei Hauptmodelle: Push-Zustellung für Topics/Domains über den `EventGridPublisherClient` und Pull-Zustellung für Namespaces über `EventGridSenderClient` und `EventGridReceiverClient`. Letzteres ermöglicht die manuelle Bestätigung, Freigabe und Ablehnung von Ereignissen. Die Bibliothek integriert sich nahtlos in Azure Functions für serverlose Ereignisverarbeitung und unterstützt moderne Authentifizierungsmethoden wie Microsoft Entra ID (vorher Azure Active Directory) und Shared Access Signatures (SAS). Entwickler können sowohl einzelne als auch Batch-Ereignisse senden, benutzerdefinierte Serialisierung verwenden und erhalten klare Richtlinien für Fehlerbehandlung, Failover-Muster und bewährte Verfahren. Das SDK ist ideal für die Implementierung ereignisgesteuerter Anwendungen und Pub/Sub-Architekturen in Microsoft Azure.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/microsoft/agent-skills/tree/main/.github/plugins/azure-sdk-dotnet/skills/azure-eventgrid-dotnet

Installed? Explore more Schreiben & Editieren skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Azure.Messaging.EventGrid (.NET)

Clientbibliothek zum Veröffentlichen von Ereignissen in Azure Event Grid-Themen, -Domänen und -Namespaces.

Installation

# Für Themen und Domänen (Push-Zustellung)
dotnet add package Azure.Messaging.EventGrid

# Für Namespaces (Pull-Zustellung)
dotnet add package Azure.Messaging.EventGrid.Namespaces

# Für CloudNative CloudEvents-Interop
dotnet add package Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents

Aktuelle Version: 4.28.0 (stabil)

Umgebungsvariablen

EVENT_GRID_TOPIC_ENDPOINT=https://<topic-name>.<region>.eventgrid.azure.net/api/events  # Erforderlich: Endpunkt des Event Grid-Themas oder der Domäne
EVENT_GRID_TOPIC_KEY=<access-key>  # Nur erforderlich bei AzureKeyCredential-Authentifizierung
EVENT_GRID_NAMESPACE_ENDPOINT=https://<namespace>.<region>.eventgrid.azure.net  # Optional: Endpunkt des Event Grid-Namespace
EVENT_GRID_TOPIC_NAME=<topic-name>  # Erforderlich: Name des Event Grid-Themas
EVENT_GRID_SUBSCRIPTION_NAME=<subscription-name>  # Optional: Name des Event Grid-Abonnements
AZURE_TOKEN_CREDENTIALS=prod  # Nur erforderlich, wenn DefaultAzureCredential in der Produktion verwendet wird

Client-Hierarchie

Push-Zustellung (Themen/Domänen)
└── EventGridPublisherClient
    ├── SendEventAsync(EventGridEvent)
    ├── SendEventsAsync(IEnumerable<EventGridEvent>)
    ├── SendEventAsync(CloudEvent)
    └── SendEventsAsync(IEnumerable<CloudEvent>)

Pull-Zustellung (Namespaces)
├── EventGridSenderClient
│   └── SendAsync(CloudEvent)
└── EventGridReceiverClient
    ├── ReceiveAsync()
    ├── AcknowledgeAsync()
    ├── ReleaseAsync()
    └── RejectAsync()

Authentifizierung

API-Schlüssel-Authentifizierung

using Azure;
using Azure.Messaging.EventGrid;

EventGridPublisherClient client = new(
    new Uri("https://mytopic.eastus-1.eventgrid.azure.net/api/events"),
    new AzureKeyCredential("<access-key>"));

Microsoft Entra-Tokenanmeldeinformationen

using Azure.Identity;
using Azure.Messaging.EventGrid;

// Lokale Entwicklung: DefaultAzureCredential. Produktion: Setzen Sie AZURE_TOKEN_CREDENTIALS=prod oder AZURE_TOKEN_CREDENTIALS=<specific_credential>
var credential = new DefaultAzureCredential(
    DefaultAzureCredential.DefaultEnvironmentVariableName
);
// Oder verwenden Sie in der Produktion direkt eine bestimmte Anmeldeinformation:
// Siehe https://learn.microsoft.com/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#credential-classes
// var credential = new ManagedIdentityCredential();
EventGridPublisherClient client = new(
    new Uri("https://mytopic.eastus-1.eventgrid.azure.net/api/events"),
    credential);

SAS-Token-Authentifizierung

string sasToken = EventGridPublisherClient.BuildSharedAccessSignature(
    new Uri(topicEndpoint),
    DateTimeOffset.UtcNow.AddHours(1),
    new AzureKeyCredential(topicKey));

var sasCredential = new AzureSasCredential(sasToken);
EventGridPublisherClient client = new(
    new Uri(topicEndpoint),
    sasCredential);

Veröffentlichen von Ereignissen

EventGridEvent-Schema

EventGridPublisherClient client = new(
    new Uri(topicEndpoint),
    new AzureKeyCredential(topicKey));

// Einzelnes Ereignis
EventGridEvent egEvent = new(
    subject: "orders/12345",
    eventType: "Order.Created",
    dataVersion: "1.0",
    data: new { OrderId = "12345", Amount = 99.99 });

await client.SendEventAsync(egEvent);

// Batch von Ereignissen
List<EventGridEvent> events = new()
{
    new EventGridEvent(
        subject: "orders/12345",
        eventType: "Order.Created",
        dataVersion: "1.0",
        data: new OrderData { OrderId = "12345", Amount = 99.99 }),
    new EventGridEvent(
        subject: "orders/12346",
        eventType: "Order.Created",
        dataVersion: "1.0",
        data: new OrderData { OrderId = "12346", Amount = 149.99 })
};

await client.SendEventsAsync(events);

CloudEvent-Schema

CloudEvent cloudEvent = new(
    source: "/orders/system",
    type: "Order.Created",
    data: new { OrderId = "12345", Amount = 99.99 });

cloudEvent.Subject = "orders/12345";
cloudEvent.Id = Guid.NewGuid().ToString();
cloudEvent.Time = DateTimeOffset.UtcNow;

await client.SendEventAsync(cloudEvent);

// Batch von CloudEvents
List<CloudEvent> cloudEvents = new()
{
    new CloudEvent("/orders", "Order.Created", new { OrderId = "1" }),
    new CloudEvent("/orders", "Order.Updated", new { OrderId = "2" })
};

await client.SendEventsAsync(cloudEvents);

Veröffentlichen in einer Event Grid-Domäne

// Ereignisse müssen die Topic-Eigenschaft für das Domänen-Routing angeben
List<EventGridEvent> events = new()
{
    new EventGridEvent(
        subject: "orders/12345",
        eventType: "Order.Created",
        dataVersion: "1.0",
        data: new { OrderId = "12345" })
    {
        Topic = "orders-topic"  // Name des Domänen-Themas
    },
    new EventGridEvent(
        subject: "inventory/item-1",
        eventType: "Inventory.Updated",
        dataVersion: "1.0",
        data: new { ItemId = "item-1" })
    {
        Topic = "inventory-topic"
    }
};

await client.SendEventsAsync(events);

Benutzerdefinierte Serialisierung

using System.Text.Json;

var serializerOptions = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};

var customSerializer = new JsonObjectSerializer(serializerOptions);

EventGridEvent egEvent = new(
    subject: "orders/12345",
    eventType: "Order.Created",
    dataVersion: "1.0",
    data: customSerializer.Serialize(new OrderData { OrderId = "12345" }));

await client.SendEventAsync(egEvent);

Pull-Zustellung (Namespaces)

Ereignisse an das Namespace-Thema senden

using Azure;
using Azure.Messaging;
using Azure.Messaging.EventGrid.Namespaces;

var senderClient = new EventGridSenderClient(
    new Uri(namespaceEndpoint),
    topicName,
    new AzureKeyCredential(topicKey));

// Einzelnes Ereignis senden
CloudEvent cloudEvent = new("employee_source", "Employee.Created", 
    new { Name = "John", Age = 30 });
await senderClient.SendAsync(cloudEvent);

// Batch senden
await senderClient.SendAsync(new[]
{
    new CloudEvent("source", "type", new { Name = "Alice" }),
    new CloudEvent("source", "type", new { Name = "Bob" })
});

Ereignisse empfangen und verarbeiten

var receiverClient = new EventGridReceiverClient(
    new Uri(namespaceEndpoint),
    topicName,
    subscriptionName,
    new AzureKeyCredential(topicKey));

// Ereignisse empfangen
ReceiveResult result = await receiverClient.ReceiveAsync(maxEvents: 10);

List<string> lockTokensToAck = new();
List<string> lockTokensToRelease = new();

foreach (ReceiveDetails detail in result.Details)
{
    CloudEvent cloudEvent = detail.Event;
    string lockToken = detail.BrokerProperties.LockToken;
    
    try
    {
        // Ereignis verarbeiten
        Console.WriteLine($"Ereignis: {cloudEvent.Type}, Daten: {cloudEvent.Data}");
        lockTokensToAck.Add(lockToken);
    }
    catch (Exception)
    {
        // Für wiederholte Verarbeitung freigeben
        lockTokensToRelease.Add(lockToken);
    }
}

// Erfolgreich verarbeitete Ereignisse bestätigen
if (lockTokensToAck.Any())
{
    await receiverClient.AcknowledgeAsync(lockTokensToAck);
}

// Ereignisse für Wiederholung freigeben
if (lockTokensToRelease.Any())
{
    await receiverClient.ReleaseAsync(lockTokensToRelease);
}

Ereignisse ablehnen (Dead Letter)

// Ereignisse, die nicht verarbeitet werden können, ablehnen
await receiverClient.RejectAsync(new[] { lockToken });

Empfangen von Ereignissen (Azure Functions)

EventGridEvent-Trigger

using Azure.Messaging.EventGrid;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.EventGrid;

public static class EventGridFunction
{
    [FunctionName("ProcessEventGridEvent")]
    public static void Run(
        [EventGridTrigger] EventGridEvent eventGridEvent,
        ILogger log)
    {
        log.LogInformation($"Ereignistyp: {eventGridEvent.EventType}");
        log.LogInformation($"Betreff: {eventGridEvent.Subject}");
        log.LogInformation($"Daten: {eventGridEvent.Data}");
    }
}

CloudEvent-Trigger

using Azure.Messaging;
using Microsoft.Azure.Functions.Worker;

public class CloudEventFunction
{
    [Function("ProcessCloudEvent")]
    public void Run(
        [EventGridTrigger] CloudEvent cloudEvent,
        FunctionContext context)
    {
        var logger = context.GetLogger("ProcessCloudEvent");
        logger.LogInformation($"Ereignistyp: {cloudEvent.Type}");
        logger.LogInformation($"Quelle: {cloudEvent.Source}");
        logger.LogInformation($"Daten: {cloudEvent.Data}");
    }
}

Ereignisse parsen

EventGridEvent parsen

// Aus JSON-String
string json = "..."; // Event Grid-Webhook-Payload
EventGridEvent[] events = EventGridEvent.ParseMany(BinaryData.FromString(json));

foreach (EventGridEvent egEvent in events)
{
    if (egEvent.TryGetSystemEventData(out object systemEvent))
    {
        // Systemereignis verarbeiten
        switch (systemEvent)
        {
            case StorageBlobCreatedEventData blobCreated:
                Console.WriteLine($"Blob erstellt: {blobCreated.Url}");
                break;
        }
    }
    else
    {
        // Benutzerdefiniertes Ereignis verarbeiten
        var customData = egEvent.Data.ToObjectFromJson<MyCustomData>();
    }
}

CloudEvent parsen

CloudEvent[] cloudEvents = CloudEvent.ParseMany(BinaryData.FromString(json));

foreach (CloudEvent cloudEvent in cloudEvents)
{
    var data = cloudEvent.Data.ToObjectFromJson<MyEventData>();
    Console.WriteLine($"Typ: {cloudEvent.Type}, Daten: {data}");
}

Systemereignisse

// Häufige Systemereignistypen
using Azure.Messaging.EventGrid.SystemEvents;

// Speicherereignisse
StorageBlobCreatedEventData blobCreated;
StorageBlobDeletedEventData blobDeleted;

// Ressourcenereignisse
ResourceWriteSuccessEventData resourceCreated;
ResourceDeleteSuccessEventData resourceDeleted;

// App Service-Ereignisse
WebAppUpdatedEventData webAppUpdated;

// Container Registry-Ereignisse
ContainerRegistryImagePushedEventData imagePushed;

// IoT Hub-Ereignisse
IotHubDeviceCreatedEventData deviceCreated;

Referenz der Schlüsseltypen

TypZweck
EventGridPublisherClientVeröffentlichen in Themen/Domänen
EventGridSenderClientSenden an Namespace-Themen
EventGridReceiverClientEmpfangen von Namespace-Abonnements
EventGridEventNative Event Grid-Schema
CloudEventCloudEvents 1.0-Schema
ReceiveResultPull-Zustellungsantwort
ReceiveDetailsEreignis mit Broker-Eigenschaften
BrokerPropertiesSperr-Token, Zustellungsanzahl

Vergleich der Ereignisschemata

FunktionEventGridEventCloudEvent
StandardAzure-spezifischCNCF-Standard
Erforderliche Feldersubject, eventType, dataVersion, datasource, type
ErweiterbarkeitEingeschränktErweiterungsattribute
InteroperabilitätNur AzurePlattformübergreifend

Bewährte Methoden

  1. CloudEvents verwenden – Bevorzugen Sie CloudEvents für neue Implementierungen (Industriestandard)
  2. Ereignisse bündeln – Senden Sie mehrere Ereignisse in einem Aufruf für mehr Effizienz
  3. Entra ID verwenden – Bevorzugen Sie verwaltete Identitäten gegenüber Zugriffsschlüsseln
  4. Idempotente Handler – Ereignisse können mehrfach zugestellt werden
  5. Ereignis-TTL festlegen – Konfigurieren Sie die Gültigkeitsdauer für Namespace-Ereignisse
  6. Partielle Fehler behandeln – Ereignisse einzeln bestätigen/freigeben
  7. Dead-Letter verwenden – Konfigurieren Sie Dead-Letter für fehlgeschlagene Ereignisse
  8. Schemata validieren – Validieren Sie Ereignisdaten vor der Verarbeitung

Fehlerbehandlung

using Azure;

try
{
    await client.SendEventAsync(cloudEvent);
}
catch (RequestFailedException ex) when (ex.Status == 401)
{
    Console.WriteLine("Authentifizierung fehlgeschlagen - Anmeldeinformationen prüfen");
}
catch (RequestFailedException ex) when (ex.Status == 403)
{
    Console.WriteLine("Autorisierung fehlgeschlagen - RBAC-Berechtigungen prüfen");
}
catch (RequestFailedException ex) when (ex.Status == 413)
{
    Console.WriteLine("Payload zu groß - max. 1 MB pro Ereignis, 1 MB Gesamt-Batch");
}
catch (RequestFailedException ex)
{
    Console.WriteLine($"Event Grid-Fehler: {ex.Status} - {ex.Message}");
}

Failover-Muster

try
{
    var primaryClient = new EventGridPublisherClient(primaryUri, primaryKey);
    await primaryClient.SendEventsAsync(events);
}
catch (RequestFailedException)
{
    // Failover in die sekundäre Region
    var secondaryClient = new EventGridPublisherClient(secondaryUri, secondaryKey);
    await secondaryClient.SendEventsAsync(events);
}

Verwandte SDKs

SDKZweckInstallation
Azure.Messaging.EventGridThemen/Domänen (dieses SDK)dotnet add package Azure.Messaging.EventGrid
Azure.Messaging.EventGrid.NamespacesPull-Zustellungdotnet add package Azure.Messaging.EventGrid.Namespaces
Azure.IdentityAuthentifizierungdotnet add package Azure.Identity
Microsoft.Azure.WebJobs.Extensions.EventGridAzure Functions-Triggerdotnet add package Microsoft.Azure.WebJobs.Extensions.EventGrid

Referenzlinks

RessourceURL
NuGet-Pakethttps://www.nuget.org/packages/Azure.Messaging.EventGrid
API-Referenzhttps://learn.microsoft.com/dotnet/api/azure.messaging.eventgrid
Schnellstarthttps://learn.microsoft.com/azure/event-grid/custom-event-quickstart
Pull-Zustellunghttps://learn.microsoft.com/azure/event-grid/pull-delivery-overview
GitHub-Quellehttps://github.com/Azure/azure-sdk-for-net/tree/main/sdk/eventgrid/Azure.Messaging.EventGrid

Individual skills in this repo

This repo contains 12 individual skills — each has its own dedicated page.

microsoft/azure-ai-agents-persistent-dotnet

Azure AI Agents Persistent SDK for .NET. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Use for agent CRUD, conversation threads, streaming responses, function calling, file search, and code interpreter. Triggers: "PersistentAgentsClient", "persistent agents", "agent threads", "agent runs", "streaming agents", "function calling agents .NET".

microsoft/azure-ai-document-intelligence-dotnet

Azure AI Document Intelligence SDK for .NET. Extract text, tables, and structured data from documents using prebuilt and custom models. Use for invoice processing, receipt extraction, ID document analysis, and custom document models. Triggers: "Document Intelligence", "DocumentIntelligenceClient", "form recognizer", "invoice extraction", "receipt OCR", "document analysis .NET".

microsoft/azure-ai-openai-dotnet

Azure OpenAI SDK for .NET. Client library for Azure OpenAI and OpenAI services. Use for chat completions, embeddings, image generation, audio transcription, and assistants. Triggers: "Azure OpenAI", "AzureOpenAIClient", "ChatClient", "chat completions .NET", "GPT-4", "embeddings", "DALL-E", "Whisper", "OpenAI .NET".

microsoft/azure-ai-projects-dotnet

Azure AI Projects SDK for .NET. High-level client for Azure AI Foundry projects including agents, connections, datasets, deployments, evaluations, and indexes. Use for AI Foundry project management, versioned agents, and orchestration. Triggers: "AI Projects", "AIProjectClient", "Foundry project", "versioned agents", "evaluations", "datasets", "connections", "deployments .NET".

microsoft/azure-ai-voicelive-dotnet

Azure AI Voice Live SDK for .NET. Build real-time voice AI applications with bidirectional WebSocket communication. Use for voice assistants, conversational AI, real-time speech-to-speech, and voice-enabled chatbots. Triggers: "voice live", "real-time voice", "VoiceLiveClient", "VoiceLiveSession", "voice assistant .NET", "bidirectional audio", "speech-to-speech".

microsoft/azure-eventhub-dotnet

Azure Event Hubs SDK for .NET. Use for high-throughput event streaming: sending events (EventHubProducerClient, EventHubBufferedProducerClient), receiving events (EventProcessorClient with checkpointing), partition management, and real-time data ingestion. Triggers: "Event Hubs", "event streaming", "EventHubProducerClient", "EventProcessorClient", "send events", "receive events", "checkpointing", "partition".

microsoft/azure-identity-dotnet

Azure Identity library for .NET. Authentication library for Azure SDK clients using Microsoft Entra ID. Use for DefaultAzureCredential, managed identity, service principals, and developer credentials. Triggers: "Azure Identity", "DefaultAzureCredential", "ManagedIdentityCredential", "ClientSecretCredential", "authentication .NET", "Azure auth", "credential chain".

microsoft/azure-kusto-graph

Build and query Kusto graphs from natural language. Covers transient graphs (make-graph), persistent graph models/snapshots, pattern matching (graph-match), shortest paths, connected components, and graph-to-table export. Generates the edges-first thinking: define edges, define node lookups, union, make-graph. WHEN: make-graph, graph-match, graph-shortest-paths, graph-to-table, graph-mark-components, persistent graph, graph model, graph snapshot, build a graph from data, find paths between nodes, pattern matching in graph, connected components, transient graph, Kusto graph, KQL graph.

microsoft/azure-kusto-irql

Compose IRQL (Incident Response Query Language) queries for Kusto cybersecurity investigations. Translates natural language hunting questions into composable IRQL pipelines using Get_*, Extract_*, and Enrich_* functions. WHEN: IRQL query, security hunt, threat hunting KQL, incident response query, compose hunting pipeline, failed logins, phishing investigation, lateral movement, process execution, file creation events.

microsoft/azure-kusto-irql-graph

Apply IRQL graph functions to KQL or IRQL query results for Kusto Explorer visualization. Generates Lift_To_Graph mappings and composes Graph_Render_View, Graph_Fold_By_Property, Extract_Node_*, Enrich_Node_*, and Enrich_Graph_* calls. Accepts a supplied query or limited basic natural-language source request; it is not a general natural-language-to-KQL/IRQL skill. WHEN: Lift_To_Graph, Graph_Render_View, Graph_Fold_By_Property, IRQL graph enrichment, graph mapping for existing query results, icon-decorated graph, fold graph nodes. Use azure-kusto-graph for native make-graph analysis, graph-match, shortest paths, components, or persistent graphs.

microsoft/azure-local

Plan, deploy, operate, and troubleshoot Azure Local (formerly Azure Stack HCI): sizing and prerequisites, Arc registration, lifecycle updates, workloads (Azure Local VMs, AKS on Azure Local, images, disks, logical networks), SDN and network security, and failure triage — starting read-only and confirming before risky changes. WHEN: Azure Local, Azure Stack HCI, Arc resource bridge, custom location, Azure Local VM, Arc VM, AKS on Azure Local, AKS hybrid, SDN, Lifecycle Manager, Azure Local update, disconnected site.

microsoft/azure-local-multi-rack

Plan, deploy, operate, and troubleshoot multi-rack (rack scale) deployments of Azure Local — preintegrated racks scaling to hundreds of machines, built on Network Fabric Controller, Cluster Manager, SAN storage, and managed network fabric. Use for the Microsoft.NetworkCloud and Microsoft.ManagedNetworkFabric control plane. NOT for standard 1-16 node Azure Local, and NOT for rack-aware clusters (two racks as availability zones, up to 8 nodes, synchronous replication) — those are standard scale. WHEN: multi-rack, rack scale Azure Local, aggregation rack, compute rack, Network Fabric Controller, NFC, Cluster Manager, network fabric, isolation domain, az networkcloud, az networkfabric, multi-rack logical network, multi-rack Arc VM.

Verwandte Skills