

Versi 4 (V4) dari AWS SDK untuk .NET telah dirilis\$1

Untuk informasi tentang melanggar perubahan dan memigrasi aplikasi Anda, lihat [topik migrasi](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html).

 [https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Publikasikan pesan dengan AWS Message Processing Framework untuk.NET
<a name="msg-proc-fw-publish"></a>

 AWS Message Processing Framework untuk.NET mendukung penerbitan satu atau beberapa jenis pesan, memproses satu atau beberapa jenis pesan, atau melakukan keduanya dalam aplikasi yang sama. 

Kode berikut menunjukkan konfigurasi untuk aplikasi yang menerbitkan jenis pesan yang berbeda ke AWS layanan yang berbeda. 

```
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");
});
```

Setelah Anda mendaftarkan kerangka kerja selama startup, masukkan generik `IMessagePublisher` ke dalam kode Anda. Panggil `PublishAsync` metodenya untuk mempublikasikan salah satu jenis pesan yang dikonfigurasi di atas. Penerbit generik akan menentukan tujuan untuk mengarahkan pesan berdasarkan jenisnya. 

 Dalam contoh berikut, pengontrol ASP.NET MVC menerima `ChatMessage` pesan dan `OrderInfo` peristiwa dari pengguna, dan kemudian menerbitkannya ke Amazon SQS dan Amazon SNS masing-masing. Kedua jenis pesan dapat dipublikasikan menggunakan penerbit generik yang telah dikonfigurasi di atas.

```
[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();
    }
}
```

Untuk merutekan pesan ke logika penanganan yang sesuai, kerangka kerja menggunakan metadata yang disebut pengenal *tipe pesan*. Secara default, ini adalah nama lengkap dari jenis .NET pesan, termasuk nama rakitannya. Jika Anda mengirim dan menangani pesan, mekanisme ini berfungsi dengan baik jika Anda membagikan definisi objek pesan Anda di seluruh proyek. Namun, jika pesan didefinisikan ulang di ruang nama yang berbeda, atau jika Anda bertukar pesan dengan kerangka kerja atau bahasa pemrograman lain, Anda mungkin perlu mengganti pengenal jenis pesan.

```
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");
    });
});
```

## Penerbit khusus layanan
<a name="service-specific-publishers"></a>

Contoh yang ditunjukkan di atas menggunakan generik`IMessagePublisher`, yang dapat mempublikasikan ke AWS layanan yang didukung berdasarkan jenis pesan yang dikonfigurasi. Kerangka kerja ini juga menyediakan penerbit khusus layanan untuk Amazon SQS, Amazon SNS, dan Amazon. EventBridge Penayang khusus ini mengekspos opsi yang hanya berlaku untuk layanan itu, dan dapat disuntikkan menggunakan jenis`ISQSPublisher`,, `ISNSPublisher` dan. `IEventBridgePublisher`

Misalnya, saat mengirim pesan ke antrean SQS FIFO, Anda harus mengatur ID grup [pesan](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-key-terms.html) yang sesuai. Kode berikut menunjukkan `ChatMessage` contoh lagi, tetapi sekarang menggunakan `ISQSPublisher` untuk mengatur opsi khusus 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();
    }
}
```

Hal yang sama dapat dilakukan untuk SNS dan EventBridge, menggunakan `ISNSPublisher` dan `IEventBridgePublisher` masing-masing.

```
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>
});
```

Secara default, pesan dari jenis tertentu dikirim ke tujuan yang dikonfigurasi sebelumnya. Namun, Anda dapat mengganti tujuan untuk satu pesan menggunakan penayang khusus pesan. Anda juga dapat mengganti AWS SDK untuk .NET klien yang mendasari yang digunakan untuk mempublikasikan pesan, yang dapat berguna dalam aplikasi multi-penyewa di mana Anda perlu mengubah peran atau kredensialnya, tergantung pada tujuan.

```
await _sqsPublisher.SendAsync(message, new SQSOptions
{
    OverrideClient = <override IAmazonSQS client>,
    QueueUrl = <override queue URL>
});
```