0

I have 2 Web APIs developed on ASP.NET Core. The idea is: the WebAPI_1 sends a message to the Azure Service Bus and then WebAPI_2 has to catch this moment and read it shortly after the message is sent. I understand how to catch this moment is I have a console app instead of WebAPI_2, but I am not sure how to subscribe WebAPI_2 on such the event happening in Azure Service Bus. Below is the code where I have WebAPI_1 and the Console App.

WebAPI_1 (Sender):

public class QueueService : IQueueService
{
    private readonly IConfiguration _config;

    public QueueService(IConfiguration config)
    {
        _config = config;
    }

    public async Task SendMessageAsync<T>(T serviceBusMessage, string queueName)
    {
        var queueClient = new QueueClient(_config.GetConnectionString("AzureServiceBus"), queueName);
        string messageBody = JsonSerializer.Serialize(serviceBusMessage);
        var message = new Message(Encoding.UTF8.GetBytes(messageBody));

        await queueClient.SendAsync(message);
    }
}

And this is how I send it:

 await queue.SendMessageAsync(obj, "myqueue");

And this is the Console App (Receiver):

Main(){
        queueClient = new QueueClient(connectionString, queueName);

        var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
        {
            MaxConcurrentCalls = 1,
            AutoComplete = false
        };

        queueClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
}

private static async Task ProcessMessagesAsync(Message message, CancellationToken token)
{
    var jsonString = Encoding.UTF8.GetString(message.Body);
    Model obj = JsonSerializer.Deserialize<Model>(jsonString);
    Console.WriteLine($"Person Received: { obj.Field1} { obj.Field2}");

    await queueClient.CompleteAsync(message.SystemProperties.LockToken);
}

But I want WebAPI_2 to be able to receive the messages instead of the Console App. Please advise.

1 Answers1

0

Receiving messages requires a continuous job. ASP.NET Core Controller, as you've probably found out, is not the right place as it's not running continuously and is intended to respond to the request. For a continuous execution, a background service, or task, is the right option. ASP.NET Core has an option to run a BackgroundService that could be used for exactly what you need.

There are multiple blog posts with the details in case you want to get some inspiration:

Sean Feldman
  • 23,443
  • 7
  • 55
  • 80