

 适用于 .NET 的 Amazon SDK V3 已进入维护模式。

我们建议您迁移到 [适用于 .NET 的 Amazon SDK V4](https://docs.amazonaws.cn/sdk-for-net/v4/developer-guide/welcome.html)。有关如何迁移的更多详细信息和信息，请参阅我们的[维护模式公告](https://www.amazonaws.cn/blogs/developer/aws-sdk-for-net-v3-maintenance-mode-announcement/)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 自定义 Amazon Message Processing Framework for .NET
<a name="msg-proc-fw-customize"></a>

Amazon Message Processing Framework for .NET 在三个不同的“层”中构建、发送和处理消息：

1. 在最外层，框架构建特定于服务的 Amazon 原生请求或响应。例如，在 Amazon SQS 中，它生成 [https://docs.amazonaws.cn/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html) 请求并处理该服务定义的 [https://docs.amazonaws.cn/AWSSimpleQueueService/latest/APIReference/API_Message.html](https://docs.amazonaws.cn/AWSSimpleQueueService/latest/APIReference/API_Message.html) 对象。

1. 在 SQS 请求和响应中，框架将 `MessageBody` 元素（对于 Amazon SNS，为 `Message`，对于 Amazon EventBridge，为 `Detail`）设置为 [JSON 格式的 CloudEvent](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/formats/json-format.md)。它包含框架设置的元数据，在处理消息时可在 `MessageEnvelope` 对象上访问。

1. 在最内层，CloudEvent JSON 对象内的 `data` 属性包含一个 JSON 序列化表示的 .NET 对象，该对象作为消息发送或接收。

   ```
   {
       "id":"b02f156b-0f02-48cf-ae54-4fbbe05cffba",
       "source":"/aws/messaging",
       "specversion":"1.0",
       "type":"Publisher.Models.ChatMessage",
       "time":"2023-11-21T16:36:02.8957126+00:00",
       "data":"<the ChatMessage object serialized as JSON>"
   }
   ```

您可以自定义消息信封的配置方式和读取方式：
+ `"id"` 是消息的唯一标识符。它默认设置为新的 GUID，但是您可以实施自己的 `IMessageIdGenerator` 并将其注入 DI 容器来覆盖此设置。
+ `"type"` 控制消息路由到处理程序的方式。默认情况下，此设置使用与消息对应的 .NET 类型的完整名称。当通过 `AddSQSPublisher`、`AddSNSPublisher` 或 `AddEventBridgePublisher` 将消息类型映射到目的地时，您可以通过 `messageTypeIdentifier` 参数覆盖此设置。
+ `"source"` 表示发送消息的系统或服务器。
  + 如果从 Amazon Lambda 发布，则该值是函数名称；如果在 Amazon ECS 上，则该值为集群名称和任务 ARN；如果在 Amazon EC2 上，则该值为实例 ID，否则为 `/aws/messaging` 的回退值。
  + 您可以在 `MessageBusBuilder` 上通过 `AddMessageSource` 或 `AddMessageSourceSuffix` 覆盖此设置。
+ `"time"` 设置为当前的日期时间（UTC）。您可以通过实施自己的 `IDateTimeHandler` 并将其注入 DI 容器来覆盖此设置。
+ `"data"` 包含作为消息发送或接收的 .NET 对象的 JSON 表示：
  + `MessageBusBuilder` 上的 `ConfigureSerializationOptions` 让您能够配置序列化和反序列化消息时将使用的 [https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions](https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions)。
  + 要注入其他属性或在框架构建消息信封后对其进行转换，您可以实施 `ISerializationCallback` 并通过 `MessageBusBuilder` 上的 `AddSerializationCallback` 注册它。