Я использую функциональные приложения Azure с триггером служебной шины, чтобы читать служебную шину и что-то делать с содержимым сообщения служебной шины. Служебная шина получает сериализованный объект JSON, а затем я отменяю сериализацию сообщения JSON обратно в объект в приложении Function. Однако по какой-то причине всякий раз, когда что-то отправляется на служебную шину, триггер срабатывает дважды, один из которых является сообщением JSON, а другой - сообщением, содержащим текст «Сообщение служебной шины».
Я понятия не имею, что вызываетВторое сообщение, так что я придумал только десериализацию сообщения служебной шины, и когда оно завершится ошибкой с сообщением служебной шины, я просто поймаю исключение и проигнорирую его. Однако я не думаю, что это правильный способ решения этой проблемы, и фактические ошибки в десериализации JSON будут игнорироваться. Как правильно обработать второе сообщение?
Пример кода:
using Newtonsoft.Json;
public static void Run(string myQueueItem, ILogger log, out SendGridMessage mailMessage)
{
MyClass myObject = null;
try
{
myObject = JsonConvert.DeserializeObject<MyClass>(myQueueItem);
// do stuff
}
catch (JsonException je)
{
// ignore this exception
}
catch (Exception e)
{
// handle the other exceptions and send an alert
}
}
Редактировать: Одна вещь, которую я не учел в оригинальном сообщении, это то, что у меня тоже есть вывод SendGrid,Я не понимаю, почему это повлияет на триггер, и поэтому я его не включил. Тем не менее, я добавляю его сейчас на случай, если это может быть причиной по какой-то странной причине.
Редактировать 2: Добавлен полный рабочий код, освещающий проблему
// Sender
using System;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.ServiceBus;
using Newtonsoft.Json;
namespace myapp
{
class Program
{
static void Main(string[] args) => MainAsync().GetAwaiter().GetResult();
static async Task MainAsync()
{
string serviceBusConnectionString = "<your servicebus connectionstring>";
string queueName = "<your queue name>";
IQueueClient queueClient = new QueueClient(serviceBusConnectionString, queueName);
string messageBody = JsonConvert.SerializeObject(new Test());
var message = new Message(Encoding.UTF8.GetBytes(messageBody));
await queueClient.SendAsync(message);
await queueClient.CloseAsync();
}
class Test
{
public string Text { get; set; } = "test";
}
}
}
// Receiver
#r "Newtonsoft.Json"
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
public static void Run(string myQueueItem, ILogger log)
{
try
{
Test test = JsonConvert.DeserializeObject<Test>(myQueueItem);
log.LogInformation($"C# ServiceBus queue trigger function processed message: {test.Text}");
}
catch (Exception e)
{
log.LogInformation($"Exception: {e.Message}");
}
}
class Test
{
public string Text { get; set; } = "test";
}
Результат:
2019-11-04T08:38:10.544 [Information] Executing 'Functions.test' (Reason='This function was programmatically called via the host APIs.', Id=06e10006-baa6-430f-b5db-9a5eae5c154c)
2019-11-04T08:38:10.659 [Information] Exception: Unexpected character encountered while parsing value: S. Path '', line 0, position 0. // This here is caused by "Service bus message"
2019-11-04T08:38:10.659 [Information] Executed 'Functions.test' (Succeeded, Id=06e10006-baa6-430f-b5db-9a5eae5c154c)
2019-11-04T08:39:02.582 [Information] Executing 'Functions.test' (Reason='New ServiceBus message detected on 'test'.', Id=5d7622a7-cc8d-44c9-8720-626fdbb8cabb)
2019-11-04T08:39:02.583 [Information] Trigger Details: MessageId: 13bba779fd524fa1a0098acd6634aded, DeliveryCount: 1, EnqueuedTime: 11/4/2019 8:39:02 AM, LockedUntil: 11/4/2019 8:39:07 AM
2019-11-04T08:39:02.584 [Information] C# ServiceBus queue trigger function processed message: test // This here is the actual message
2019-11-04T08:39:02.584 [Information] Executed 'Functions.test' (Succeeded, Id=5d7622a7-cc8d-44c9-8720-626fdbb8cabb)