Das Problem hierbei ist, dass der webjob SDK keine Ahnung hat, die Nachricht vom Typ A oder B ist
So wie Sie sagen, Sie haben die Möglichkeit, Deserialisieren manuell die brokered Nachricht. Ich denke, dass Sie eine Eigenschaft auf Ihrer vermittelten Nachricht hinzufügen sollten, um den Typ der Nachricht anzugeben.
So eine Nachricht senden es so etwas wie das sein könnte:
// 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
...
So, jetzt nur Sie eine Funktion in Ihrem webjob haben
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
}
}
Ansonsten können Sie getrennte Warteschlangen erstellen für jede Art von Nachricht Oder erstellen Sie eine service bus topic mit zwei Abonnements.
Beim Erstellen eines Abonnements können Sie einen Filter angeben.
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'"));
So jetzt können Sie zwei verschiedene Funktionen in Ihrem Webjob haben, um MessageA und MessageB zu behandeln.
public static void ProcessMessageA([ServiceBusTrigger("TestTopic", "MessageA")] MessageA message) { }
public static void ProcessMessageB([ServiceBusTrigger("TestTopic", "MessageB")] MessageB message) { }