Neu in .NET 10.0 [18]: Webserver als File-based App

In einer File-based App kann man den Kestrel-Webserver auf Basis von ASP.NET Core starten.

vorlesen Druckansicht
Verkehrsschild mit Aufschrift .NET

(Bild: Pincasso / Shutterstock.com)

Lesezeit: 1 Min.
Von
  • Dr. Holger Schwichtenberg
close notice

This article is also available in English. It was translated with technical assistance and editorially reviewed before publication.

Das direkte Übersetzen und Starten von C#-Dateien nennt Microsoft File-based Apps. Es ist auch möglich, einen Kestrel-Webserver innerhalb einer solchen App zu starten. Unten stehendes Beispiel zeigt eine ASP.NET Core Minimal WebAPI als eigenständige C#-Datei. Das Hosting erfolgt in dem in ASP.NET Core mitgelieferten Webserver Kestrel.

Der Dotnet-Doktor – Holger Schwichtenberg
Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

In der File-based App wird Microsoft.NET.Sdk.Web als SDK angegeben. Als NuGet-Pakete werden Microsoft.AspNetCore.OpenApi und Humanizer verwendet. Die Ahead-of-Time-Kompilierung, die in File-based Apps Standard ist, ist hier deaktiviert, um Warnungen des JSON-Serialisierers zu vermeiden.

Videos by heise

Folgender Code zeigt den Webserver auf Basis von ASP.NET Core mit einem Minimal-WebAPI-Endpunkt und OpenAPI-Metadaten:

#:sdk Microsoft.NET.Sdk.Web
#:package Microsoft.AspNetCore.OpenApi@10.*-*
#:package Humanizer@2.14.1
#:property Version=1.1.4
#:property PublishAot=false

using Humanizer;
using Microsoft.OpenApi;

// Webserver einrichten
var builder = WebApplication.CreateBuilder();
builder.Services.AddOpenApi();
var app = builder.Build();
app.MapOpenApi(); // http://localhost:5000/openapi/v1.json

app.MapGet("/", () =>
 {
     // Daten fĂĽr Operation
     var d = new Data
     {
         Version = "9.0",
         Release = "2024-11-12"
     };
     var dotNet9Released = DateTimeOffset.Parse(d.Release);
     var since = DateTimeOffset.Now - dotNet9Released;

     return $"It has been {since.Humanize()} since .NET {d.Version} was released.";
 });

app.MapGet("/data", () =>
 {
     var d = new Data
     {
         Version = "9.0",
         Release = "2024-11-12"
     };
     return Results.Json(d);
 });

app.Run();

class Data
{
    /// <summary>
    /// Version of the .NET release.
    /// </summary>
    public string? Version { get; set; }
    /// <summary>
    /// Release date of the .NET version.
    /// </summary>
    public string? Release { get; set; }
}

Start und Ausgabe des Webservers (Abb. 1)

(rme)