Je développe un exécutable Azure WebJobs que je souhaiterais utiliser avec plusieurs sites Web Azure. Chaque site Web aurait besoin de sa propre file d'attente Azure Storage.
Le problème que je vois est que ProcessQueueMessage
nécessite que le nom de la file d'attente soit défini de manière statique en tant qu'attribut du premier paramètre inputText
. Je préférerais que le nom de la file d'attente soit une propriété de configuration de l'instance de site Web Azure en cours d'exécution et que l'exécutable du travail le lise au moment de l'exécution au démarrage.
Y a-t-il un moyen de faire ça?
Cela peut maintenant être fait. Créez simplement une INameResolver
pour vous permettre de résoudre toute chaîne entourée de signes% (pour cent). Par exemple, s'il s'agit de votre fonction avec un nom de file d'attente spécifié:
public static void WriteLog([QueueTrigger("%logqueue%")] string logMessage)
{
Console.WriteLine(logMessage);
}
Notez qu’il existe des signes de pourcentage (pour cent) autour de la chaîne logqueue
. Cela signifie que le système de travail essaiera de résoudre le nom en utilisant une variable INameResolver
que vous pourrez créer puis enregistrer avec votre travail.
Voici un exemple de résolveur qui prend simplement la chaîne spécifiée dans les signes de pourcentage et la recherche dans vos AppSettings dans le fichier de configuration:
public class QueueNameResolver : INameResolver
{
public string Resolve(string name)
{
return ConfigurationManager.AppSettings[name].ToString();
}
}
Et puis dans votre fichier Program.cs, il vous suffit de câbler ceci:
var Host = new JobHost(new JobHostConfiguration
{
NameResolver = new QueueNameResolver()
});
Host.RunAndBlock();
C'est probablement une vieille question, mais au cas où quelqu'un d'autre tomberait sur ce post. Ceci est maintenant supporté en passant un objet JobHostConfiguration
dans le constructeur JobHost.
Une légère amélioration de la mise en œuvre du résolveur de noms afin d’éviter à tout moment la récupération de la configuration. Utilise dictionnaire pour stocker les valeurs de configuration une fois récupérées.
using Microsoft.Azure.WebJobs;
using System.Collections.Generic;
using System.Configuration;
public class QueueNameResolver : INameResolver
{
private static Dictionary<string, string> keys = new Dictionary<string, string>();
public string Resolve(string name)
{
if (!keys.ContainsKey(name))
{
keys.Add(name, ConfigurationManager.AppSettings[name].ToString());
}
return keys[name];
}
}
Malheureusement, ce n'est pas possible. Vous pouvez utiliser l'interface IBinder
pour établir une liaison dynamique avec une file d'attente, mais vous ne disposez pas du mécanisme de déclenchement correspondant.
Fondamentalement, le nom de la file d’entrée doit être codé en dur si vous voulez des déclencheurs. Pour la sortie, vous pouvez utiliser l'interface mentionnée précédemment.
Voici un exemple pour IBinder
. L'exemple lie un blob dynamiquement, mais vous pouvez faire quelque chose de très similaire pour les files d'attente.