# INI-Konfigurationsanbieter

Source: https://docs.sisk-framework.org/de/docs/extensions/ini-configuration.html

Sisk bietet eine Methode zum Laden von Startkonfigurationen, die nicht JSON sind. Tatsächlich kann jede Pipeline, die [IConfigurationReader](https://docs.sisk-framework.org/api/Sisk.Core.Http.Hosting.IConfigurationReader.md) implementiert, mit [PortableConfigurationBuilder.WithConfigurationPipeline](https://docs.sisk-framework.org/api/Sisk.Core.Http.Hosting.PortableConfigurationBuilder.md) verwendet werden, um die Serverkonfiguration aus beliebigen Dateitypen zu lesen.

Das Paket [Sisk.IniConfiguration](https://www.nuget.org/packages/Sisk.IniConfiguration/) stellt einen streambasierten INI-Dateileser bereit, der bei üblichen Syntaxfehlern keine Ausnahmen wirft und eine einfache Konfigurationssyntax verwendet. Dieses Paket kann außerhalb des Sisk‑Frameworks eingesetzt werden und bietet Flexibilität für Projekte, die einen effizienten INI‑Dokumentenleser benötigen.

## Installation

Um das Paket zu installieren, können Sie beginnen mit:

```bash
$ dotnet add package Sisk.IniConfiguration
```

Sie können auch das Kernpaket installieren, das den INI [IConfigurationReader](https://docs.sisk-framework.org/api/Sisk.Core.Http.Hosting.IConfigurationReader) nicht enthält, weder die Sisk‑Abhängigkeit, sondern nur die INI‑Serialisierer:

```bash
$ dotnet add package Sisk.IniConfiguration.Core
```

Mit dem Hauptpaket können Sie es in Ihrem Code wie im folgenden Beispiel verwenden:

```cs
class Program
{
    static HttpServerHostContext Host = null!;

    static void Main(string[] args)
    {
        Host = HttpServer.CreateBuilder()
            .UsePortableConfiguration(config =>
            {
                config.WithConfigFile("app.ini", createIfDontExists: true);
                
                // verwendet den IniConfigurationReader-Konfigurationsleser
                config.WithConfigurationPipeline<IniConfigurationReader>();
            })
            .UseRouter(r =>
            {
                r.MapGet("/", SayHello);
            })
            .Build();
        
        Host.Start();
    }

    static HttpResponse SayHello(HttpRequest request)
    {
        string? name = Host.Parameters["name"] ?? "world";
        return new HttpResponse($"Hello, {name}!");
    }
}
```

Der obige Code sucht nach einer app.ini‑Datei im aktuellen Arbeitsverzeichnis des Prozesses (CurrentDirectory). Die INI‑Datei sieht folgendermaßen aus:

```ini
[Server]
# Mehrere Listenadressen werden unterstützt
Listen = http://localhost:5552/
Listen = http://localhost:5553/
ThrowExceptions = false
AccessLogsStream = console

[Cors]
AllowMethods = GET, POST
AllowHeaders = Content-Type, Authorization
AllowOrigin = *

[Parameters]
Name = "Kanye West"
```

## INI-Variante und Syntax

Aktuelle Implementierungsvariante:

- Eigenschaften und Abschnittsnamen sind **nicht case‑sensitiv**.
- Eigenschaftsnamen und -werte werden **getrimmt**, es sei denn, die Werte sind in Anführungszeichen.
- Werte können mit einfachen oder doppelten Anführungszeichen umschlossen werden. Anführungszeichen können Zeilenumbrüche enthalten.
- Kommentare werden mit `#` und `;` unterstützt. Außerdem sind **nachgestellte Kommentare erlaubt**.
- Eigenschaften können mehrere Werte besitzen.

Im Detail ist die Dokumentation zur „Variante“ des in Sisk verwendeten INI‑Parsers [in diesem Dokument]https://github.com/sisk-http/archive/blob/master/ext/ini-reader-syntax.md verfügbar.

Verwenden Sie den folgenden INI-Code als Beispiel:

```ini
One = 1
Value = this is an value
Another value = "this value
    has an line break on it"

; der nachfolgende Code hat einige Farben
[some section]
Color = Red
Color = Blue
Color = Yellow ; verwende kein Gelb
```

Parse it with:

```csharp
// parse den INI-Text aus dem String
IniDocument doc = IniDocument.FromString(iniText);

// einen Wert holen
string? one = doc.Global.GetOne("one");
string? anotherValue = doc.Global.GetOne("another value");

// mehrere Werte holen
string[]? colors = doc.GetSection("some section")?.GetMany("color");
```

## Konfigurationsparameter

| Abschnitt und Name | Mehrere Werte zulassen | Beschreibung |
| ------------------ | ---------------------- | ------------ |
| `Server.Listen` | Yes | Die vom Server zu hörenden Adressen/Ports. |
| `Server.Encoding` | No | Die Standardkodierung des Servers. |
| `Server.MaximumContentLength` | No | Die maximale Content‑Length‑Größe des Servers in Bytes. Wenn weggelassen, bleibt die Server‑Standardgröße erhalten (100 MB seit Sisk 1.7). Verwenden Sie `0` für kein Limit. |
| `Server.IncludeRequestIdHeader` | No | Gibt an, ob der HTTP‑Server den X-Request-Id‑Header senden soll. |
| `Server.ThrowExceptions` | No | Gibt an, ob unbehandelte Ausnahmen geworfen werden sollen. |
| `Server.AccessLogsStream` | No | Gibt den Ausgabestream für Zugriffsprotokolle an. |
| `Server.ErrorsLogsStream` | No | Gibt den Ausgabestream für Fehlermeldungen an. |
| `Cors.AllowMethods` | No | Gibt den Wert des CORS Allow-Methods‑Headers an. |
| `Cors.AllowHeaders` | No | Gibt den Wert des CORS Allow-Headers‑Headers an. |
| `Cors.AllowOrigins` | No | Gibt mehrere Allow-Origin‑Header an, getrennt durch Kommas. [AllowOrigins](https://docs.sisk-framework.org/api/Sisk.Core.Entity.CrossOriginResourceSharingHeaders.AllowOrigins.md) für weitere Informationen. |
| `Cors.AllowOrigin` | No | Gibt einen einzelnen Allow-Origin‑Header an. |
| `Cors.ExposeHeaders` | No | Gibt den Wert des CORS Expose-Headers‑Headers an. |
| `Cors.AllowCredentials` | No | Gibt den Wert des CORS Allow-Credentials‑Headers an. |
| `Cors.MaxAge` | No | Gibt den Wert des CORS Max-Age‑Headers an. |
