NServiceBus C# (Cómo Funciona para Desarrolladores)
NServiceBus es un bus de servicio poderoso y adaptable diseñado para .NET Framework que simplifica el desarrollo de sistemas distribuidos. Los patrones de mensajería sólidos que ofrece garantizan el manejo y entrega confiables de mensajes a través de varios microservicios y aplicaciones. NServiceBus abstrae la arquitectura de mensajería subyacente, permitiendo a los desarrolladores concentrarse en la lógica de negocio en lugar de las complejidades de construir sistemas distribuidos.
En contraste, IronPDF es una biblioteca .NET muy popular para generar, ver y modificar archivos PDF. Es bien conocido por ser fácil de usar y muy eficiente en la creación de PDFs desde varias fuentes, como archivos ASPX y HTML.
Los desarrolladores pueden construir sistemas de software confiables, escalables y mantenibles que generen y gestionen documentos PDF como parte de sus operaciones comerciales combinando NServiceBus e IronPDF.
En este artículo, veremos cómo configurar un simple proyecto C# NServiceBus e integrarlo con IronPDF, para que puedas construir un flujo de trabajo optimizado para gestionar y producir documentos PDF en una arquitectura de aplicación distribuida. Después de leer este tutorial introductorio, deberías saber exactamente cómo estas dos tecnologías efectivas pueden cooperar para simplificar tus tareas relacionadas con PDF en un entorno distribuido.
¿Qué es NServiceBus C#?
NServiceBus es un marco poderoso y adaptable que facilita crear sistemas distribuidos y arquitecturas orientadas a servicios en .NET. Al utilizar NServiceBus, puedes gestionar fácilmente varios tipos de mensajes y asegurar una comunicación confiable. Esto es crucial, particularmente en una aplicación web y arquitecturas similares donde el enrutamiento y procesamiento sin inconvenientes de mensajes son esenciales. Los handlers de mensajes de NServiceBus manejan eficazmente la recepción de mensajes, asegurando que cada componente lógico interactúe sin problemas. NServiceBus tiene las siguientes características importantes:

Características de NServiceBus
Comunicación basada en mensajes
NServiceBus fomenta la comunicación basada en mensajes entre diferentes servicios o componentes en un sistema. Al desacoplar componentes, este método crea diseños que son más fáciles de escalar y gestionar.
Mensajería fiable
Al gestionar automáticamente reintentos, colas de mensajes muertos y otras técnicas de tolerancia a fallos, garantiza una entrega de mensajes confiable. En sistemas distribuidos, donde las interrupciones de red y otros problemas de fallos son frecuentes, esta confiabilidad es esencial.
Modelo de publicación/suscripción
El patrón de publicación/suscripción es compatible con NServiceBus, permitiendo a los servicios publicar eventos y permitir que otros servicios se suscriban a estos eventos. Esto hace posibles arquitecturas impulsadas por eventos, en las que las modificaciones realizadas en eventos en un componente del sistema pueden provocar respuestas en otros componentes.
Gestión de Saga
Los procesos comerciales de larga duración pueden ser gestionados con NServiceBus gracias a su soporte integrado para sagas. Las sagas permiten que la plataforma de servicios maneje el estado y coordine operaciones complejas entre varios servicios.
Extensibilidad y personalización
Ofrece un nivel excepcional de extensibilidad, permitiendo a los desarrolladores personalizar la gestión, procesamiento y transporte de mensajes. Gracias a su adaptabilidad, puede utilizarse en una variedad de escenarios.
Integración con varias plataformas de mensajería
Numerosos sistemas de mensajería, incluidos MSMQ, RabbitMQ, Azure Service Bus, Amazon SQS, entre otros, pueden integrarse con NServiceBus. Esto permite a los desarrolladores seleccionar la solución de infraestructura de comunicaciones que mejor se adapte a sus requerimientos.
Crear y configurar NServiceBus en C#;
Primero debes configurar tu entorno de desarrollo, crear un proyecto básico y construir un servicio de mensajería y escenario básico antes de comenzar a usar NServiceBus en un proyecto C#. Aquí tienes una guía paso a paso para comenzar.
Crear un nuevo proyecto de Visual Studio
En Visual Studio, el proceso de crear un proyecto de consola es sencillo. Usa estos sencillos pasos en el entorno de Visual Studio para lanzar una Aplicación de Consola:
Asegúrese de haber instalado Visual Studio en su PC antes de usarlo.
Iniciar un nuevo proyecto
Haz clic en Archivo, luego selecciona Nuevo, y finalmente Proyecto.

Puedes seleccionar la plantilla "Aplicación de Consola" o "Aplicación de Consola (.NET Core)" de la lista de referencias de plantillas de proyectos a continuación.
Proporciona un nombre para tu proyecto en el campo "Nombre".

Elige una ubicación de almacenamiento para el proyecto.
Hacer clic en "Crear" iniciará el proyecto de aplicación de consola.

Instalar paquetes NServiceBus
Navega a Herramientas > Administrador de Paquetes NuGet > Consola del Administrador de Paquetes para abrir la Consola del Administrador de Paquetes NuGet.
Ejecuta el siguiente comando para instalar el paquete NuGet de NServiceBus.
Install-Package NServiceBus
Elija un transporte
El transporte es necesario para que NServiceBus reciba y envíe mensajes. Optaremos por el Transporte de Aprendizaje, ya que es fácil de usar y funciona bien para pruebas y desarrollo.
Instala el paquete para el Transporte de Aprendizaje ejecutando.
Install-Package NServiceBus.RabbitMQ
Configurar NServiceBus
Configurar el punto final
Configura la configuración del endpoint de NServiceBus en tu archivo Program.cs:
using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
class Program
{
static async Task Main()
{
Console.Title = "Sender";
var endpointConfiguration = new EndpointConfiguration("SenderEndpoint");
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
Console.WriteLine("Press Enter to send a message...");
Console.ReadLine();
// Send a message
var message = new MyMessage
{
Content = "Hello, NServiceBus with RabbitMQ!"
};
await endpointInstance.Send("ReceiverEndpoint", message).ConfigureAwait(false);
Console.WriteLine("Message sent. Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop().ConfigureAwait(false);
}
}using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
class Program
{
static async Task Main()
{
Console.Title = "Sender";
var endpointConfiguration = new EndpointConfiguration("SenderEndpoint");
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
Console.WriteLine("Press Enter to send a message...");
Console.ReadLine();
// Send a message
var message = new MyMessage
{
Content = "Hello, NServiceBus with RabbitMQ!"
};
await endpointInstance.Send("ReceiverEndpoint", message).ConfigureAwait(false);
Console.WriteLine("Message sent. Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop().ConfigureAwait(false);
}
}
Crear un mensaje
Para representar el mensaje, agrega una nueva clase.
public class MyMessage : IMessage
{
public string Content { get; set; }
}public class MyMessage : IMessage
{
public string Content { get; set; }
}Crear un gestor de mensajes
Para manejar el mensaje, agrega una nueva clase.
using NServiceBus;
using System.Threading.Tasks;
public class MyMessageHandler : IHandleMessages<MyMessage>
{
public Task Handle(MyMessage message, IMessageHandlerContext context)
{
Console.WriteLine($"Received message: {message.Content}");
return Task.CompletedTask;
}
}using NServiceBus;
using System.Threading.Tasks;
public class MyMessageHandler : IHandleMessages<MyMessage>
{
public Task Handle(MyMessage message, IMessageHandlerContext context)
{
Console.WriteLine($"Received message: {message.Content}");
return Task.CompletedTask;
}
}Enviar un mensaje
Envía un mensaje desde el Endpoint. Adapta tu método principal para transmitir un mensaje con la ayuda del handler.
using NServiceBus;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.Title = "Receiver";
var endpointConfiguration = new EndpointConfiguration("ReceiverEndpoint");
// Serialization configuration
endpointConfiguration.UseSerialization<NewtonsoftJsonSerializer>();
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.UseConventionalRoutingTopology(QueueType.Quorum);
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
endpointConfiguration.EnableInstallers();
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop().ConfigureAwait(false);
}
}using NServiceBus;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.Title = "Receiver";
var endpointConfiguration = new EndpointConfiguration("ReceiverEndpoint");
// Serialization configuration
endpointConfiguration.UseSerialization<NewtonsoftJsonSerializer>();
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.UseConventionalRoutingTopology(QueueType.Quorum);
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
endpointConfiguration.EnableInstallers();
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop().ConfigureAwait(false);
}
}
Inicia la aplicación y construye el proyecto. La consola debería mostrar el mensaje "Mensaje recibido: ¡Hola, NServiceBus!"
Empezando
En un proyecto de C#, integrar NServiceBus con RabbitMQ e IronPDF implica configurar mensajes entre NServiceBus y RabbitMQ, así como usar IronPDF para crear PDFs. Aquí tienes un cómo hacerlo detallado para comenzar:
¿Qué es IronPDF?
IronPDF es una biblioteca .NET diseñada para crear, leer, editar y convertir archivos PDF. Con ella, los programadores pueden trabajar con archivos PDF en aplicaciones C# o VB.NET con una herramienta poderosa e intuitiva. Las características y capacidades de IronPDF se describen completamente a continuación:

Características de IronPDF
Generación de PDF desde HTML
Convierte JavaScript, HTML y CSS a PDF. Soporta consultas de medios y diseño responsivo, dos estándares web contemporáneos. Útil para producir documentos PDF dinámicamente estilizados, facturas e informes usando HTML y CSS.
Edición de PDF
A PDFs ya existentes, añade texto, imágenes y otros materiales. Extrae texto e imágenes de archivos PDF. Combina varios PDFs en un archivo. Divide archivos PDF en varios documentos. Incluye anotaciones, pies de página, encabezados y marcas de agua.
Conversión de PDF
Convierte Word, Excel, imágenes y otros formatos de archivo a PDF. Conversión de PDF a imagen (PNG, JPEG, etc.).
Rendimiento y Confiabilidad
El alto rendimiento y la confiabilidad son los objetivos de diseño en entornos de producción. Administra eficientemente documentos grandes.
Instalación de IronPDF
Instala IronPDF abriendo la Consola del Administrador de Paquetes NuGet.
Install-Package IronPdf
Configurar el remitente con mensaje
Mensajes es un proyecto compartido (librería de clases) que el remitente y el destinatario utilizarán ambos. Define la clase de mensaje en el proyecto de Mensajes. Crea un nuevo proyecto de Librería de Clases llamado Mensajes y añádelo a la solución.
Definir el mensaje:
Dentro del proyecto de Mensajes, crea una nueva clase llamada GeneratePdfMessage.cs:
using NServiceBus;
public class GeneratePdfMessage : IMessage
{
public string Content { get; set; }
public string OutputPath { get; set; }
}using NServiceBus;
public class GeneratePdfMessage : IMessage
{
public string Content { get; set; }
public string OutputPath { get; set; }
}En los proyectos tanto del Remitente como del Receptor, incluye una referencia al proyecto de Mensajes.
Configura el endpoint de NServiceBus en el proyecto del Remitente para usar RabbitMQ para la entrega de mensajes.
using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
class Program
{
static async Task Main()
{
Console.Title = "Sender";
var endpointConfiguration = new EndpointConfiguration("SenderEndpoint");
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
endpointConfiguration.EnableInstallers();
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
Console.WriteLine("Press Enter to send a message...");
Console.ReadLine();
// Send a message
var message = new GeneratePdfMessage
{
Content = "<h1>Hello, NServiceBus with RabbitMQ and IronPDF!</h1>",
OutputPath = "output.pdf"
};
await endpointInstance.Send("ReceiverEndpoint", message).ConfigureAwait(false);
Console.WriteLine("Message sent. Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop().ConfigureAwait(false);
}
}using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
class Program
{
static async Task Main()
{
Console.Title = "Sender";
var endpointConfiguration = new EndpointConfiguration("SenderEndpoint");
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
endpointConfiguration.EnableInstallers();
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
Console.WriteLine("Press Enter to send a message...");
Console.ReadLine();
// Send a message
var message = new GeneratePdfMessage
{
Content = "<h1>Hello, NServiceBus with RabbitMQ and IronPDF!</h1>",
OutputPath = "output.pdf"
};
await endpointInstance.Send("ReceiverEndpoint", message).ConfigureAwait(false);
Console.WriteLine("Message sent. Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop().ConfigureAwait(false);
}
}Configuración del Endpoint: el endpoint se inicializa con el nombre "SenderEndpoint" llamando a new EndpointConfiguration("SenderEndpoint").
endpointConfiguration es la configuración de transporte. Conectándose a una instancia local de RabbitMQ, el método UseTransport() configura NServiceBus para usar RabbitMQ como el mecanismo de transporte.
Colas de Auditoría y Error: Dónde enviar mensajes fallidos y auditar los mensajes procesados está configurado usando SendFailedMessagesTo("error") y AuditProcessedMessagesTo("audit"), respectivamente.
Mensaje Enviado: endpointInstance.Send("ReceiverEndpoint", message) envía un GeneratePdfMessage al "ReceiverEndpoint".
Configurar el receptor para generar PDF
Configura el endpoint de NServiceBus en el proyecto del Receptor para aceptar mensajes a través de RabbitMQ y producir PDFs usando IronPDF.
using NServiceBus;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.Title = "Receiver";
var endpointConfiguration = new EndpointConfiguration("ReceiverEndpoint");
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop().ConfigureAwait(false);
}
}using NServiceBus;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.Title = "Receiver";
var endpointConfiguration = new EndpointConfiguration("ReceiverEndpoint");
// Use RabbitMQ Transport
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=localhost");
// Set up error queue
endpointConfiguration.SendFailedMessagesTo("error");
// Set up audit queue
endpointConfiguration.AuditProcessedMessagesTo("audit");
// Start the endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
Console.WriteLine("Press Enter to exit...");
Console.ReadLine();
// Stop the endpoint
await endpointInstance.Stop().ConfigureAwait(false);
}
}Esta configuración, para el endpoint receptor "ReceiverEndpoint", es comparable a la configuración del Remitente.
Manejador de mensajes
En el proyecto del Receptor, crea una nueva clase llamada GeneratePdfMessageHandler.cs.
using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
using IronPdf;
public class GeneratePdfMessageHandler : IHandleMessages<GeneratePdfMessage>
{
public Task Handle(GeneratePdfMessage message, IMessageHandlerContext context)
{
Console.WriteLine($"Received message to generate PDF with content: {message.Content}");
// Generate PDF
var renderer = new HtmlToPdf();
var pdf = renderer.RenderHtmlAsPdf(message.Content);
pdf.SaveAs(message.OutputPath);
Console.WriteLine($"PDF generated and saved to: {message.OutputPath}");
return Task.CompletedTask;
}
}using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
using IronPdf;
public class GeneratePdfMessageHandler : IHandleMessages<GeneratePdfMessage>
{
public Task Handle(GeneratePdfMessage message, IMessageHandlerContext context)
{
Console.WriteLine($"Received message to generate PDF with content: {message.Content}");
// Generate PDF
var renderer = new HtmlToPdf();
var pdf = renderer.RenderHtmlAsPdf(message.Content);
pdf.SaveAs(message.OutputPath);
Console.WriteLine($"PDF generated and saved to: {message.OutputPath}");
return Task.CompletedTask;
}
}GeneratePdfMessageHandler usa la interfaz IHandleMessages para manejar mensajes del tipo GeneratePdfMessage.

Método Handle: después de recibir el mensaje, la función Handle crea un PDF utilizando IronPDF. El contenido HTML en el mensaje se convierte en un PDF por el código del renderizador HtmlToPdf, que luego lo guarda en la ruta de salida designada.

Conclusión
NServiceBus puede integrarse con RabbitMQ e IronPDF en C# para proporcionar una solución escalable y estable para sistemas distribuidos que necesitan generar PDFs de manera dinámica y confiable. Esta combinación utiliza las capacidades de procesamiento de mensajes de NServiceBus, la fiabilidad y adaptabilidad de RabbitMQ como un broker de mensajes, y las robustas herramientas de edición de PDF de IronPDF. El desacoplamiento entre servicios se asegura con la arquitectura resultante, permitiendo una evolución autónoma y escalabilidad.
RabbitMQ también asegura la entrega de mensajes incluso en caso de fallos de red o bloqueos de la aplicación. NServiceBus hace que el enrutamiento y procesamiento de mensajes sea más sencillo, e IronPDF hace posible convertir texto HTML en documentos PDF de alta calidad. Esta integración ofrece un marco flexible para desarrollar aplicaciones sofisticadas a gran escala, además de mejorar la mantenibilidad y fiabilidad del sistema.
Por último, al añadir IronPDF e Iron Software a tu kit de herramientas para programación .NET, puedes trabajar eficazmente con códigos de barras, generar PDFs, realizar OCR y enlazar con Excel. Página de Licencias de IronPDF, que comienza en $799, fusiona perfectamente sus características y el rendimiento, compatibilidad y facilidad de uso de la suite flexible del Sitio Oficial de Iron Software para ofrecer aplicaciones web adicionales y capacidades y un desarrollo más eficiente.
Si hay opciones de licencia bien definidas que están personalizadas a los requerimientos específicos del proyecto, los desarrolladores pueden seleccionar el modelo óptimo con confianza. Estos beneficios permiten a los desarrolladores manejar una variedad de dificultades de manera eficaz y transparente.
Preguntas Frecuentes
¿Cómo puedo usar NServiceBus en C# para el desarrollo de sistemas distribuidos?
NServiceBus simplifica el desarrollo de sistemas distribuidos en C# al abstraer la arquitectura de mensajería. Esto permite a los desarrolladores centrarse en la lógica de negocio mientras se asegura un manejo y entrega fiable de mensajes en microservicios.
¿Cuáles son los beneficios de integrar NServiceBus con bibliotecas de gestión de PDF?
Integrar NServiceBus con bibliotecas de gestión de PDF como IronPDF permite una generación y gestión eficiente de PDFs dentro de aplicaciones distribuidas, habilitando sistemas de software escalables y sostenibles.
¿Cómo configuro un proyecto en C# con NServiceBus y RabbitMQ?
Para configurar un proyecto en C# con NServiceBus y RabbitMQ, crea una nueva Aplicación de Consola en Visual Studio, instala los paquetes NuGet de NServiceBus y RabbitMQ, y configura el endpoint y el transporte de mensajería en tu código.
¿Cómo mejora NServiceBus la comunicación basada en mensajes?
NServiceBus mejora la comunicación basada en mensajes al proporcionar patrones de mensajería confiables, como el modelo de publicación/suscripción y la gestión de sagas, asegurando que los mensajes se entreguen y procesen correctamente a través de sistemas distribuidos.
¿Qué papel juega IronPDF en los sistemas distribuidos que utilizan NServiceBus?
IronPDF desempeña un papel crucial en los sistemas distribuidos que utilizan NServiceBus al ofrecer capacidades robustas de generación y manipulación de PDFs, que pueden integrarse en flujos de trabajo impulsados por mensajes para automatizar procesos de manejo de documentos.
¿Cómo puedes asegurar una generación confiable de PDFs en sistemas distribuidos usando C#?
La generación confiable de PDFs en sistemas distribuidos usando C# se puede lograr integrando NServiceBus para el manejo de mensajes e IronPDF para la generación de PDFs, aprovechando las capacidades de mensajería de RabbitMQ para coordinar tareas y asegurar la consistencia.
¿Cómo funciona el modelo de publicación/suscripción en NServiceBus?
En NServiceBus, el modelo de publicación/suscripción permite que los servicios publiquen eventos a los que otros servicios pueden suscribirse. Esto habilita una arquitectura basada en eventos donde los cambios en un componente pueden desencadenar acciones en otros, mejorando la capacidad de respuesta y escalabilidad del sistema.
¿Cuál es la importancia de la gestión de sagas en NServiceBus?
La gestión de sagas en NServiceBus es significativa para coordinar procesos de negocio de larga duración a través de múltiples servicios, asegurando que los flujos de trabajo complejos se ejecuten de manera correcta y consistente dentro de sistemas distribuidos.








