

La AWS SDK per .NET V3 è entrata in modalità manutenzione.

[Ti consigliamo di migrare alla V4.AWS SDK per .NET](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/welcome.html) Per ulteriori dettagli e informazioni su come eseguire la migrazione, consulta il nostro annuncio sulla modalità di [manutenzione](https://aws.amazon.com/blogs/developer/aws-sdk-for-net-v3-maintenance-mode-announcement/).

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# AWS Framework di elaborazione dei messaggi per.NET
<a name="msg-proc-fw"></a>

Il AWS Message Processing Framework for .NET è un framework AWS nativo che semplifica lo sviluppo di applicazioni di elaborazione dei messaggi.NET che utilizzano AWS servizi come Amazon Simple Queue Service (SQS), Amazon Simple Notification Service (SNS) e Amazon. EventBridge Il framework riduce la quantità di codice standard che gli sviluppatori devono scrivere, consentendoti di concentrarti sulla logica aziendale durante la pubblicazione e l'utilizzo di messaggi. Per informazioni dettagliate su come il framework può semplificare lo sviluppo, consulta il post di blog [Introducing the AWS Message Processing Framework for .NET (](https://aws.amazon.com/blogs/developer/introducing-the-aws-message-processing-framework-for-net-preview/)Preview). La prima parte, in particolare, fornisce una dimostrazione che mostra la differenza tra l'utilizzo di chiamate API di basso livello e l'utilizzo del framework.

Il Message Processing Framework supporta le seguenti attività e funzionalità:
+ Invio di messaggi a SQS e pubblicazione di eventi su SNS e. EventBridge
+ Ricezione e gestione di messaggi da SQS utilizzando un poller a esecuzione prolungata, che viene in genere utilizzato nei servizi in background. Ciò include la gestione del timeout di visibilità durante la gestione di un messaggio per impedire ad altri client di elaborarlo.
+ Gestione dei messaggi nelle funzioni AWS Lambda .
+ Code FIFO (first-in-first-out) SQS e argomenti SNS.
+ OpenTelemetry per la registrazione.

Per dettagli su queste attività e funzionalità, consulta la sezione **Caratteristiche** del [post del blog](https://aws.amazon.com/blogs/developer/introducing-the-aws-message-processing-framework-for-net-preview/) e gli argomenti elencati di seguito.

Prima di iniziare, assicuratevi di aver [configurato l'ambiente e il progetto](net-dg-config.md). Consulta anche le informazioni contenute in[Funzionalità dell'SDK](net-dg-sdk-features.md).

**Altre risorse**
+ Il [https://www.nuget.org/packages/AWS.Messaging/](https://www.nuget.org/packages/AWS.Messaging/)pacchetto su [NuGet.org](https://www.nuget.org/).
+ Il [riferimento all'API](https://aws.github.io/aws-dotnet-messaging/).
+ Il `README` file nel GitHub repository all'indirizzo [https://github.com/aws/aws-dotnet-messaging/](https://github.com/aws/aws-dotnet-messaging/)
+ [Iniezione di dipendenze.NET](https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection) da Microsoft.
+ [.NET Generic Host](https://learn.microsoft.com/en-us/dotnet/core/extensions/generic-host) di Microsoft.

**Topics**
+ [Inizia a usare](msg-proc-fw-get-started.md)
+ [Pubblica messaggi](msg-proc-fw-publish.md)
+ [Consuma messaggi](msg-proc-fw-consume.md)
+ [FIFO](msg-proc-fw-fifo.md)
+ [Registrazione e telemetria aperta](msg-proc-fw-telemetry.md)
+ [Personalizzazione](msg-proc-fw-customize.md)
+ [Sicurezza](msg-proc-fw-security.md)

# Inizia a usare il AWS Message Processing Framework per .NET
<a name="msg-proc-fw-get-started"></a>

Prima di iniziare, assicurati di aver [configurato l'ambiente e il progetto](net-dg-config.md). Consulta anche le informazioni contenute in[Funzionalità dell'SDK](net-dg-sdk-features.md).

Questo argomento fornisce informazioni utili per iniziare a utilizzare il Message Processing Framework. Oltre alle informazioni sui prerequisiti e sulla configurazione, viene fornito un tutorial che mostra come implementare uno scenario comune.

## Prerequisiti e configurazione
<a name="mpf-get-started-prereq"></a>
+ Le credenziali fornite per l'applicazione devono disporre delle autorizzazioni appropriate per il servizio di messaggistica e le operazioni utilizzate. Per ulteriori informazioni, consulta gli argomenti sulla sicurezza per [SQS, [SNS](https://docs.aws.amazon.com/sns/latest/dg/security-iam.html)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-authentication-and-access-control.html) e [EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-iam.html)nelle rispettive guide per sviluppatori. [Consultate anche la parte del file [README](https://github.com/aws/aws-dotnet-messaging/) dedicata alle autorizzazioni GitHub specifiche.](https://github.com/aws/aws-dotnet-messaging/blob/main/README.md#permissions)
+ Per utilizzare il AWS Message Processing Framework per .NET, è necessario aggiungere il [https://www.nuget.org/packages/AWS.Messaging](https://www.nuget.org/packages/AWS.Messaging) NuGetpacchetto al progetto. Per esempio:

  ```
  dotnet add package AWS.Messaging
  ```
+ Il framework si integra con il contenitore di [servizi di dependency injection (DI)](https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection) di.NET. È possibile configurare il framework durante l'avvio dell'applicazione chiamando `AddAWSMessageBus` per aggiungerlo al contenitore DI.

  ```
  var builder = WebApplication.CreateBuilder(args);
  
  // Register the AWS Message Processing Framework for .NET
  builder.Services.AddAWSMessageBus(builder =>
  {
      // Register that you'll publish messages of type ChatMessage to an existing queue
      builder.AddSQSPublisher<ChatMessage>("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd");
  });
  ```

## Tutorial
<a name="mpf-get-started-tutorial"></a>

Questo tutorial dimostra come utilizzare il AWS Message Processing Framework per.NET. Crea due applicazioni: un'API ASP.NET Core Minimal che invia messaggi a una coda Amazon SQS quando riceve una richiesta su un endpoint API e un'applicazione console di lunga durata che esegue il polling di questi messaggi e li gestisce. 
+ Le istruzioni di questo tutorial privilegiano l'interfaccia della riga di comando .NET, ma è possibile eseguire questo tutorial utilizzando strumenti multipiattaforma, come.NET CLI o Microsoft Visual Studio. Per informazioni sugli strumenti, consulta. [Installa e configura la tua toolchain](net-dg-dev-env.md)
+ Questo tutorial presuppone che tu stia utilizzando il tuo `[default]` profilo per le credenziali. Si presuppone inoltre che le credenziali a breve termine siano disponibili con le autorizzazioni appropriate per l'invio e la ricezione di messaggi Amazon SQS. [Per ulteriori informazioni, consulta gli argomenti sulla [Configura l'autenticazione SDK con AWS](creds-idc.md) sicurezza per SQS.](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-authentication-and-access-control.html)

**Nota**  
Eseguendo questo tutorial, potresti incorrere in costi per la messaggistica SQS.

### Fasi
<a name="mpf-tutorial-steps"></a>
+ [Crea una coda SQS](#mpf-tutorial-queue)
+ [Crea ed esegui l'applicazione di pubblicazione](#mpf-tutorial-publish)
+ [Crea ed esegui l'applicazione di gestione](#mpf-tutorial-handle)
+ [Rimozione](#mpf-tutorial-cleanup)

### Crea una coda SQS
<a name="mpf-tutorial-queue"></a>

Questo tutorial richiede una coda SQS per inviare e ricevere messaggi. È possibile creare una coda utilizzando uno dei seguenti comandi per il o il AWS CLI . AWS Strumenti per PowerShell Prendi nota dell'URL della coda che viene restituito in modo da poterlo specificare nella configurazione del framework che segue.

------
#### [ AWS CLI ]

```
aws sqs create-queue --queue-name DemoQueue
```

------
#### [ AWS Strumenti per PowerShell ]

```
New-SQSQueue -QueueName DemoQueue
```

------

### Crea ed esegui l'applicazione di pubblicazione
<a name="mpf-tutorial-publish"></a>

Utilizzate la procedura seguente per creare ed eseguire l'applicazione di pubblicazione.

1. Aprire un prompt dei comandi o un terminale. Trovare o creare una cartella del sistema operativo in cui è possibile creare un progetto.NET.

1. In tale cartella, eseguire il seguente comando per creare il progetto.NET.

   ```
   dotnet new webapi --name Publisher
   ```

1. Naviga nella cartella del nuovo progetto. Aggiungi una dipendenza dal AWS Message Processing Framework per .NET.

   ```
   cd Publisher
   dotnet add package AWS.Messaging
   ```
**Nota**  
Se lo utilizzi AWS IAM Identity Center per l'autenticazione, assicurati di aggiungere anche `AWSSDK.SSO` e`AWSSDK.SSOOIDC`.

1. Sostituisci il codice `Program.cs` con il codice seguente.

   ```
   using AWS.Messaging;
   using Microsoft.AspNetCore.Mvc;
   using Publisher;
   
   var builder = WebApplication.CreateBuilder(args);
   
   // Add services to the container.
   // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle.
   builder.Services.AddEndpointsApiExplorer();
   builder.Services.AddSwaggerGen();
   
   
   // Configure the AWS Message Processing Framework for .NET.
   builder.Services.AddAWSMessageBus(builder =>
   {
       // Check for input SQS URL.
       // The SQS URL should be passed as a command line argument or set in the Debug launch profile.
       if ((args.Length == 1) && (args[0].Contains("https://sqs.")))
       {
           // Register that you'll publish messages of type GreetingMessage:
           // 1. To a specified queue.
           // 2. Using the message identifier "greetingMessage", which will be used
           //    by handlers to route the message to the appropriate handler.
           builder.AddSQSPublisher<GreetingMessage>(args[0], "greetingMessage");
       }
       // You can map additional message types to queues or topics here as well.
   });
   var app = builder.Build();
   
   
   // Configure the HTTP request pipeline.
   if (app.Environment.IsDevelopment())
   {
       app.UseSwagger();
       app.UseSwaggerUI();
   }
   
   app.UseHttpsRedirection();
   
   // Create an API Endpoint that receives GreetingMessage objects
   // from the caller and then sends them as an SQS message.
   app.MapPost("/greeting", async ([FromServices] IMessagePublisher publisher, Publisher.GreetingMessage message) =>
       {
           return await PostGreeting(message, publisher);
       })
   .WithName("SendGreeting")
   .WithOpenApi();
   
   app.Run();
   
   public partial class Program
   {
       /// <summary>
       /// Endpoint for posting a greeting message.
       /// </summary>
       /// <param name="greetingMessage">The greeting message.</param>
       /// <param name="messagePublisher">The message publisher.</param>
       /// <returns>Async task result.</returns>
       public static async Task<IResult> PostGreeting(GreetingMessage greetingMessage,
           IMessagePublisher messagePublisher)
       {
           if (greetingMessage.SenderName == null || greetingMessage.Greeting == null)
           {
               return Results.BadRequest();
           }
   
           // Publish the message to the queue configured above.
           await messagePublisher.PublishAsync(greetingMessage);
   
           return Results.Ok();
       }
   }
   
   namespace Publisher
   {
       /// <summary>
       /// This class represents the message contents.
       /// </summary>
       public class GreetingMessage
       {
           public string? SenderName { get; set; }
           public string? Greeting { get; set; }
       }
   }
   ```

1. Esegui il comando seguente. Questo dovrebbe aprire una finestra del browser con l'interfaccia utente di Swagger, che ti permetterà di esplorare e testare la tua API.

   ```
   dotnet watch run <queue URL created earlier>
   ```

1. Apri l'`/greeting`endpoint e scegli **Try** it out.

1. `senderName`Specificate `greeting` i valori per il messaggio e scegliete **Esegui**. Questo richiama la tua API, che invia il messaggio SQS.

### Crea ed esegui l'applicazione di gestione
<a name="mpf-tutorial-handle"></a>

Utilizzare la procedura seguente per creare ed eseguire l'applicazione di gestione.

1. Aprire un prompt dei comandi o un terminale. Trovare o creare una cartella del sistema operativo in cui è possibile creare un progetto.NET.

1. In tale cartella, eseguire il seguente comando per creare il progetto.NET.

   ```
   dotnet new console --name Handler
   ```

1. Naviga nella cartella del nuovo progetto. Aggiungi una dipendenza dal AWS Message Processing Framework per .NET. Aggiungi anche il `Microsoft.Extensions.Hosting` pacchetto, che consente di configurare il framework tramite l'[host generico.NET](https://learn.microsoft.com/en-us/dotnet/core/extensions/generic-host).

   ```
   cd Handler
   dotnet add package AWS.Messaging
   dotnet add package Microsoft.Extensions.Hosting
   ```
**Nota**  
Se lo utilizzi AWS IAM Identity Center per l'autenticazione, assicurati di aggiungere anche `AWSSDK.SSO` e`AWSSDK.SSOOIDC`.

1. Sostituisci il codice `Program.cs` con il codice seguente.

   ```
   using AWS.Messaging;
   using Handler;
   using Microsoft.Extensions.DependencyInjection;
   using Microsoft.Extensions.Hosting;
   
   var builder = Host.CreateDefaultBuilder(args);
   
   builder.ConfigureServices(services =>
   {
       // Register the AWS Message Processing Framework for .NET.
       services.AddAWSMessageBus(builder =>
       {
           // Check for input SQS URL.
           // The SQS URL should be passed as a command line argument or set in the Debug launch profile.
           if ((args.Length == 1) && (args[0].Contains("https://sqs.")))
           {
               // Register you'll poll the following queue.
               builder.AddSQSPoller(args[0]);
   
               // And that messages of type "greetingMessage" should be:
               // 1. Deserialized as GreetingMessage objects.
               // 2. Which are then passed to GreetingMessageHandler.
               builder.AddMessageHandler<GreetingMessageHandler, GreetingMessage>("greetingMessage");
   
           }
           // You can add additional message handlers here, using different message types. 
       });
   });
   
   var host = builder.Build();
   await host.RunAsync();
   
   namespace Handler
   {
       /// <summary>
       /// This class represents the message contents.
       /// </summary>
       public class GreetingMessage
       {
           public string? SenderName { get; set; }
           public string? Greeting { get; set; }
       }
   
       /// <summary>
       /// This handler is invoked each time you receive the message.
       /// </summary>
       public class GreetingMessageHandler : IMessageHandler<GreetingMessage>
       {
           public Task<MessageProcessStatus> HandleAsync(
               MessageEnvelope<GreetingMessage> messageEnvelope,
               CancellationToken token = default)
           {
               Console.WriteLine(
                   $"Received message {messageEnvelope.Message.Greeting} from {messageEnvelope.Message.SenderName}");
               return Task.FromResult(MessageProcessStatus.Success());
           }
       }
   }
   ```

1. Esegui il comando seguente. Questo avvia un sondaggio di lunga durata.

   ```
   dotnet run <queue URL created earlier>
   ```

   Poco dopo l'avvio, l'applicazione riceverà il messaggio inviato nella prima parte di questo tutorial e registrerà il seguente messaggio:

   ```
   Received message {greeting} from {senderName}
   ```

1. Premi `Ctrl+C` per interrompere il sondaggio.

### Rimozione
<a name="mpf-tutorial-cleanup"></a>

Utilizzate uno dei seguenti comandi per AWS CLI o per AWS Strumenti per PowerShell eliminare la coda.

------
#### [ AWS CLI ]

```
aws sqs delete-queue --queue-url "<queue URL created earlier>"
```

------
#### [ AWS Strumenti per PowerShell ]

```
Remove-SQSQueue -QueueUrl "<queue URL created earlier>"
```

------

# Pubblica messaggi con il AWS Message Processing Framework per .NET
<a name="msg-proc-fw-publish"></a>

Il AWS Message Processing Framework for .NET supporta la pubblicazione di uno o più tipi di messaggi, l'elaborazione di uno o più tipi di messaggi o l'esecuzione di entrambe le operazioni nella stessa applicazione. 

Il codice seguente mostra una configurazione per un'applicazione che pubblica tipi di messaggi diversi su AWS servizi diversi. 

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

Dopo aver registrato il framework durante l'avvio, inserisci il generico `IMessagePublisher` nel tuo codice. Chiama il suo `PublishAsync` metodo per pubblicare uno qualsiasi dei tipi di messaggio configurati sopra. L'editore generico determinerà la destinazione verso cui indirizzare il messaggio in base al tipo. 

 Nell'esempio seguente, un controller ASP.NET MVC riceve sia `ChatMessage` messaggi che `OrderInfo` eventi dagli utenti, quindi li pubblica rispettivamente su Amazon SQS e Amazon SNS. Entrambi i tipi di messaggi possono essere pubblicati utilizzando l'editore generico configurato in precedenza.

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

Per indirizzare un messaggio alla logica di gestione appropriata, il framework utilizza dei metadati denominati *identificatori del tipo di messaggio*. Per impostazione predefinita, si tratta del nome completo del tipo.NET del messaggio, incluso il nome dell'assembly. Se inviate e gestite messaggi, questo meccanismo funziona bene se condividete la definizione degli oggetti del messaggio tra progetti. Tuttavia, se i messaggi vengono ridefiniti in diversi namespace o se state scambiando messaggi con altri framework o linguaggi di programmazione, potrebbe essere necessario sostituire l'identificatore del tipo di messaggio.

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

## Editori specifici per servizi
<a name="service-specific-publishers"></a>

L'esempio mostrato sopra utilizza il formato generico`IMessagePublisher`, che può essere pubblicato su qualsiasi AWS servizio supportato in base al tipo di messaggio configurato. Il framework fornisce anche editori specifici per servizi per Amazon SQS, Amazon SNS e Amazon. EventBridge Questi editori specifici espongono opzioni che si applicano solo a quel servizio e che possono essere inserite utilizzando i tipi, e. `ISQSPublisher` `ISNSPublisher` `IEventBridgePublisher`

[Ad esempio, quando si inviano messaggi a una coda FIFO SQS, è necessario impostare l'ID del gruppo di messaggi appropriato.](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-key-terms.html) Il codice seguente mostra nuovamente l'`ChatMessage`esempio, ma ora viene utilizzato un `ISQSPublisher` per impostare opzioni specifiche di 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();
    }
}
```

Lo stesso può essere fatto per SNS e EventBridge, rispettivamente, utilizzando `ISNSPublisher` e. `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>
});
```

Per impostazione predefinita, i messaggi di un determinato tipo vengono inviati alla destinazione configurata in anticipo. Tuttavia, puoi sovrascrivere la destinazione di un singolo messaggio utilizzando gli editori specifici del messaggio. Puoi anche sostituire il AWS SDK per .NET client sottostante utilizzato per pubblicare il messaggio, il che può essere utile nelle applicazioni multi-tenant in cui è necessario modificare ruoli o credenziali, a seconda della destinazione.

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

# Consuma messaggi con il AWS Message Processing Framework for .NET
<a name="msg-proc-fw-consume"></a>

Il AWS Message Processing Framework for .NET consente di utilizzare i messaggi che sono stati [pubblicati](msg-proc-fw-publish.md) utilizzando il framework o uno dei servizi di messaggistica. I messaggi possono essere utilizzati in diversi modi, alcuni dei quali sono descritti di seguito.

## Gestori di messaggi
<a name="handle-a-message"></a>

Per utilizzare i messaggi, implementa un gestore di messaggi utilizzando l'`IMessageHandler`interfaccia per ogni tipo di messaggio che desideri elaborare. La mappatura tra tipi di messaggi e gestori di messaggi viene configurata all'avvio del progetto.

```
await Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        // Register the AWS Message Processing Framework for .NET
        services.AddAWSMessageBus(builder =>
        {
            // Register an SQS Queue that the framework will poll for messages.
            // NOTE: The URL given below is an example. Use the appropriate URL for your SQS Queue.
            builder.AddSQSPoller("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd");

            // Register all IMessageHandler implementations with the message type they should process. 
            // Here messages that match our ChatMessage .NET type will be handled by our ChatMessageHandler
            builder.AddMessageHandler<ChatMessageHandler, ChatMessage>();
        });
    })
    .Build()
    .RunAsync();
```

Il codice seguente mostra un esempio di gestore di messaggi per un messaggio. `ChatMessage` 

```
public class ChatMessageHandler : IMessageHandler<ChatMessage>
{
    public Task<MessageProcessStatus> HandleAsync(MessageEnvelope<ChatMessage> messageEnvelope, CancellationToken token = default)
    {
        // Add business and validation logic here.
        if (messageEnvelope == null)
        {
            return Task.FromResult(MessageProcessStatus.Failed());
        }

        if (messageEnvelope.Message == null)
        {
            return Task.FromResult(MessageProcessStatus.Failed());
        }

        ChatMessage message = messageEnvelope.Message;

        Console.WriteLine($"Message Description: {message.MessageDescription}");

        // Return success so the framework will delete the message from the queue.
        return Task.FromResult(MessageProcessStatus.Success());
    }
}
```

L'esterno `MessageEnvelope` contiene i metadati utilizzati dal framework. `message`La sua proprietà è il tipo di messaggio (in questo caso`ChatMessage`).

Puoi tornare `MessageProcessStatus.Success()` a indicare che il messaggio è stato elaborato correttamente e il framework eliminerà il messaggio dalla coda di Amazon SQS. Al momento della restituzione`MessageProcessStatus.Failed()`, il messaggio rimarrà in coda dove potrà essere nuovamente elaborato o spostato in una coda di [lettere morte, se configurato](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html).

## Gestione dei messaggi in un processo di lunga durata
<a name="long-running-process"></a>

Puoi chiamare `AddSQSPoller` con un URL di coda SQS per avviare un processo di lunga durata [https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.backgroundservice](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.backgroundservice)che esegua il polling continuo della coda ed elabori i messaggi.

```
await Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        // Register the AWS Message Processing Framework for .NET
        services.AddAWSMessageBus(builder =>
        {
            // Register an SQS Queue that the framework will poll for messages.
            // NOTE: The URL given below is an example. Use the appropriate URL for your SQS Queue.
            builder.AddSQSPoller("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd", options => 
            {
                // The maximum number of messages from this queue that the framework will process concurrently on this client.
                options.MaxNumberOfConcurrentMessages = 10;

                // The duration each call to SQS will wait for new messages.
                options.WaitTimeSeconds = 20; 
            });

            // Register all IMessageHandler implementations with the message type they should process.
            builder.AddMessageHandler<ChatMessageHandler, ChatMessage>();
        });
    })
    .Build()
    .RunAsync();
```

### Configurazione di SQS Message Poller
<a name="config-msg-poller"></a>

Il poller dei messaggi SQS può essere configurato da when call. `SQSMessagePollerOptions` `AddSQSPoller`
+ `MaxNumberOfConcurrentMessages`- Il numero massimo di messaggi dalla coda da elaborare contemporaneamente. Il valore predefinito è 10.
+ `WaitTimeSeconds`- La durata (in secondi) per cui la chiamata `ReceiveMessage` SQS attende l'arrivo di un messaggio nella coda prima di tornare. Se un messaggio è disponibile, la chiamata ritorna prima del. `WaitTimeSeconds` Il valore predefinito è 20.

**Gestione del timeout di visibilità dei messaggi**

I messaggi SQS hanno un periodo di [timeout di visibilità](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html). Quando un consumatore inizia a gestire un determinato messaggio, questo rimane in coda ma viene nascosto agli altri consumatori per evitare di elaborarlo più di una volta. Se il messaggio non viene gestito ed eliminato prima di diventare nuovamente visibile, un altro consumatore potrebbe tentare di gestire lo stesso messaggio.

Il framework traccerà e tenterà di estendere il timeout di visibilità per i messaggi che sta attualmente gestendo. È possibile configurare questo comportamento su `SQSMessagePollerOptions` when call`AddSQSPoller`.
+ `VisibilityTimeout`- La durata in secondi in cui i messaggi ricevuti vengono nascosti alle successive richieste di recupero. Il valore predefinito è 30.
+ `VisibilityTimeoutExtensionThreshold`- Quando il timeout di visibilità di un messaggio rientra in questo numero di secondi dalla scadenza, il framework prolungherà il timeout di visibilità (di altri secondi). `VisibilityTimeout` Il valore predefinito è 5.
+ `VisibilityTimeoutExtensionHeartbeatInterval`- Con quale frequenza, in secondi, il framework verificherà la presenza di messaggi che mancano pochi `VisibilityTimeoutExtensionThreshold` secondi alla scadenza e quindi ne estenderà il timeout di visibilità. Il valore predefinito è 1.

 Nell'esempio seguente, il framework controllerà ogni secondo i messaggi che sono ancora in fase di gestione. Per quei messaggi entro 5 secondi dalla loro nuova visibilità, il framework prolungherà automaticamente il timeout di visibilità di ogni messaggio di altri 30 secondi.

```
// NOTE: The URL given below is an example. Use the appropriate URL for your SQS Queue.
builder.AddSQSPoller("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd", options => 
{
    options.VisibilityTimeout = 30;
    options.VisibilityTimeoutExtensionThreshold = 5;
    VisibilityTimeoutExtensionHeartbeatInterval = 1;
});
```

## Gestione dei messaggi nelle funzioni AWS Lambda
<a name="lambda-functions"></a>

Puoi utilizzare il AWS Message Processing Framework per .NET con [l'integrazione di SQS con Lambda](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html). Questo è fornito dal pacchetto. `AWS.Messaging.Lambda` Consulta il suo [README](https://github.com/aws/aws-dotnet-messaging/blob/main/src/AWS.Messaging.Lambda/README.md) per iniziare.

# Utilizzo di FIFO con il AWS Message Processing Framework per .NET
<a name="msg-proc-fw-fifo"></a>

[Per i casi d'uso in cui l'ordine e la deduplicazione dei messaggi sono fondamentali, il AWS Message Processing Framework for .NET supporta le [code Amazon SQS first-in-first-out (FIFO) e gli argomenti di Amazon SNS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-fifo-queues.html).](https://docs.aws.amazon.com/sns/latest/dg/sns-fifo-topics.html)

## Pubblicazione
<a name="mpf-fifo-publish"></a>

Quando si pubblicano messaggi su una coda o un argomento FIFO, è necessario impostare l'ID del gruppo di messaggi, che specifica il gruppo a cui appartiene il messaggio. I messaggi all'interno di un gruppo vengono elaborati in ordine. Puoi impostarlo sugli editori di messaggi specifici per SQL e SNS.

```
await _sqsPublisher.PublishAsync(message, new SQSOptions
{
    MessageDeduplicationId = <message-deduplication-id>,
    MessageGroupId = <message-group-id>
});
```

## Sottoscrizione in corso
<a name="mpf-fifo-subscribe"></a>

Quando si gestiscono i messaggi da una coda FIFO, il framework gestisce i messaggi all'interno di un determinato gruppo di messaggi nell'ordine in cui sono stati ricevuti per ogni chiamata. `ReceiveMessages` Il framework entra automaticamente in questa modalità operativa quando è configurato con una coda che termina con. `.fifo`

```
await Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        // Register the AWS Message Processing Framework for .NET.
        services.AddAWSMessageBus(builder =>
        {
            // Because this is a FIFO queue, the framework automatically handles these messages in order.
            builder.AddSQSPoller("https://sqs.us-west-2.amazonaws.com/012345678910/MPF.fifo");
            builder.AddMessageHandler<OrderMessageHandler, OrderMessage>();
        });
    })
    .Build()
    .RunAsync();
```

# Registrazione e telemetria aperta per il AWS Message Processing Framework per.NET
<a name="msg-proc-fw-telemetry"></a>

Il AWS Message Processing Framework per .NET è progettato OpenTelemetry per registrare [le tracce](https://opentelemetry.io/docs/concepts/signals/traces/) per ogni messaggio pubblicato o gestito dal framework. Questo è fornito dal pacchetto. [https://www.nuget.org/packages/AWS.Messaging.Telemetry.OpenTelemetry](https://www.nuget.org/packages/AWS.Messaging.Telemetry.OpenTelemetry) Consulta il suo [README](https://github.com/aws/aws-dotnet-messaging/blob/main/src/AWS.Messaging.Telemetry.OpenTelemetry/README.md) per iniziare.

**Nota**  
Per informazioni di sicurezza relative alla registrazione, vedere. [Sicurezza per il AWS Message Processing Framework per.NET](msg-proc-fw-security.md)

# Personalizzazione del framework di elaborazione dei AWS messaggi per.NET
<a name="msg-proc-fw-customize"></a>

Il AWS Message Processing Framework per .NET crea, invia e gestisce i messaggi in tre diversi «livelli»:

1. Al livello più esterno, il framework crea la richiesta o la risposta AWS-native specifica per un servizio. Con Amazon SQS, ad esempio, crea [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)richieste e lavora con gli [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Message.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Message.html)oggetti definiti dal servizio.

1. [All'interno della richiesta e della risposta SQS, il framework imposta l'`MessageBody`elemento (o `Message` per Amazon SNS `Detail` o EventBridge Amazon) su un formato JSON. CloudEvent](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/formats/json-format.md) Contiene i metadati impostati dal framework accessibile sull'oggetto durante la gestione di un messaggio. `MessageEnvelope`

1. Al livello più interno, l'`data`attributo all'interno dell'oggetto CloudEvent JSON contiene una serializzazione JSON dell'oggetto.NET che è stato inviato o ricevuto come messaggio.

   ```
   {
       "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>"
   }
   ```

È possibile personalizzare la modalità di configurazione e lettura della busta del messaggio:
+ `"id"`identifica in modo univoco il messaggio. Per impostazione predefinita è impostato su un nuovo GUID, ma questo può essere sovrascritto implementando il proprio `IMessageIdGenerator` e inserendolo nel contenitore DI. 
+ `"type"`controlla come il messaggio viene indirizzato ai gestori. Per impostazione predefinita, utilizza il nome completo del tipo.NET che corrisponde al messaggio. È possibile sovrascriverlo tramite il `messageTypeIdentifier` parametro durante la mappatura del tipo di messaggio alla destinazione tramite `AddSQSPublisher``AddSNSPublisher`, o. `AddEventBridgePublisher`
+ `"source"`indica quale sistema o server ha inviato il messaggio.
  + Questo sarà il nome della funzione in caso di pubblicazione da AWS Lambda, il nome del cluster e l'ARN dell'attività se su Amazon ECS, l'ID dell'istanza se su Amazon EC2, altrimenti un valore di fallback di. `/aws/messaging` 
  + Puoi sovrascriverlo tramite `AddMessageSource` o su. `AddMessageSourceSuffix` `MessageBusBuilder`
+ `"time"`impostato sulla corrente DateTime in UTC. Questo può essere sovrascritto implementando il proprio `IDateTimeHandler` e iniettandolo nel contenitore DI.
+ `"data"`contiene una rappresentazione JSON dell'oggetto.NET che è stato inviato o ricevuto come messaggio:
  + `ConfigureSerializationOptions`on `MessageBusBuilder` consente di configurare [https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions](https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions)ciò che verrà utilizzato durante la serializzazione e la deserializzazione del messaggio.
  + Per inserire attributi aggiuntivi o trasformare la busta del messaggio una volta creata dal framework, puoi implementarla e registrarla tramite on. `ISerializationCallback` `AddSerializationCallback` `MessageBusBuilder`

# Sicurezza per il AWS Message Processing Framework per.NET
<a name="msg-proc-fw-security"></a>

Il AWS Message Processing Framework per .NET si basa su AWS SDK per .NET per comunicare con. AWS Per ulteriori informazioni sulla sicurezza in AWS SDK per .NET, vedere. [Sicurezza per questo AWS prodotto o servizio](security.md)

Per motivi di sicurezza, il framework non registra i messaggi di dati inviati dall'utente. Se si desidera abilitare questa funzionalità per scopi di debug, è necessario chiamare `EnableDataMessageLogging()` il Message Bus come segue:

```
builder.Services.AddAWSMessageBus(bus =>
{
    builder.EnableDataMessageLogging();
});
```

Se scoprite un potenziale problema di sicurezza, fate riferimento alla [politica di sicurezza](https://github.com/aws/aws-dotnet-messaging/security/policy) per la segnalazione delle informazioni.