es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C# Azure Event Grid publicar EventGridTopicEvent.

Tengo un escenario en el que necesito publicar datos de EventGridTopicEvent y al mismo tiempo necesito almacenar esta información del evento en la Tabla de Almacenamiento de Azure. Me gustaría saber si hay alguna manera de obtener la información (como V/F) si la publicación del evento se realizó correctamente o no (cualquier error). Si se publica correctamente, solo debo guardar los datos en el almacenamiento de la tabla.

Necesito manejar la lógica anterior a través del Controlador de Eventos de C# (mediador). He intentado con TransactionScope de C#, pero no tiene un mecanismo como Rollback. Si el evento no se publica, deshacer el evento y no almacenar nada en el almacenamiento de la tabla o no hacer una llamada para manejar la transacción de la base de datos.

También he intentado _mediator.Publish(request).IsCompletedSuccessfully pero siempre devuelve verdadero aunque pase datos de solicitud no válidos.

Fragmento de código:

public async Task<Result<Response<XYZ>>> Handle(EventGridTopicEvent request, CancellationToken cancellationToken)
{
    using TransactionScope transactionScope = new TransactionScope();
    {
        try
        {
            bool eventPublishStatus = _mediator.Publish(request).IsCompletedSuccessfully;
            if (eventPublishStatus)
            {
                //Insertar los datos de solicitud en el almacenamiento de la tabla
            }
        }
    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr la lógica deseada en el controlador de eventos de C#, puedes utilizar el siguiente enfoque:

    1. Publica el EventGridTopicEvent utilizando el método _mediator.Publish(request).
    2. Registra un controlador de eventos para el EventGridTopicEvent, el cual será activado una vez que el evento sea publicado exitosamente.
    3. En el controlador de eventos, almacena los datos en Azure Storage Table.

    Fragmento de código:

    using Microsoft.Azure.EventGrid.Models;
    using MediatR;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Extensions.Logging;
    
    public class EventGridTopicEventHandler : INotificationHandler<eventgridtopicevent>
    {
      private readonly ILogger _logger;
    
      public EventGridTopicEventHandler(ILogger<eventgridtopiceventhandler> logger)
      {
         _logger = logger;
      }
    
      public async Task Handle(EventGridTopicEvent request, CancellationToken cancellationToken)
      {
          // Inserta los datos de la solicitud en Azure Storage Table
    
          _logger.LogInformation("Evento publicado exitosamente y datos almacenados en Azure Storage Table");
      }
    }
    
    public class EventGridTopicEventPublisher
    {
      private readonly IMediator _mediator;
    
      public EventGridTopicEventPublisher(IMediator mediator)
      {
          _mediator = mediator;
      }
    
      public async Task<bool> PublishEventGridTopicEvent(EventGridTopicEvent eventGridTopicEvent)
      {
          bool isPublishSuccessful = false;
    
          try
          {
              await _mediator.Publish(eventGridTopicEvent);
    
              isPublishSuccessful = true;
          }
          catch (Exception ex)
          {
              // Registra la excepción
    
              isPublishSuccessful = false;
          }
    
          return isPublishSuccessful;
      }
    }
    
    public class EventGridTopicEventMediator
    {
      private readonly EventGridTopicEventPublisher _eventGridTopicEventPublisher;
      private readonly ILogger _logger;
    
      public EventGridTopicEventMediator(EventGridTopicEventPublisher eventGridTopicEventPublisher, ILogger<eventgridtopiceventmediator> logger)
      {
          _eventGridTopicEventPublisher = eventGridTopicEventPublisher;
          _logger = logger;
      }
    
      public async Task<bool> PublishEvent(EventGridTopicEvent eventGridTopicEvent)
      {
          bool isPublishSuccessful = await _eventGridTopicEventPublisher.PublishEventGridTopicEvent(eventGridTopicEvent);
    
          if (isPublishSuccessful)
          {
              // Evento publicado exitosamente, almacena los datos en Azure Storage Table
          }
          else
          {
              // Fallo al publicar el evento, no almacenes los datos
              _logger.LogWarning("Fallo al publicar el evento, los datos no se almacenan en Azure Storage Table");
          }
    
          return isPublishSuccessful;
      }
    }
    

    En el código anterior, se registra un controlador de eventos EventGridTopicEventHandler para el EventGridTopicEvent, que será activado una vez que el evento se publique exitosamente. Cuando se llama al método EventGridTopicEventMediator.PublishEvent(), el método EventGridTopicEventPublisher.PublishEventGridTopicEvent() publicará el evento y devolverá un valor booleano isPublishSuccessful que indica si el evento se publicó exitosamente o no. Basado en este valor, los datos se pueden almacenar en Azure Storage Table o no. En caso de alguna excepción durante la publicación del evento, el bloque catch registrará la excepción y devolverá isPublishSuccessful como false.

Comments are closed.