Azure Event Grid biblioteca de cliente para .NET – versão 4.14.1
O Azure Event Grid permite-lhe criar facilmente aplicações com arquiteturas baseadas em eventos. O serviço Event Grid gere totalmente todo o encaminhamento de eventos de qualquer origem, para qualquer destino, para qualquer aplicação. Os eventos de serviço do Azure e eventos personalizados podem ser publicados diretamente no serviço, onde os eventos podem ser filtrados e enviados para vários destinatários, como processadores incorporados ou webhooks personalizados. Para saber mais sobre Azure Event Grid: O que é o Event Grid?
Utilize a biblioteca de cliente para Azure Event Grid para:
Publicar eventos no serviço Event Grid com o Evento do Event Grid, o Cloud Event 1.0 ou os esquemas personalizados
Consumir eventos que foram entregues aos processadores de eventos
Gerar tokens DE SAS para autenticar os eventos de publicação do cliente para Azure Event Grid tópicos
Código fonte | Pacote (NuGet) | Documentação | de referência da APIDocumentação do | produto Exemplos | Guia de migração
Introdução
Instalar o pacote
Instale a biblioteca de cliente a partir do NuGet:
dotnet add package Azure.Messaging.EventGrid
Pré-requisitos
Tem de ter uma subscrição do Azure e um grupo de recursos do Azure com um tópico ou domínio personalizado do Event Grid. Siga este tutorial passo a passo para registar o fornecedor de recursos do Event Grid e criar tópicos do Event Grid com o portal do Azure. Existe um tutorial semelhante com a CLI do Azure.
Autenticar o Cliente
Para que a biblioteca de cliente interaja com um tópico ou domínio, precisará do endpoint
tópico do Event Grid e de um credential
, que pode ser criado com a chave de acesso do tópico.
Pode encontrar o ponto final do tópico do Event Grid no Portal do Azure ou através do fragmento da CLI do Azure abaixo.
az eventgrid topic show --name <your-resource-name> --resource-group <your-resource-group-name> --query "endpoint"
A chave de acesso também pode ser encontrada através do portal ou através do fragmento da CLI do Azure abaixo:
az eventgrid topic key list --name <your-resource-name> --resource-group <your-resource-group-name> --query "key1"
Autenticar com a Chave de Acesso ao Tópico
Assim que tiver a chave de acesso e o ponto final do tópico, pode criar o cliente do publicador da seguinte forma:
EventGridPublisherClient client = new EventGridPublisherClient(
new Uri("<endpoint>"),
new AzureKeyCredential("<access-key>"));
Autenticar com a Assinatura de Acesso Partilhado
O Event Grid também suporta a autenticação com uma assinatura de acesso partilhado que permite fornecer acesso a um recurso que expira por um determinado período de tempo sem partilhar a sua chave de acesso. Geralmente, o fluxo de trabalho seria que uma aplicação geraria a cadeia de SAS e entregaria a cadeia a outra aplicação que consumiria a cadeia. Gerar a SAS:
var builder = new EventGridSasBuilder(new Uri(topicEndpoint), DateTimeOffset.Now.AddHours(1));
var keyCredential = new AzureKeyCredential(topicAccessKey);
string sasToken = builder.GenerateSas(keyCredential);
Eis como seria utilizado do ponto de vista do consumidor:
var sasCredential = new AzureSasCredential(sasToken);
EventGridPublisherClient client = new EventGridPublisherClient(
new Uri(topicEndpoint),
sasCredential);
EventGridPublisherClient
também aceita um conjunto de opções de configuração através de EventGridPublisherClientOptions
. Por exemplo, pode especificar um serializador personalizado que será utilizado para serializar os dados do evento para JSON.
Autenticar com o Azure Active Directory
Azure Event Grid fornece integração com o Azure Active Directory (Azure AD) para autenticação baseada em identidade de pedidos. Com Azure AD, pode utilizar o controlo de acesso baseado em funções (RBAC) para conceder acesso aos seus recursos Azure Event Grid a utilizadores, grupos ou aplicações. A biblioteca de Identidade do Azure fornece suporte fácil do Azure Active Directory para autenticação.
Para enviar eventos para um tópico ou domínio com o Azure Active Directory, a identidade autenticada deve ter a função "Remetente de Dados do EventGrid" atribuída.
EventGridPublisherClient client = new EventGridPublisherClient(
new Uri(topicEndpoint),
new DefaultAzureCredential());
Conceitos-chave
Para obter informações sobre os conceitos gerais do Event Grid: Conceitos no Azure Event Grid.
EventGridPublisherClient
Um publicador envia eventos para o serviço Event Grid. A Microsoft publica eventos para vários serviços do Azure. Pode publicar eventos a partir da sua própria aplicação com o EventGridPublisherClient
.
Esquemas de eventos
Um evento é a menor quantidade de informações que descreve totalmente algo que aconteceu no sistema. O Event Grid suporta vários esquemas para eventos de codificação. Quando é criado um tópico ou domínio personalizado, especifique o esquema que será utilizado ao publicar eventos.
Esquema do Event Grid
Embora possa configurar o tópico para utilizar um esquema personalizado, é mais comum utilizar o esquema do Event Grid já definido. Veja as especificações e os requisitos aqui.
Esquema CloudEvents v1.0
Outra opção é utilizar o esquema CloudEvents v1.0. O CloudEvents é um projeto do Cloud Native Computing Foundation que produz uma especificação para descrever os dados de eventos de uma forma comum. O resumo do serviço do CloudEvents pode ser encontrado aqui.
Independentemente do esquema que o seu tópico ou domínio está configurado para utilizar, EventGridPublisherClient
será utilizado para publicar eventos no mesmo. Utilize o SendEvents
método ou SendEventsAsync
para publicar.
Entrega de eventos
Os eventos entregues aos consumidores pelo Event Grid são entregues como JSON. Dependendo do tipo de consumidor a que está a ser entregue, o serviço Event Grid pode fornecer um ou mais eventos como parte de um único payload. O processamento de eventos será diferente com base no esquema como o qual o evento foi entregue. No entanto, o padrão geral permanecerá o mesmo:
- Analise eventos do JSON em eventos individuais. Com base no esquema de eventos (Event Grid ou CloudEvents), pode agora aceder a informações básicas sobre o evento no envelope (propriedades que estão presentes para todos os eventos, como a hora e o tipo do evento).
- Anular a serialização dos dados do evento. Tendo em conta um
EventGridEvent
ouCloudEvent
, o utilizador pode tentar aceder ao payload de eventos, ou dados, ao anular a serialização para um tipo específico. Pode fornecer um serializador personalizado neste momento para descodificar corretamente os dados.
Segurança de threads
Garantimos que todos os métodos de instância de cliente são seguros para threads e independentes uns dos outros (orientação). Isto garante que a recomendação de reutilização de instâncias de cliente é sempre segura, mesmo entre threads.
Conceitos adicionais
Opções de | cliente Aceder à resposta | Operações de execução prolongada | Lidar com falhas | Diagnósticos | A gozar | Duração do cliente
Exemplos
- Publicar eventos do Event Grid num Tópico do Event Grid
- Publicar CloudEvents num Tópico do Event Grid
- Publicar eventos do Event Grid num Domínio do Event Grid
- Receber e Anular a Eliminação de Eventos
Publicar eventos do Event Grid num Tópico do Event Grid
A publicação de eventos no Event Grid é efetuada com o EventGridPublisherClient
. Utilize o método fornecido SendEvent
/SendEventAsync
para publicar um único evento no tópico.
// 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);
Para publicar um lote de eventos, utilize o SendEvents
/SendEventsAsync
método .
// 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);
Publicar CloudEvents num Tópico do Event Grid
A publicação de eventos no Event Grid é efetuada com o EventGridPublisherClient
. Utilize o método fornecido SendEvents
/SendEventsAsync
para publicar eventos no tópico.
// 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);
Publicar eventos do Event Grid num Domínio do Event Grid
Um domínio de eventos é uma ferramenta de gestão para um grande número de tópicos do Event Grid relacionados com a mesma aplicação. Pode pensar nisso como um meta-tópico que pode ter milhares de tópicos individuais. Quando cria um domínio de eventos, é-lhe atribuído um ponto final de publicação semelhante ao de se tivesse criado um tópico no Event Grid.
Para publicar eventos em qualquer tópico num Domínio de Eventos, envie os eventos para o ponto final do domínio da mesma forma que faria para um tópico personalizado. A única diferença é que tem de especificar o tópico ao qual pretende que o evento seja entregue.
// 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);
Para enviar CloudEvents, a origem cloudEvent é utilizada como o tópico de domínio:
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);
Receber e Anular a Eliminação de Eventos
Existem vários serviços do Azure diferentes que atuam como processadores de eventos.
Nota: se utilizar Webhooks para a entrega de eventos do esquema do Event Grid, o Event Grid requer que prove a propriedade do ponto final do Webhook antes de começar a entregar eventos a esse ponto final. No momento da criação da subscrição de eventos, o Event Grid envia um evento de validação de subscrição para o ponto final, conforme visto abaixo. Saiba mais sobre como concluir o handshake aqui: entrega de eventos do Webhook. Para o esquema CloudEvents, o serviço valida a ligação com o método de opções HTTP. Saiba mais aqui: Validação do CloudEvents.
Assim que os eventos forem entregues ao processador de eventos, podemos anular a serialização do payload JSON numa lista de eventos.
Com EventGridEvent
:
// Parse the JSON payload into a list of events
EventGridEvent[] egEvents = EventGridEvent.ParseMany(BinaryData.FromStream(httpContent));
Com CloudEvent
:
var bytes = await httpContent.ReadAsByteArrayAsync();
// Parse the JSON payload into a list of events
CloudEvent[] cloudEvents = CloudEvent.ParseMany(new BinaryData(bytes));
Anular a serialização de dados de eventos
A partir daqui, pode-se aceder aos dados do evento ao anular a serialização para um tipo específico ao chamar ToObjectFromJson<T>()
a Data
propriedade. Para anular a serialização para o tipo correto, a EventType
propriedade (Type
para CloudEvents) ajuda a distinguir entre diferentes eventos. Os dados de eventos personalizados devem ser desseriais com o método ToObjectFromJson<T>()
genérico . Existe também um método ToObject<T>()
de extensão que aceita um personalizado ObjectSerializer
para anular a serialização dos dados do evento.
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;
}
}
Com TryGetSystemEventData()
:
Se esperar maioritariamente eventos do sistema, poderá ser mais limpo ativar TryGetSystemEventData()
e utilizar a correspondência de padrões para agir sobre os eventos individuais. Se um evento não for um evento de sistema, o método devolverá falso e o parâmetro de saída será nulo.
Como uma ressalva, se estiver a utilizar um tipo de evento personalizado com um valor EventType que posteriormente é adicionado como um evento de sistema pelo serviço e pelo SDK, o valor devolvido de TryGetSystemEventData
mudaria de false
para true
. Isto pode surgir se estiver a criar preventivamente os seus próprios eventos personalizados para eventos que já estão a ser enviados pelo serviço, mas que ainda não foram adicionados ao SDK. Neste caso, é melhor utilizar o método genérico ToObjectFromJson<T>
na propriedade para que o Data
fluxo de código não seja alterado automaticamente após a atualização (é claro que poderá continuar a querer modificar o código para consumir o modelo de eventos do sistema recentemente lançado em oposição ao modelo personalizado).
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;
}
}
}
Resolução de problemas
Respostas do Serviço
SendEvents()
devolve um código de resposta HTTP do serviço. Um RequestFailedException
é emitido como uma resposta de serviço para quaisquer pedidos sem êxito. A exceção contém informações sobre que código de resposta foi devolvido do serviço.
Anular a serialização dos Dados de Eventos
- Se os dados do evento não forem JSON válidos, será emitido um
JsonException
quando chamarParse
ouParseMany
. - Se o esquema do evento não corresponder ao tipo que está a ser desserializado (por exemplo, a chamar
CloudEvent.Parse
num evento EventGridSchema), é emitido umArgumentException
. - Se
Parse
for chamado para dados que contenham vários eventos, é emitido umArgumentException
.ParseMany
deve ser utilizado aqui.
Configurar o registo da consola
Também pode ativar facilmente o registo da consola se quiser aprofundar os pedidos que está a fazer contra o serviço.
Rastreio Distribuído
A biblioteca do Event Grid suporta a distribuição do rastreio fora da caixa. Para cumprir a documentação de orientação da especificação CloudEvents sobre a distribuição do rastreio, a biblioteca definirá o traceparent
e tracestate
no de quando CloudEvent
o ExtensionAttributes
rastreio distribuído estiver ativado. Para saber mais sobre como ativar o rastreio distribuído na sua aplicação, veja a documentação de rastreio distribuído do SDK do Azure.
Event Grid no Kubernetes
Esta biblioteca foi testada e validada no Kubernetes com o Azure Arc.
Passos seguintes
Veja mais https://github.com/Azure/azure-sdk-for-net/blob/Azure.Messaging.EventGrid_4.14.1/sdk/eventgrid/Azure.Messaging.EventGrid/samples aqui para obter utilizações comuns da biblioteca de cliente do Event Grid: Exemplos do Event Grid.
Contribuir
Agradecemos todas as contribuições e sugestões para este projeto. A maioria das contribuições requerem que celebre um Contrato de Licença de Contribuição (CLA) no qual se declare que tem o direito de conceder e que, na verdade, concede-nos os direitos para utilizar a sua contribuição. Para obter detalhes, visite https://cla.microsoft.com.
Quando submete um pedido Pull, um bot do CLA determina automaticamente se tem de fornecer um CLA e decorar o PR de forma adequada (por exemplo, etiqueta, comentário). Só tem de seguir as instruções fornecidas pelo bot. Apenas terá de fazer isto uma vez em todos os repositórios com o nosso CLA.
Este projeto adotou o Microsoft Open Source Code of Conduct (Código de Conduta do Microsoft Open Source). Para obter mais informações, consulte as FAQ do Código de Conduta ou o contacto opencode@microsoft.com com quaisquer perguntas ou comentários adicionais.