Every now and then you are thrown into projects were you might not be the perfect pick from start. I seldom work with .NET and this project was just that 🙂 I was asked to create a small .NET proof-of-concept application in C# that fetches messages from a AMQP broker using mTLS authentication. I post the solution so it might benefit someone else (did not find much about this on Google)
Here is the result:
using Amqp;
using Amqp.Sasl;
using Microsoft.Extensions.Logging;
namespace DotNETApps
{
class Program
{
static async Task Main(string[] args)
{
using var loggerFactory = LoggerFactory.Create(builder =>
{
builder
.AddConsole()
.SetMinimumLevel(LogLevel.Debug);
});
ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("Application started.");
Address address = new Address("amqps://mydomain:5671");
var factory = new ConnectionFactory();
factory.SSL.ClientCertificates.Add(new
System.Security.Cryptography.X509Certificates
.X509Certificate2("c:\\myclientcert.pfx", "secret"));
factory.SASL.Profile = SaslProfile.Anonymous;
try {
logger.LogInformation("Connecting to broker...");
Connection connection = await factory.CreateAsync(address);
logger.LogInformation("Connected to broker.");
Session session = new Session(connection);
ReceiverLink receiver =
new ReceiverLink(session, "receiver-link", "MYQUEU");
Console.WriteLine("Receiver connected to broker.");
Message message = await Task.Run(() =>
receiver.Receive(TimeSpan.FromMilliseconds(2000)));
if (message == null)
{
Console.WriteLine("No message received.");
receiver.Close();
session.Close();
connection.Close();
return;
}
Console.WriteLine("Received " + message.Body);
receiver.Accept(message);
receiver.Close();
session.Close();
connection.Close();
}
catch (Exception e)
{
logger.LogError(e, "An error while processing messages.");
}
logger.LogInformation("Application ended.");
}
}
}
Tested on Windows 10, AMQPNETLite v2.4.11, .NET 8.0 and Visual Studio Code 1.97.0