3
votes

Fonctions Azure: le déclencheur de file d'attente attend des messages en base 64 et ne les traite pas correctement

J'ai ce Queue Trigger . L'attendu est que lorsque j'insère un message dans la Queue , le déclencheur doit se déclencher et traiter le message retiré de la file d'attente.

 public async Task<Response<SendReceipt>> SendAsBase64Async(string message)
 {
      byte[] buffer = Encoding.Unicode.GetBytes(message);
      string msg = Convert.ToBase64String(buffer);

      return await _queue.SendMessageAsync(msg);

 }

Le déclencheur est activé normalement, mais ce comportement étrange se produit. La fonction s'attend apparemment à ce que le message soit encodé en Base-64 .

Paramètre de liaison d'exception 'myQueueItem' <--- L'entrée n'est pas une chaîne de base 64 valide car elle contient un caractère non en base 64, plus de deux caractères de remplissage ou un caractère illégal parmi les caractères de remplissage.

Azure.Storage.Queues messages à la file d'attente à l'aide de cette méthode à partir de la bibliothèque Azure Queue v.12 d' Azure.Storage.Queues et Azure.Storage.Queues trouvé aucune surcharge qui encode le message en Base-64 . Notez que _queue est une instance de QueueClient .

 public async Task<Response<SendReceipt>> SendAsync(string message)
 {
        return await _queue.SendMessageAsync(message);
 }

J'ai donc essayé d'encoder le message moi-même ...

    [FunctionName("NewPayrollQueueTrigger")]
    public async static void Run([QueueTrigger("myqueue", Connection = 
    "AzureWebJobsStorage")]string myQueueItem,
        [DurableClient] IDurableOrchestrationClient starter,
        ILogger log)
    {
        log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

        await starter.StartNewAsync("NewPayrollOrchestrator", input: myQueueItem);

    }

... et ça ne marche pas non plus. Voici mon code passant par cette partie mais lançant une erreur plus loin, indiquant qu'il pourrait obtenir le message mais qu'il n'a pas été décodé correctement, car il s'agissait du nom de fichier d'un objet blob existant dans un stockage:

Erreur de décodage

Le seul moyen de faire fonctionner cela est d'envoyer manuellement un message à la file d'attente à l'aide de l' Azure Storage Explorer choisissant d'encoder le message via l'interface utilisateur.


2 commentaires

quel est le message que vous essayez de mettre en file d'attente?


celui en question était raw20200721061429372.pdf


3 Réponses :


0
votes

Vous utilisez l'ancienne version du package nuget. Mettez à niveau vers Azure.Storage.Queue et cela devrait fonctionner comme prévu


1 commentaires

J'utilise Azure.Storage.Queues comme je l'ai décrit, _queue est une instance de QueueClient comme indiqué dans la documentation .



8
votes

Utilisez le Azure.Storage.Queues Azure.Storage.Queues et utilisez le code suivant pour convertir la chaîne en codage Base 64. Vous devez encoder en utilisant Encoding.UTF8.GetBytes (plainText) .

await queueClient.SendMessageAsync(Base64Encode(serializedCommand), cancellationToken);

private static string Base64Encode(string plainText)
{
    var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
    return System.Convert.ToBase64String(plainTextBytes);
}

Pour plus de détails, vous pouvez vous référer à ce problème .


2 commentaires

J'utilise Azure.Storage.Queues comme je l'ai décrit, _queue est une instance de QueueClient comme indiqué dans la documentation . Je fais exactement ce que vous avez publié, s'il vous plaît, regardez le troisième bloc de code dans la question.


Oh, j'ai trouvé mon erreur. Pouvez-vous souligner dans votre réponse que vous devez encoder en utilisant Encoding.UTF8.GetBytes (plainText) et non Encoding.Unicode.GetBytes (plainText) comme je l'ai fait en premier? Il doit être encodé au format UTF-8 ! Maintenant ça marche!



1
votes

Comme alternative, vous pouvez tirer parti de la fonctionnalité intégrée pour convertir le message en Base64 en créant le client avec un QueueClientOptions avec MessageEncoding défini sur QueueMessageEncoding.Base64 .

Par exemple:

_queue = new QueueClient(connectionString, queueName, new QueueClientOptions
{
    MessageEncoding = QueueMessageEncoding.Base64
});

...

var message = "some message";
await _queue.SendMessageAsync(message); // Will be converted as Base64.


0 commentaires