Introduction
In this article, we will learn about how to create a Web Job using .Net Core with Service bus triggered.
Prerequisite
- Microsoft Azure account.
- .Net Core 3.1
- Visual Studio 2019 will be preferable.
What is Web Job
Web Job is something like a scheduler. We can set functionality to run in a specific interval of time or we can trigger a Web job when a new message came in Message Queue. We can trigger a web job in three different ways. Web Jobs can be triggered on Queue, Service Bus, Blob, etc. Here I giving some detail to create ServiceBus Trigger.
We can split code based on the following,
- Web job creation
- Sending a message to Queue to trigger Web job
- Debugging and check
Web Job creation
Step 1
Create Azure ServiceBus namespace from Azure Portal (www.Portal.azure.com).
After creating Service Bus Namespace,
Step 2
Create a .Net Core - C# Console application. The framework you can select is .Net Core 3.1.
Step 3
Add "Javascript JSON Configuration File". Specify the file name as "appsettings.json". Right-click and select the Properties of "appsettings.json" and Select "Copy To Output Directory" = "Copy If Never".
For taking ServiceBus ConnectionString, Navigate to Service Bus > Shared access policies > RootManageSharedAccessKey > Primary Connection String > click on the copy button on the right side of the text box.
{
"AzureWebJobsServiceBus": "<Place Your Service Bus Primary Connection String Here>"
}
Step 4
Open Program.cs and add the following namespace.
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
You can use the following command to install the package on NuGet Package Manager Console ( First package is for -> HostBuilder() | 2nd is for -> AddServiceBus() ).
PM> Install-Package Microsoft.Azure.WebJobs.Extensions -version 4.0.1
PM> Install-Package Microsoft.Azure.WebJobs.Extensions.ServiceBus -IncludePrerelease
Add the following code for creating a Host,
class Program {
static async Task Main() {
var hostBuilder = new HostBuilder();
hostBuilder.ConfigureWebJobs((context, builder) => {
builder.AddServiceBus(options => options.MaxConcurrentCalls = 1);
});
var host = hostBuilder.Build();
using(host) {
await host.RunAsync();
}
}
}
Step 5
Add a Class file named Functions.cs. Add the following namespaces.
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
Install the package using the following commands. The following command is for installing Logging methods. Microsoft.Azure.WebJobs, is already a part of the previously installed package.
PM> Install-Package Microsoft.Extensions.Logging.Console -version 5.0.0
Use the following code for triggering a function, when any message is in the service bus message queue.
public class Functions {
public static void processservicebus([ServiceBusTrigger("webjob1", Connection = "AzureWebJobsServiceBus")] string myQueueItem, ILogger log) {
log.LogInformation(myQueueItem);
}
}
You have to remember the Queue name (Queue name you can use any string), whatever you are giving here same needs to give in the Client-side method also.
Sending a message to Queue to trigger Web job
Now we can go ahead and create code to send messages.
Step 1
Create another Net Core - C# Console application. The framework you can select is .Net Core 3.1.
Step 2
Open Program.cs and add the following namespace.
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;
using System.Text.Json;
And use the following code to send messages.
public class Program {
static string connectionString = "<Place your ServiceBus Connection String Here>";
private static ServiceBusClient _client;
private static ServiceBusSender _clientSender;
private
const string QUEUE_NAME = "webjob1"; // It should be as same as queue name given in the Host creation time
static async Task Main() {
_client = new ServiceBusClient(connectionString);
_clientSender = _client.CreateSender(QUEUE_NAME);
Messages objMessage = new Messages() {
MessageId = 1, Subject = "First Message"
};
string messagePayload = JsonSerializer.Serialize(objMessage);
ServiceBusMessage message = new ServiceBusMessage(messagePayload);
await _clientSender.SendMessageAsync(message).ConfigureAwait(false);
}
public class Messages {
public int MessageId {
get;
set;
}
public string Subject {
get;
set;
}
}
}
All codes are done for the creation of Host and sending messages to Message Queue. Once any new message came in the Message Queue, then the following function will trigger automatically.
public static void processservicebus([ServiceBusTrigger("webjob1", Connection = "AzureWebJobsServiceBus")] string myQueueItem,ILogger log)
You can use the same implementation in your project to achieve something like, when a new file user uploads into your application, then you need to insert records from that file into the system with some validation. So that you can do, Once any new file came into the application then you can send those file detail as a Message and Process that file. You can call the file processing method inside the above method.
Debugging and check
Step 1
Right-click on your Host Project and select Debug > Start New Instance.
Then the following console is to be loaded. By this step, we can assume that our Webjob is up.
Put a breakpoint in the following method,
public static void processservicebus([ServiceBusTrigger("webjob1", Connection = "AzureWebJobsServiceBus")] string myQueueItem,ILogger log)
Step 2
Now the same way you can start a Message sending console application also. Once that is up (message is sent), then you will get a call in the above method.
Publishing Web Job
You can publish your Web job from the Visual studio itself. Please follow the following steps. We are publishing Web Job into App Service. If we are going with the below step, then there is an option to create App Service (in the 3rd screenshot).
If you are choosing Azure Portal to create and Publish a Web Job then follow the following steps.
Add App Service
Click on the App Service you created. And select Web Job from the Left side menu.
Click on "+ Add". Give Web Job Name. In the File Upload section, you can select the Exe file from the Release folder of the Host Project. And you can give Type = Triggered and Triggers = Manual.
This will create a Web job for you.
Go to Advanced Tool > Go.
Click on Site > wwwroot > AppData > jobs > triggered > Open the folder <same name as Web Job>.
Now you can drag and drop all DLL into that folder.
Conclusion
In this article, we learned the basic steps of how to create a Web Job that is triggered by Service Bus and how we can publish code to Azure.