Le problème ici est que le SDK de webjob n'a aucune idée de quel message est de type A ou B.
Donc, comme vous l'avez dit, vous avez la possibilité de désérialiser manuellement le message négocié. Je pense que vous devriez ajouter une propriété sur votre message brokered pour spécifier le type du message.
Donc pour envoyer un message, ça pourrait être quelque chose comme ça :
// Create the object you want to send
var messageA = new MessageA();
...
// Create the borkered message
var message = new BrokeredMessage(messageA);
// Add a property
message.Properties["messageType"] = "MessageA";
// Send the message
...
Donc maintenant vous n'avez qu'une seule fonction dans votre webjob
public static void ProcessMessageA([ServiceBusTrigger("MessageQueue")] BrokeredMessage message)
{
var messageType = (string) message.Properties["messageType"];
if (messageType == "MessageA")
{
// Deserialize the message
var messageA = message.GetBody<MessageA>();
// Process the message
}
else if (messageType == "MessageB")
{
// Deserialize the message
var messageB = message.GetBody<MessageB>();;
// Process the message
}
}
Sinon, vous pouvez créer des files d'attente distinctes pour chaque type de message. Ou créer une sujet sur le bus de service avec deux abonnements.
Lors de la création d'un abonnement, vous pouvez spécifier un filtre.
string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
// Create the topic
namespaceManager.CreateTopic("TestTopic");
// Create subscription to handle message A
namespaceManager.CreateSubscription("TestTopic", "MessageA", new SqlFilter("messageType = 'MessageA'"));
// Create subscription to handle message A
namespaceManager.CreateSubscription("TestTopic", "MessageB", new SqlFilter("messageType = 'MessageB'"));
Maintenant, vous pouvez avoir deux fonctions différentes dans votre webjob pour gérer MessageA et MessageB.
public static void ProcessMessageA([ServiceBusTrigger("TestTopic", "MessageA")] MessageA message) { }
public static void ProcessMessageB([ServiceBusTrigger("TestTopic", "MessageB")] MessageB message) { }