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