AWS SDK for .NET V3 已结束支持。
我们建议您迁移到 AWS SDK for .NET V4。有关如何迁移的更多详细信息和信息,请参阅我们的终止支持公告
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 AWS Message Processing Framework for .NET 发布消息
AWS Message Processing Framework for .NET 支持发布一种或多种消息类型、处理一种或多种消息类型,或者在同一个应用程序中同时执行这两种操作。
以下代码显示了向不同 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"); });
在启动过程中注册框架后,将通用 IMessagePublisher 注入到代码中。调用其 PublishAsync 方法来发布上面配置的任何消息类型。通用发布者将根据消息类型确定要将消息路由到的目的地。
在以下示例中,ASP.NET MVC 控制器接收来自用户的 ChatMessage 消息和 OrderInfo 事件,然后分别将其发布到 Amazon SQS 和 Amazon SNS。两种消息类型都可以使用上面配置的通用发布者发布。
[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(); } }
为了将消息路由到相应的处理逻辑,框架使用称为消息类型标识符的元数据。默认情况下,这是消息的 .NET 类型的完整名称,包括其程序集名称。如果既要发送消息,又要处理消息,那么当跨项目共享消息对象的定义时,这种机制能很好地发挥作用。但是,如果在不同的命名空间中重新定义消息,或者您要与其他框架或编程语言交换消息,则可能需要覆盖消息类型标识符。
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"); }); });
特定于服务的发布者
上面显示的示例使用通用 IMessagePublisher,它可以根据配置的消息类型发布到任何支持的 AWS 服务。该框架还为 Amazon SQS、Amazon SNS 和 Amazon EventBridge 提供特定于服务的发布者。这些特定的发布者会显示仅适用于特定服务的选项,并且这些选项可以使用类型 ISQSPublisher、ISNSPublisher 和 IEventBridgePublisher 完成注入。
例如,向 SQS FIFO 队列发送消息时,您必须设置相应的消息组 ID。以下代码显示的还是 ChatMessage 示例,但这次使用 ISQSPublisher 来设置特定于 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(); } }
对于 SNS 和 EventBridge,也可以分别使用 ISNSPublisher 和 IEventBridgePublisher 来完成同样的操作。
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> });
默认情况下,给定类型的消息会发送到预先配置的目的地。但是,您可以使用特定于消息的发布者来覆盖单条消息的目的地。您还可以覆盖用于发布消息的底层 AWS SDK for .NET 客户端,这在需要根据目的地更改角色或凭证的多租户应用程序中非常有用。
await _sqsPublisher.SendAsync(message, new SQSOptions { OverrideClient = <override IAmazonSQS client>, QueueUrl = <override queue URL> });