Add README for DigitalData.MessagingService.Client
Introduce a comprehensive README.md for the `DigitalData.MessagingService.Client` library. The README provides detailed instructions for installation, usage, and configuration, including: - Installation via NuGet. - Quickstart guide for connecting to RabbitMQ, sending emails, and checking connection status. - Explanation of RabbitMQ URL format and server details. - Prerequisites for .NET versions and RabbitMQ setup. - Advanced configuration options for custom exchange, queue, and routing key names. - Error handling documentation for common scenarios. - Licensing information for Digital Data GmbH.
This commit is contained in:
@@ -0,0 +1,187 @@
|
|||||||
|
# DigitalData.MessagingService.Client
|
||||||
|
|
||||||
|
Ein schlanker, eigenständiger RabbitMQ-Client zum Versenden von E-Mails über den DigitalData MessagingService – ohne eigenen DI-Container oder Hosting-Infrastruktur.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```
|
||||||
|
dotnet add package DigitalData.MessagingService.Client
|
||||||
|
```
|
||||||
|
|
||||||
|
## Schnellstart
|
||||||
|
|
||||||
|
### 1. Verbindung herstellen
|
||||||
|
|
||||||
|
Einmalig beim Anwendungsstart aufrufen – typischerweise in `Program.cs`, `Application_Start` oder dem Konstruktor des Einstiegspunkts:
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
EmailSender.ConnectRabbitMq(
|
||||||
|
url: "amqp://172.24.12.56:5672",
|
||||||
|
username: "admin",
|
||||||
|
password: "geheimespasswort"
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
```vb
|
||||||
|
EmailSender.ConnectRabbitMq(
|
||||||
|
url:="amqp://172.24.12.56:5672",
|
||||||
|
username:="admin",
|
||||||
|
password:="geheimespasswort"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Mit virtuellem Host:
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
EmailSender.ConnectRabbitMq(
|
||||||
|
url: "amqp://172.24.12.56:5672/meinvhost",
|
||||||
|
username: "admin",
|
||||||
|
password: "geheimespasswort"
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
```vb
|
||||||
|
EmailSender.ConnectRabbitMq(
|
||||||
|
url:="amqp://172.24.12.56:5672/meinvhost",
|
||||||
|
username:="admin",
|
||||||
|
password:="geheimespasswort"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Hinweis:** `ConnectRabbitMq` darf pro Prozess nur einmal erfolgreich aufgerufen werden.
|
||||||
|
> Ein erneuter Aufruf löst standardmäßig eine `InvalidOperationException` aus.
|
||||||
|
> Ist dieses Verhalten nicht erwünscht, kann `OnReconnect.Ignore` übergeben werden:
|
||||||
|
>
|
||||||
|
> ```csharp
|
||||||
|
> EmailSender.ConnectRabbitMq("amqp://172.24.12.56:5672", "admin", "geheimespasswort", OnReconnect.Ignore);
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> ```vb
|
||||||
|
> EmailSender.ConnectRabbitMq("amqp://172.24.12.56:5672", "admin", "geheimespasswort", OnReconnect.Ignore)
|
||||||
|
> ```
|
||||||
|
|
||||||
|
### 2. E-Mail versenden
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
EmailSender.Send(new OutgoingEmailEvent
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid(),
|
||||||
|
Recipient = "empfaenger@beispiel.de",
|
||||||
|
Subject = "Willkommen",
|
||||||
|
Body = "<p>Hallo Welt!</p>",
|
||||||
|
IsHtml = true,
|
||||||
|
QueuedAt = DateTime.Now
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
```vb
|
||||||
|
EmailSender.Send(New OutgoingEmailEvent With {
|
||||||
|
.Id = Guid.NewGuid(),
|
||||||
|
.Recipient = "empfaenger@beispiel.de",
|
||||||
|
.Subject = "Willkommen",
|
||||||
|
.Body = "<p>Hallo Welt!</p>",
|
||||||
|
.IsHtml = True,
|
||||||
|
.QueuedAt = DateTime.Now
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
`Send` ist eine **Fire-and-Forget**-Methode: die Nachricht wird in die RabbitMQ-Queue eingereiht und der aufrufende Code wartet nicht auf die eigentliche Zustellung.
|
||||||
|
|
||||||
|
### 3. Verbindungsstatus prüfen
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
if (EmailSender.IsConnected)
|
||||||
|
{
|
||||||
|
// Verbindung wurde bereits hergestellt
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```vb
|
||||||
|
If EmailSender.IsConnected Then
|
||||||
|
' Verbindung wurde bereits hergestellt
|
||||||
|
End If
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## URL-Format
|
||||||
|
|
||||||
|
```
|
||||||
|
amqp://<host>:<port>[/<virtualhost>]
|
||||||
|
```
|
||||||
|
|
||||||
|
| Bestandteil | Beschreibung | Beispiel |
|
||||||
|
|---------------|---------------------------------------------------------|----------------|
|
||||||
|
| `host` | Hostname oder IP-Adresse des RabbitMQ-Servers | `172.24.12.56` |
|
||||||
|
| `port` | AMQP-Port (Standard: `5672`) | `5672` |
|
||||||
|
| `virtualhost` | Optionaler virtueller Host; URL-Encoding wird aufgelöst | `meinvhost` |
|
||||||
|
|
||||||
|
Benutzername und Passwort werden **nicht** aus der URL gelesen, sondern immer separat als Parameter übergeben. Dadurch werden Klartext-Credentials in URLs vermieden.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## RabbitMQ-Server
|
||||||
|
|
||||||
|
| | |
|
||||||
|
|---|---|
|
||||||
|
| **AMQP** | `amqp://172.24.12.56:5672` |
|
||||||
|
| **Management UI** | http://172.24.12.56:15672 (Browser) |
|
||||||
|
| **Benutzername** | `admin` |
|
||||||
|
| **Passwort** | Im RDM-Eintrag **`sDD-VMP05-VM06 - 172.24.12.56 - RabbitMQ`** hinterlegt |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Voraussetzungen
|
||||||
|
|
||||||
|
- .NET Framework 4.6.2 / 4.8 oder .NET 8+
|
||||||
|
- Erreichbarer RabbitMQ-Server
|
||||||
|
- Exchange, Queue und Routing Key müssen auf dem Broker vorhanden sein (werden vom Server-seitigen Consumer angelegt)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Erweiterte Konfiguration
|
||||||
|
|
||||||
|
Für spezielle Szenarien – etwa abweichende Exchange- oder Queue-Namen – steht ein Delegate-basierter Überload zur Verfügung:
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
EmailSender.ConnectRabbitMq(cfg =>
|
||||||
|
{
|
||||||
|
cfg.HostName = "172.24.12.56";
|
||||||
|
cfg.Port = 5672;
|
||||||
|
cfg.UserName = "admin";
|
||||||
|
cfg.Password = "geheimespasswort";
|
||||||
|
cfg.VirtualHost = "/";
|
||||||
|
// cfg.ExchangeName, cfg.QueueName, cfg.RoutingKey usw. bei Bedarf anpassen
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
```vb
|
||||||
|
EmailSender.ConnectRabbitMq(Sub(cfg)
|
||||||
|
cfg.HostName = "172.24.12.56"
|
||||||
|
cfg.Port = 5672
|
||||||
|
cfg.UserName = "admin"
|
||||||
|
cfg.Password = "geheimespasswort"
|
||||||
|
cfg.VirtualHost = "/"
|
||||||
|
' cfg.ExchangeName, cfg.QueueName, cfg.RoutingKey usw. bei Bedarf anpassen
|
||||||
|
End Sub)
|
||||||
|
```
|
||||||
|
|
||||||
|
Dieser Überload ist für den Normalbetrieb nicht erforderlich.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fehlerbehandlung
|
||||||
|
|
||||||
|
| Situation | Verhalten |
|
||||||
|
|---|---|
|
||||||
|
| `ConnectRabbitMq` noch nicht aufgerufen, dann `Send` | `InvalidOperationException` |
|
||||||
|
| `ConnectRabbitMq` erneut aufgerufen (Standard) | `InvalidOperationException` |
|
||||||
|
| `ConnectRabbitMq` erneut aufgerufen mit `OnReconnect.Ignore` | Wird stillschweigend ignoriert |
|
||||||
|
| RabbitMQ nicht erreichbar beim ersten `Send` | Exception aus dem RabbitMQ-Client |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lizenz
|
||||||
|
|
||||||
|
Copyright © 2026 Digital Data GmbH. Alle Rechte vorbehalten.
|
||||||
|
|
||||||
Reference in New Issue
Block a user