¡Se AWS SDK para .NET ha publicado la versión 4 (V4) del!
Para empezar a usar la nueva versión del SDK, consulte la Guía para desarrolladores de AWS SDK para .NET (versión 4), especialmente el tema Migración a la versión 4.
Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Publicación de mensajes con el Marco de procesamiento de mensajes de AWS para .NET
El Marco de procesamiento de mensajes de AWS para .NET permite publicar o procesar uno o más tipos de mensajes o hacer ambas cosas en la misma aplicación.
El siguiente código muestra la configuración de una aplicación que publica distintos tipos de mensajes en distintos servicios de AWS.
var builder = WebApplication.CreateBuilder(args); // Register the AWS Message Processing Framework for .NET builder.Services.AddAWSMessageBus(builder => { // Register that you'll send messages of type ChatMessage to an existing queue builder.AddSQSPublisher<ChatMessage>("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd"); // Register that you'll publish messages of type OrderInfo to an existing SNS topic builder.AddSNSPublisher<OrderInfo>("arn:aws:sns:us-west-2:012345678910:MyAppProd"); // Register that you'll publish messages of type FoodItem to an existing EventBridge bus builder.AddEventBridgePublisher<FoodItem>("arn:aws:events:us-west-2:012345678910:event-bus/default"); });
Una vez que haya registrado el marco durante el inicio, introduzca el elemento IMessagePublisher genérico en el código. Llame a su método PublishAsync para publicar cualquiera de los tipos de mensajes que se configuraron anteriormente. El publicador genérico determinará el destino al que se debe enrutar el mensaje en función de su tipo.
En el siguiente ejemplo, un controlador MVC de ASP.NET recibe mensajes de ChatMessage y eventos de OrderInfo de los usuarios y, a continuación, los publica en Amazon SQS y Amazon SNS, respectivamente. Ambos tipos de mensajes se pueden publicar con el publicador genérico que se configuró anteriormente.
[ApiController] [Route("[controller]")] public class PublisherController : ControllerBase { private readonly IMessagePublisher _messagePublisher; public PublisherController(IMessagePublisher messagePublisher) { _messagePublisher = messagePublisher; } [HttpPost("chatmessage", Name = "Chat Message")] public async Task<IActionResult> PublishChatMessage([FromBody] ChatMessage message) { // Perform business and validation logic on the ChatMessage here. if (message == null) { return BadRequest("A chat message was not submitted. Unable to forward to the message queue."); } if (string.IsNullOrEmpty(message.MessageDescription)) { return BadRequest("The MessageDescription cannot be null or empty."); } // Send the ChatMessage to SQS, using the generic publisher. await _messagePublisher.PublishAsync(message); return Ok(); } [HttpPost("order", Name = "Order")] public async Task<IActionResult> PublishOrder([FromBody] OrderInfo message) { if (message == null) { return BadRequest("An order was not submitted."); } // Publish the OrderInfo to SNS, using the generic publisher. await _messagePublisher.PublishAsync(message); return Ok(); } }
Para enrutar un mensaje a la lógica de gestión adecuada, el marco utiliza metadatos denominados identificador del tipo de mensaje. De forma predeterminada, es el nombre completo del tipo .NET del mensaje, incluido su nombre del ensamblado. Si envía y gestiona mensajes, este mecanismo funciona bien si comparte la definición de sus objetos de mensaje entre proyectos. Sin embargo, si los mensajes se redefinen en diferentes espacios de nombres, o si se intercambian mensajes con otros marcos o lenguajes de programación, es posible que sea necesario sobrescribir el identificador de tipo de mensaje.
var builder = Host.CreateDefaultBuilder(args); builder.ConfigureServices(services => { // Register the AWS Message Processing Framework for .NET services.AddAWSMessageBus(builder => { // Register that you'll publish messages of type GreetingMessage to an existing queue builder.AddSQSPublisher<GreetingMessage>("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd", "greetingMessage"); }); });
Publicadores específicos del servicio
El ejemplo que se muestra arriba usa el elemento IMessagePublisher genérico, que puede publicarse en cualquier servicio de AWS compatible en función del tipo de mensaje configurado. El marco también proporciona publicadores de servicios específicos para Amazon SQS, Amazon SNS y Amazon EventBridge. Estos publicadores específicos exponen opciones que solo se aplican a ese servicio y que pueden incorporarse mediante los tipos ISQSPublisher, ISNSPublisher y IEventBridgePublisher.
Por ejemplo, al enviar mensajes a una cola FIFO de SQS, debe establecer el ID de grupo de mensajes adecuado. El siguiente código vuelve a mostrar el ejemplo de ChatMessage, pero ahora se utiliza un elemento ISQSPublisher para configurar las opciones específicas de SQS.
public class PublisherController : ControllerBase { private readonly ISQSPublisher _sqsPublisher; public PublisherController(ISQSPublisher sqsPublisher) { _sqsPublisher = sqsPublisher; } [HttpPost("chatmessage", Name = "Chat Message")] public async Task<IActionResult> PublishChatMessage([FromBody] ChatMessage message) { // Perform business and validation logic on the ChatMessage here if (message == null) { return BadRequest("A chat message was not submitted. Unable to forward to the message queue."); } if (string.IsNullOrEmpty(message.MessageDescription)) { return BadRequest("The MessageDescription cannot be null or empty."); } // Send the ChatMessage to SQS using the injected ISQSPublisher, with SQS-specific options await _sqsPublisher.SendAsync(message, new SQSOptions { DelaySeconds = <delay-in-seconds>, MessageAttributes = <message-attributes>, MessageDeduplicationId = <message-deduplication-id>, MessageGroupId = <message-group-id> }); return Ok(); } }
Se puede hacer lo mismo con SNS y EventBridge, utilizando ISNSPublisher y IEventBridgePublisher respectivamente.
await _snsPublisher.PublishAsync(message, new SNSOptions { Subject = <subject>, MessageAttributes = <message-attributes>, MessageDeduplicationId = <message-deduplication-id>, MessageGroupId = <message-group-id> });
await _eventBridgePublisher.PublishAsync(message, new EventBridgeOptions { DetailType = <detail-type>, Resources = <resources>, Source = <source>, Time = <time>, TraceHeader = <trace-header> });
De forma predeterminada, los mensajes de un tipo determinado se envían al destino que se haya configurado previamente. Sin embargo, puede anular el destino de un solo mensaje utilizando los publicadores específicos del mensaje. También puede anular el cliente AWS SDK para .NET subyacente que se utiliza para publicar el mensaje, lo que puede resultar útil en aplicaciones con varios usuarios en las que es necesario cambiar las funciones o las credenciales, según el destino.
await _sqsPublisher.SendAsync(message, new SQSOptions { OverrideClient = <override IAmazonSQS client>, QueueUrl = <override queue URL> });