Проблема здесь состоит в том, что webjob SDK не имеет представления о том, какое сообщение имеет тип A или B.
Так как вы сказали, что вы имеете возможность десериализации вручную посредником сообщения. Я думаю, вы должны добавить свойство в своем брокерском сообщении, чтобы указать тип сообщения.
Так, чтобы отправить сообщение, что может быть что-то вроде этого:
// 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
...
Так что теперь у вас есть только одна функция в вашем 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
}
}
В противном случае вы можете создать отдельные очереди для каждого типа сообщение Или создайте service bus topic с двумя подписками.
При создании подписки вы можете указать фильтр.
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'"));
Итак, теперь вы можете иметь две различные функции в своем веб-блоге для обработки MessageA и MessageB.
public static void ProcessMessageA([ServiceBusTrigger("TestTopic", "MessageA")] MessageA message) { }
public static void ProcessMessageB([ServiceBusTrigger("TestTopic", "MessageB")] MessageB message) { }