CommunityRedacción y edicióngithub.com

microsoft/azure-eventgrid-dotnet

SDK de Azure Event Grid para .NET. Biblioteca cliente para publicar y consumir eventos con Azure Event Grid. Ideal para arquitecturas basadas en eventos, mensajería pub/sub, CloudEvents y EventGridEvents. Disparadores: "Event Grid", "EventGridPublisherClient", "CloudEvent", "EventGridEvent", "publish events .NET", "event-driven", "pub/sub".

¿Qué es azure-eventgrid-dotnet?

Esta habilidad te permite interactuar con Azure Event Grid desde aplicaciones .NET, publicando y consumiendo eventos en arquitecturas desacopladas. Soporta tanto el envío push a temas y dominios (con EventGridPublisherClient) como la recepción pull desde espacios de nombres (con EventGridSenderClient y EventGridReceiverClient). Es compatible con los esquemas EventGridEvent (nativo de Azure) y CloudEvent (estándar CNCF), ofreciendo autenticación mediante clave de API, tokens SAS o credenciales de Microsoft Entra (DefaultAzureCredential, ManagedIdentityCredential). Incluye funciones para publicación por lotes, serialización personalizada, manejo de eventos duplicados, failover entre regiones e integración con Azure Functions mediante desencadenadores EventGridTrigger. Es ideal para desarrolladores que construyen sistemas basados en eventos en Azure con .NET.

Compatible con~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 Redacción y edición skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Azure.Messaging.EventGrid (.NET)

Biblioteca cliente para publicar eventos en temas, dominios y espacios de nombres de Azure Event Grid.

Instalación

# Para temas y dominios (entrega push)
dotnet add package Azure.Messaging.EventGrid

# Para espacios de nombres (entrega pull)
dotnet add package Azure.Messaging.EventGrid.Namespaces

# Para interoperabilidad con CloudEvents nativos de la nube
dotnet add package Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents

Versión actual: 4.28.0 (estable)

Variables de Entorno

EVENT_GRID_TOPIC_ENDPOINT=https://<nombre-tema>.<region>.eventgrid.azure.net/api/events  # Obligatorio: endpoint del tema o dominio de Event Grid
EVENT_GRID_TOPIC_KEY=<clave-acceso>  # Solo necesario para autenticación con AzureKeyCredential
EVENT_GRID_NAMESPACE_ENDPOINT=https://<espacio-nombres>.<region>.eventgrid.azure.net  # Opcional: endpoint del espacio de nombres de Event Grid
EVENT_GRID_TOPIC_NAME=<nombre-tema>  # Obligatorio: nombre del tema de Event Grid
EVENT_GRID_SUBSCRIPTION_NAME=<nombre-suscripción>  # Opcional: nombre de la suscripción de Event Grid
AZURE_TOKEN_CREDENTIALS=prod  # Obligatorio solo si se usa DefaultAzureCredential en producción

Jerarquía de Clientes

Entrega Push (Temas/Dominios)
└── EventGridPublisherClient
    ├── SendEventAsync(EventGridEvent)
    ├── SendEventsAsync(IEnumerable<EventGridEvent>)
    ├── SendEventAsync(CloudEvent)
    └── SendEventsAsync(IEnumerable<CloudEvent>)

Entrega Pull (Espacios de Nombres)
├── EventGridSenderClient
│   └── SendAsync(CloudEvent)
└── EventGridReceiverClient
    ├── ReceiveAsync()
    ├── AcknowledgeAsync()
    ├── ReleaseAsync()
    └── RejectAsync()

Autenticación

Autenticación con Clave de API

using Azure;
using Azure.Messaging.EventGrid;

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

Credencial de Token de Microsoft Entra

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

// Desarrollo local: DefaultAzureCredential. Producción: configurar AZURE_TOKEN_CREDENTIALS=prod o AZURE_TOKEN_CREDENTIALS=<credencial_especifica>
var credential = new DefaultAzureCredential(
    DefaultAzureCredential.DefaultEnvironmentVariableName
);
// O usar una credencial específica directamente en producción:
// Ver 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);

Autenticación con Token SAS

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

Publicación de Eventos

Esquema EventGridEvent

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

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

await client.SendEventAsync(egEvent);

// Lote de eventos
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);

Esquema CloudEvent

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

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

Publicación en un Dominio de Event Grid

// Los eventos deben especificar la propiedad Topic para el enrutamiento en el dominio
List<EventGridEvent> events = new()
{
    new EventGridEvent(
        subject: "orders/12345",
        eventType: "Order.Created",
        dataVersion: "1.0",
        data: new { OrderId = "12345" })
    {
        Topic = "orders-topic"  // Nombre del tema del dominio
    },
    new EventGridEvent(
        subject: "inventory/item-1",
        eventType: "Inventory.Updated",
        dataVersion: "1.0",
        data: new { ItemId = "item-1" })
    {
        Topic = "inventory-topic"
    }
};

await client.SendEventsAsync(events);

Serialización Personalizada

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

Entrega Pull (Espacios de Nombres)

Envío de Eventos a un Tema del Espacio de Nombres

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

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

// Enviar evento único
CloudEvent cloudEvent = new("employee_source", "Employee.Created", 
    new { Name = "John", Age = 30 });
await senderClient.SendAsync(cloudEvent);

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

Recepción y Procesamiento de Eventos

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

// Recibir eventos
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
    {
        // Procesar el evento
        Console.WriteLine($"Evento: {cloudEvent.Type}, Datos: {cloudEvent.Data}");
        lockTokensToAck.Add(lockToken);
    }
    catch (Exception)
    {
        // Liberar para reintento
        lockTokensToRelease.Add(lockToken);
    }
}

// Confirmar eventos procesados correctamente
if (lockTokensToAck.Any())
{
    await receiverClient.AcknowledgeAsync(lockTokensToAck);
}

// Liberar eventos para reintento
if (lockTokensToRelease.Any())
{
    await receiverClient.ReleaseAsync(lockTokensToRelease);
}

Rechazo de Eventos (Dead Letter)

// Rechazar eventos que no pueden ser procesados
await receiverClient.RejectAsync(new[] { lockToken });

Consumo de Eventos (Azure Functions)

Desencadenador EventGridEvent

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($"Tipo de evento: {eventGridEvent.EventType}");
        log.LogInformation($"Asunto: {eventGridEvent.Subject}");
        log.LogInformation($"Datos: {eventGridEvent.Data}");
    }
}

Desencadenador CloudEvent

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($"Tipo de evento: {cloudEvent.Type}");
        logger.LogInformation($"Fuente: {cloudEvent.Source}");
        logger.LogInformation($"Datos: {cloudEvent.Data}");
    }
}

Análisis de Eventos

Analizar EventGridEvent

// Desde cadena JSON
string json = "..."; // Carga útil del webhook de Event Grid
EventGridEvent[] events = EventGridEvent.ParseMany(BinaryData.FromString(json));

foreach (EventGridEvent egEvent in events)
{
    if (egEvent.TryGetSystemEventData(out object systemEvent))
    {
        // Manejar evento del sistema
        switch (systemEvent)
        {
            case StorageBlobCreatedEventData blobCreated:
                Console.WriteLine($"Blob creado: {blobCreated.Url}");
                break;
        }
    }
    else
    {
        // Manejar evento personalizado
        var customData = egEvent.Data.ToObjectFromJson<MyCustomData>();
    }
}

Analizar CloudEvent

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

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

Eventos del Sistema

// Tipos comunes de eventos del sistema
using Azure.Messaging.EventGrid.SystemEvents;

// Eventos de Storage
StorageBlobCreatedEventData blobCreated;
StorageBlobDeletedEventData blobDeleted;

// Eventos de recursos
ResourceWriteSuccessEventData resourceCreated;
ResourceDeleteSuccessEventData resourceDeleted;

// Eventos de App Service
WebAppUpdatedEventData webAppUpdated;

// Eventos de Container Registry
ContainerRegistryImagePushedEventData imagePushed;

// Eventos de IoT Hub
IotHubDeviceCreatedEventData deviceCreated;

Referencia de Tipos Clave

TipoPropósito
EventGridPublisherClientPublicar en temas/dominios
EventGridSenderClientEnviar a temas del espacio de nombres
EventGridReceiverClientRecibir de suscripciones del espacio de nombres
EventGridEventEsquema nativo de Event Grid
CloudEventEsquema CloudEvents 1.0
ReceiveResultRespuesta de entrega pull
ReceiveDetailsEvento con propiedades del broker
BrokerPropertiesToken de bloqueo, contador de entregas

Comparación de Esquemas de Eventos

CaracterísticaEventGridEventCloudEvent
EstándarEspecífico de AzureEstándar CNCF
Campos obligatoriossubject, eventType, dataVersion, datasource, type
ExtensibilidadLimitadaAtributos de extensión
InteroperabilidadSolo AzureMultiplataforma

Buenas Prácticas

  1. Usar CloudEvents — Preferir CloudEvents para nuevas implementaciones (estándar de la industria)
  2. Agrupar eventos — Enviar múltiples eventos en una sola llamada para mayor eficiencia
  3. Usar Entra ID — Preferir identidad administrada sobre claves de acceso
  4. Manejadores idempotentes — Los eventos pueden entregarse más de una vez
  5. Configurar TTL del evento — Configurar el tiempo de vida para eventos del espacio de nombres
  6. Manejar fallos parciales — Confirmar/liberar eventos individualmente
  7. Usar dead-letter — Configurar dead-letter para eventos fallidos
  8. Validar esquemas — Validar los datos del evento antes de procesarlos

Manejo de Errores

using Azure;

try
{
    await client.SendEventAsync(cloudEvent);
}
catch (RequestFailedException ex) when (ex.Status == 401)
{
    Console.WriteLine("Autenticación fallida - verifique las credenciales");
}
catch (RequestFailedException ex) when (ex.Status == 403)
{
    Console.WriteLine("Autorización fallida - verifique los permisos RBAC");
}
catch (RequestFailedException ex) when (ex.Status == 413)
{
    Console.WriteLine("Carga útil demasiado grande - máximo 1 MB por evento, 1 MB total por lote");
}
catch (RequestFailedException ex)
{
    Console.WriteLine($"Error de Event Grid: {ex.Status} - {ex.Message}");
}

Patrón de Failover

try
{
    var primaryClient = new EventGridPublisherClient(primaryUri, primaryKey);
    await primaryClient.SendEventsAsync(events);
}
catch (RequestFailedException)
{
    // Failover a región secundaria
    var secondaryClient = new EventGridPublisherClient(secondaryUri, secondaryKey);
    await secondaryClient.SendEventsAsync(events);
}

SDKs Relacionados

SDKPropósitoInstalación
Azure.Messaging.EventGridTemas/Dominios (este SDK)dotnet add package Azure.Messaging.EventGrid
Azure.Messaging.EventGrid.NamespacesEntrega pulldotnet add package Azure.Messaging.EventGrid.Namespaces
Azure.IdentityAutenticacióndotnet add package Azure.Identity
Microsoft.Azure.WebJobs.Extensions.EventGridDesencadenador de Azure Functionsdotnet add package Microsoft.Azure.WebJobs.Extensions.EventGrid

Enlaces de Referencia

RecursoURL
Paquete NuGethttps://www.nuget.org/packages/Azure.Messaging.EventGrid
Referencia de APIhttps://learn.microsoft.com/dotnet/api/azure.messaging.eventgrid
Inicio rápidohttps://learn.microsoft.com/azure/event-grid/custom-event-quickstart
Entrega pullhttps://learn.microsoft.com/azure/event-grid/pull-delivery-overview
Código fuente en GitHubhttps://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.

Skills relacionados