Neuerungen in ASP.NET Core 3.0What's new in ASP.NET Core 3.0

In diesem Artikel werden die wichtigsten Änderungen in ASP.NET Core 3.0 aufgezeigt und Links zur relevanten Dokumentation bereitgestellt.This article highlights the most significant changes in ASP.NET Core 3.0 with links to relevant documentation.

Blazor

Blazor ist ein Framework in ASP.NET Core zum Erstellen von interaktiven clientseitigen Webbenutzeroberflächen mit .NET:Blazor is a new framework in ASP.NET Core for building interactive client-side web UI with .NET:

  • Erstellen Sie umfassende interaktive Benutzeroberflächen mit C# anstatt mit JavaScript.Create rich interactive UIs using C# instead of JavaScript.
  • Gemeinsames Verwenden von server- und clientseitiger App-Logik, die in .NET geschrieben wurde.Share server-side and client-side app logic written in .NET.
  • Rendern der Benutzeroberfläche als HTML und CSS für umfassende Browserunterstützung (einschließlich mobiler Browser).Render the UI as HTML and CSS for wide browser support, including mobile browsers.

Vom Blazor-Framework unterstützte Szenarien:Blazor framework supported scenarios:

  • Wiederverwendbare Benutzeroberflächenkomponenten (Razor-Komponenten)Reusable UI components (Razor components)
  • Clientseitiges RoutingClient-side routing
  • KomponentenlayoutsComponent layouts
  • Unterstützung für AbhängigkeitsinjektionSupport for dependency injection
  • Formulare und ÜberprüfungForms and validation
  • Erstellen von Komponentenbibliotheken mit Razor-KlassenbibliothekenBuild component libraries with Razor class libraries
  • JavaScript-InteroperabilitätJavaScript interop

Weitere Informationen finden Sie unter Einführung in ASP.NET Core Blazor.For more information, see Einführung in ASP.NET Core Blazor.

Blazor Server

Blazor entkoppelt die Komponentenrenderinglogik von Aktualisierungen der Benutzeroberfläche.Blazor decouples component rendering logic from how UI updates are applied. Blazor Server bietet Unterstützung zum Hosten von Razor-Komponenten in einer ASP.NET Core-App auf dem Server.Blazor Server provides support for hosting Razor components on the server in an ASP.NET Core app. Aktualisierungen der Benutzeroberfläche werden über eine SignalR-Verbindung verarbeitet.UI updates are handled over a SignalR connection. Blazor Server wird in ASP.NET Core 3.0 unterstützt.Blazor Server is supported in ASP.NET Core 3.0.

Blazor WebAssembly (Vorschau)Blazor WebAssembly (Preview)

Blazor-Apps können auch mit einer WebAssembly-basierten .NET-Runtime direkt im Browser ausgeführt werden.Blazor apps can also be run directly in the browser using a WebAssembly-based .NET runtime. Blazor WebAssembly befindet sich in der Vorschau und wird in ASP.NET Core 3.0 nicht unterstützt.Blazor WebAssembly is in preview and not supported in ASP.NET Core 3.0. Blazor WebAssembly wird in einem zukünftigen Release von ASP.NET Core unterstützt.Blazor WebAssembly will be supported in a future release of ASP.NET Core.

Razor-KomponentenRazor components

Blazor-Apps setzen sich aus Komponenten zusammen.Blazor apps are built from components. Komponenten sind eigenständige Elemente einer Benutzeroberfläche, z. B. eine Seite, ein Dialogfeld oder ein Formular.Components are self-contained chunks of user interface (UI), such as a page, dialog, or form. Komponenten sind normale .NET-Klassen, die die Renderinglogik für die Benutzeroberfläche sowie clientseitige Ereignishandler definieren.Components are normal .NET classes that define UI rendering logic and client-side event handlers. Damit können Sie umfangreiche interaktive Web-Apps ohne JavaScript erstellen.You can create rich interactive web apps without JavaScript.

Komponenten in Blazor werden üblicherweise mit der Razor-Syntax erstellt, einer natürlichen Mischung aus HTML und C#.Components in Blazor are typically authored using Razor syntax, a natural blend of HTML and C#. Razor-Komponenten ähneln Razor Pages und MVC-Ansichten dahingehend, dass sie ebenfalls Razor verwenden.Razor components are similar to Razor Pages and MVC views in that they both use Razor. Im Gegensatz zu Pages und Ansichten, die auf einem Anforderung/Antwort-Modell basieren, werden Komponenten speziell für die Verarbeitung der Benutzeroberflächengestaltung verwendet.Unlike pages and views, which are based on a request-response model, components are used specifically for handling UI composition.

gRPCgRPC

gRPC:gRPC:

  • Ein beliebtes, hochleistungsfähiges RPC-Framework (Remote Procedure Call, Remoteprozeduraufruf).Is a popular, high-performance RPC (remote procedure call) framework.

  • Bietet einen strikten Contract First-Ansatz für die API-Entwicklung.Offers an opinionated contract-first approach to API development.

  • Verwendet moderne Technologien wie z. B.:Uses modern technologies such as:

    • HTTP/2 für den Transport.HTTP/2 for transport.
    • Protokollpuffer als Sprache zur Schnittstellenbeschreibung.Protocol Buffers as the interface description language.
    • Format der binären Serialisierung.Binary serialization format.
  • Bietet beispielsweise folgende Features:Provides features such as:

    • AuthentifizierungAuthentication
    • Bidirektionales Streaming und Flusssteuerung.Bidirectional streaming and flow control.
    • Stornierung und Timeouts.Cancellation and timeouts.

Die gRPC-Funktionalität in ASP.NET Core 3.0 umfasst Folgendes:gRPC functionality in ASP.NET Core 3.0 includes:

  • Grpc.AspNetCore: Dies ist ein ASP.NET Core-Framework zum Hosten von gRPC-Diensten.Grpc.AspNetCore: An ASP.NET Core framework for hosting gRPC services. gRPC in ASP.NET Core lässt sich in ASP.NET Core-Standardfeatures wie Protokollierung, Abhängigkeitsinjektion (Dependency Injection, DI), Authentifizierung und Autorisierung integrieren.gRPC on ASP.NET Core integrates with standard ASP.NET Core features like logging, dependency injection (DI), authentication, and authorization.
  • Grpc.Net.Client: Dies ist ein gRPC-Client für .NET Core, der auf dem bekannten HttpClient aufbaut.Grpc.Net.Client: A gRPC client for .NET Core that builds upon the familiar HttpClient.
  • Grpc.Net.ClientFactory: Dies ist eine gRPC-Clientintegration mit HttpClientFactory.Grpc.Net.ClientFactory: gRPC client integration with HttpClientFactory.

Weitere Informationen finden Sie unter Einführung in gRPC in .NET Core.For more information, see Einführung in gRPC in .NET Core.

SignalR

Anweisungen zur Migration finden Sie unter Aktualisieren von SignalR-Code.See Update SignalR code for migration instructions. SignalR verwendet jetzt System.Text.Json, um JSON-Nachrichten zu serialisieren bzw. zu deserialisieren.SignalR now uses System.Text.Json to serialize/deserialize JSON messages. Anleitungen zum Wiederherstellen des Newtonsoft.Json-basierten Serialisierungsmoduls finden Sie unter Switch to Newtonsoft.Json (Wechseln zu Newtonsoft.Json).See Switch to Newtonsoft.Json for instructions to restore the Newtonsoft.Json-based serializer.

In den JavaScript- und .NET-Clients für SignalR wurde Unterstützung für eine automatische erneute Verbindungsherstellung hinzugefügt.In the JavaScript and .NET Clients for SignalR, support was added for automatic reconnection. Standardmäßig versucht der Client sofort, die Verbindung wiederherzustellen, und wiederholt den Versuch nötigenfalls nach 2, 10 und 30 Sekunden.By default, the client tries to reconnect immediately and retry after 2, 10, and 30 seconds if necessary. Wenn der Client die Verbindung erfolgreich wiederherstellt, erhält er eine neue Verbindungs-ID.If the client successfully reconnects, it receives a new connection ID. Die automatische erneute Herstellung einer Verbindung kann optional aktiviert werden:Automatic reconnect is opt-in:

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .withAutomaticReconnect()
    .build();

Die Intervalle für die Wiederherstellung einer Verbindung können durch Übergabe eines Arrays aus millisekundenbasierten Zeitspannen angegeben werden:The reconnection intervals can be specified by passing an array of millisecond-based durations:

.withAutomaticReconnect([0, 3000, 5000, 10000, 15000, 30000])
//.withAutomaticReconnect([0, 2000, 10000, 30000]) The default intervals.

Zur vollständigen Steuerung der Wiederherstellungsintervalle kann eine benutzerdefinierte Implementierung übergeben werden.A custom implementation can be passed in for full control of the reconnection intervals.

Wenn die Verbindung nicht wiederhergestellt werden kann, passiert nach dem letzten Intervall Folgendes:If the reconnection fails after the last reconnect interval:

  • Der Client betrachtet die Verbindung als offline.The client considers the connection is offline.
  • Der Client versucht nicht mehr, die Verbindung wiederherzustellen.The client stops trying to reconnect.

Aktualisieren Sie die App-Benutzeroberfläche während der Verbindungsversuche, um den Benutzer darüber zu informieren, dass versucht wird, erneut eine Verbindung herzustellen.During reconnection attempts, update the app UI to notify the user that the reconnection is being attempted.

Um bei einer unterbrochenen Verbindung Feedback auf der Benutzeroberfläche bereitstellen zu können, wurde die SignalR-Client-API um die folgenden Ereignishandler ergänzt:To provide UI feedback when the connection is interrupted, the SignalR client API has been expanded to include the following event handlers:

  • onreconnecting: Bietet Entwicklern die Möglichkeit, die Benutzeroberfläche zu deaktivieren oder Benutzer darüber zu informieren, dass die App offline ist.onreconnecting: Gives developers an opportunity to disable UI or to let users know the app is offline.
  • onreconnected: Bietet Entwicklern die Möglichkeit, die Benutzeroberfläche zu aktualisieren, sobald die Verbindung wiederhergestellt wurde.onreconnected: Gives developers an opportunity to update the UI once the connection is reestablished.

Der folgende Code verwendet onreconnecting, um die Benutzeroberfläche während der Verbindungsversuche zu aktualisieren:The following code uses onreconnecting to update the UI while trying to connect:

connection.onreconnecting((error) => {
    const status = `Connection lost due to error "${error}". Reconnecting.`;
    document.getElementById("messageInput").disabled = true;
    document.getElementById("sendButton").disabled = true;
    document.getElementById("connectionStatus").innerText = status;
});

Der folgende Code verwendet onreconnected, um die Benutzeroberfläche nach erfolgreich hergestellter Verbindung zu aktualisieren:The following code uses onreconnected to update the UI on connection:

connection.onreconnected((connectionId) => {
    const status = `Connection reestablished. Connected.`;
    document.getElementById("messageInput").disabled = false;
    document.getElementById("sendButton").disabled = false;
    document.getElementById("connectionStatus").innerText = status;
});

SignalR 3.0 und höher bietet eine benutzerdefinierte Ressource für Autorisierungshandler, wenn eine Hubmethode eine Autorisierung erfordert.SignalR 3.0 and later provides a custom resource to authorization handlers when a hub method requires authorization. Die Ressource ist eine Instanz von HubInvocationContext.The resource is an instance of HubInvocationContext. Der HubInvocationContext umfasst Folgendes:The HubInvocationContext includes the:

  • HubCallerContext
  • Den Namen der aufgerufenen Hubmethode.Name of the hub method being invoked.
  • Argumente für die Hubmethode.Arguments to the hub method.

Sehen Sie sich das folgende Beispiel einer Chatroom-App an, die mehreren Mitgliedern einer Organisation die Anmeldung über Azure Active Directory ermöglicht.Consider the following example of a chat room app allowing multiple organization sign-in via Azure Active Directory. Jede Person mit einem Microsoft-Konto kann sich beim Chat anmelden, aber nur Mitglieder der besitzenden Organisation können Benutzer sperren oder den Chatverlauf anderer Benutzer anzeigen.Anyone with a Microsoft account can sign in to chat, but only members of the owning organization can ban users or view users' chat histories. Die App könnte bestimmte Funktionen für bestimmte Benutzer einschränken.The app could restrict certain functionality from specific users.

public class DomainRestrictedRequirement :
    AuthorizationHandler<DomainRestrictedRequirement, HubInvocationContext>,
    IAuthorizationRequirement
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
        DomainRestrictedRequirement requirement,
        HubInvocationContext resource)
    {
        if (context.User?.Identity?.Name == null)
        {
            return Task.CompletedTask;
        }

        if (IsUserAllowedToDoThis(resource.HubMethodName, context.User.Identity.Name))
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }

    private bool IsUserAllowedToDoThis(string hubMethodName, string currentUsername)
    {
        if (hubMethodName.Equals("banUser", StringComparison.OrdinalIgnoreCase))
        {
            return currentUsername.Equals("bob42@jabbr.net", StringComparison.OrdinalIgnoreCase);
        }

        return currentUsername.EndsWith("@jabbr.net", StringComparison.OrdinalIgnoreCase));
    }
}

Im vorherigen Code dient DomainRestrictedRequirement als benutzerdefinierte IAuthorizationRequirement.In the preceding code, DomainRestrictedRequirement serves as a custom IAuthorizationRequirement. Da der Ressourcenparameter HubInvocationContext übergeben wird, kann die interne Logik folgende Aktionen ausführen:Because the HubInvocationContext resource parameter is being passed in, the internal logic can:

  • Sie kann den Kontext untersuchen, in dem der Hub aufgerufen wird.Inspect the context in which the Hub is being called.
  • Sie kann Entscheidungen darüber treffen, ob einem Benutzer die Ausführung einzelner Hubmethoden gestattet wird.Make decisions on allowing the user to execute individual Hub methods.

Einzelne Hubmethoden können mit dem Namen der Richtlinie gekennzeichnet werden, die der Code zur Laufzeit prüft.Individual Hub methods can be marked with the name of the policy the code checks at run-time. Wenn Clients versuchen, einzelne Hubmethoden aufzurufen, wird der DomainRestrictedRequirement-Handler ausgeführt und steuert den Zugriff auf die Methoden.As clients attempt to call individual Hub methods, the DomainRestrictedRequirement handler runs and controls access to the methods. Basierend auf der Art und Weise, in der DomainRestrictedRequirement den Zugriff steuert, kann Folgendes passieren:Based on the way the DomainRestrictedRequirement controls access:

  • Alle angemeldeten Benutzer können die SendMessage-Methode aufrufen.All logged-in users can call the SendMessage method.
  • Nur Benutzer, die sich mit einer @jabbr.net-E-Mail-Adresse angemeldet haben, können den Verlauf anderer Benutzer anzeigen.Only users who have logged in with a @jabbr.net email address can view users' histories.
  • Nur bob42@jabbr.net kann Benutzer aus dem Chatroom ausschließen.Only bob42@jabbr.net can ban users from the chat room.
[Authorize]
public class ChatHub : Hub
{
    public void SendMessage(string message)
    {
    }

    [Authorize("DomainRestricted")]
    public void BanUser(string username)
    {
    }

    [Authorize("DomainRestricted")]
    public void ViewUserHistory(string username)
    {
    }
}

Die Erstellung der DomainRestricted-Richtlinie kann Folgendes umfassen:Creating the DomainRestricted policy might involve:

  • Fügen Sie die neue Richtlinie in Startup.cs hinzu.In Startup.cs, adding the new policy.
  • Stellen Sie die benutzerdefinierte Anforderung DomainRestrictedRequirement als Parameter bereit.Provide the custom DomainRestrictedRequirement requirement as a parameter.
  • Registrieren Sie DomainRestricted bei der Autorisierungsmiddleware.Registering DomainRestricted with the authorization middleware.
services
    .AddAuthorization(options =>
    {
        options.AddPolicy("DomainRestricted", policy =>
        {
            policy.Requirements.Add(new DomainRestrictedRequirement());
        });
    });

SignalR-Hubs verwenden Endpunktrouting.SignalR hubs use Endpoint Routing. Eine SignalR-Hubverbindung wurde zuvor explizit eingerichtet:SignalR hub connection was previously done explicitly:

app.UseSignalR(routes =>
{
    routes.MapHub<ChatHub>("hubs/chat");
});

In der vorherigen Version mussten Entwickler Controller, Razor-Seiten und Hubs an verschiedenen Orten miteinander verknüpfen.In the previous version, developers needed to wire up controllers, Razor pages, and hubs in a variety of places. Explizite Verbindungen führen zu einer Reihe nahezu identischer Routingsegmente:Explicit connection results in a series of nearly-identical routing segments:

app.UseSignalR(routes =>
{
    routes.MapHub<ChatHub>("hubs/chat");
});

app.UseRouting(routes =>
{
    routes.MapRazorPages();
});

SignalR 3.0-Hubs können per Endpunktrouting weitergeleitet werden.SignalR 3.0 hubs can be routed via endpoint routing. Beim Endpunktrouting kann in der Regel das gesamte Routing in UseRouting konfiguriert werden:With endpoint routing, typically all routing can be configured in UseRouting:

app.UseRouting(routes =>
{
    routes.MapRazorPages();
    routes.MapHub<ChatHub>("hubs/chat");
});

In ASP.NET Core 3.0 SignalR wurde Folgendes hinzugefügt:ASP.NET Core 3.0 SignalR added:

Streaming vom Client zum Server.Client-to-server streaming. Mit dem Streaming vom Client zum Server können serverseitige Methoden Instanzen von IAsyncEnumerable<T> oder ChannelReader<T> akzeptieren.With client-to-server streaming, server-side methods can take instances of either an IAsyncEnumerable<T> or ChannelReader<T>. Im folgenden C#-Beispiel empfängt die UploadStream-Methode im Hub einen Zeichenfolgenstream vom Client:In the following C# sample, the UploadStream method on the Hub will receive a stream of strings from the client:

public async Task UploadStream(IAsyncEnumerable<string> stream)
{
    await foreach (var item in stream)
    {
        // process content
    }
}

.NET-Client-Apps können entweder eine IAsyncEnumerable<T>-oder eine ChannelReader<T>-Instanz als stream-Argument der oben genannten UploadStream-Hubmethode übergeben..NET client apps can pass either an IAsyncEnumerable<T> or ChannelReader<T> instance as the stream argument of the UploadStream Hub method above.

Nachdem die for-Schleife abgeschlossen ist und die lokale Funktion existiert, wird der Streamabschluss gesendet:After the for loop has completed and the local function exits, the stream completion is sent:

async IAsyncEnumerable<string> clientStreamData()
{
    for (var i = 0; i < 5; i++)
    {
        var data = await FetchSomeData();
        yield return data;
    }
}

await connection.SendAsync("UploadStream", clientStreamData());

JavaScript-Client-Apps verwenden SignalR Subject (oder RxJS Subject) für das stream-Argument der oben genannten Hubmethode UploadStream.JavaScript client apps use the SignalR Subject (or an RxJS Subject) for the stream argument of the UploadStream Hub method above.

let subject = new signalR.Subject();
await connection.send("StartStream", "MyAsciiArtStream", subject);

Der JavaScript-Code könnte die subject.next-Methode verwenden, um Zeichenfolgen zu verarbeiten, sobald diese erfasst werden und zum Senden an den Server bereit sin.The JavaScript code could use the subject.next method to handle strings as they are captured and ready to be sent to the server.

subject.next("example");
subject.complete();

Mit Code wie in den beiden obigen Codeausschnitten lassen sich Echtzeitstreamingfunktionen erzeugen.Using code like the two preceding snippets, real-time streaming experiences can be created.

Neue JSON-SerialisierungNew JSON serialization

ASP.NET Core 3.0 verwendet jetzt standardmäßig System.Text.Json zur JSON-Serialisierung:ASP.NET Core 3.0 now uses System.Text.Json by default for JSON serialization:

  • Lese- und Schreibvorgänge in JSON erfolgen asynchron.Reads and writes JSON asynchronously.
  • Der Code ist für UTF-8-Text optimiert.Is optimized for UTF-8 text.
  • In der Regel lässt sich eine höhere Leistung als mit Newtonsoft.Json erzielen.Typically higher performance than Newtonsoft.Json.

Informationen zum Hinzufügen von Json.NET zu ASP.NET Core 3.0 finden Sie unter Hinzufügen von Newtonsoft.Json-basierter Unterstützung für das JSON-Format.To add Json.NET to ASP.NET Core 3.0, see Add Newtonsoft.Json-based JSON format support.

Neue Razor-AnweisungenNew Razor directives

Die folgende Liste enthält neue Razor-Anweisungen:The following list contains new Razor directives:

  • @attribute: die Anweisung @attribute wendet das angegebene Attribut auf die Klasse der generierten Seite oder Ansicht an.@attribute: The @attribute directive applies the given attribute to the class of the generated page or view. Beispielsweise @attribute [Authorize].For example, @attribute [Authorize].
  • @implements: Die @implements-Anweisung implementiert eine Schnittstelle für die generierte Klasse.@implements: The @implements directive implements an interface for the generated class. Beispielsweise @implements IDisposable.For example, @implements IDisposable.

IdentityServer4 unterstützt Authentifizierung und Autorisierung für Web-APIs und SPAs.IdentityServer4 supports authentication and authorization for web APIs and SPAs

ASP.NET Core 3.0 bietet eine Authentifizierung in Single-Page-Webanwendungen (SPAs) unter Verwendung der Unterstützung für die Web-API-Autorisierung.ASP.NET Core 3.0 offers authentication in Single Page Apps (SPAs) using the support for web API authorization. ASP.NET Core Identity zum Authentifizieren und Speichern von Benutzern wird mit IdentityServer4 zur Implementierung von OpenID Connect kombiniert.ASP.NET Core Identity for authenticating and storing users is combined with IdentityServer4 for implementing OpenID Connect.

IdentityServer4 ist ein OpenID Connect- und OAuth 2.0-Framework für ASP.NET Core 3.0.IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core 3.0. Es ermöglicht die folgenden Sicherheitsfunktionen:It enables the following security features:

  • Authentifizierung als DienstAuthentication as a Service (AaaS)
  • Einmaliges Anmelden und einmaliges Abmelden für mehrere AnwendungstypenSingle sign-on/off (SSO) over multiple application types
  • Zugriffssteuerung für APIsAccess control for APIs
  • Federation GatewayFederation Gateway

Weitere Informationen finden Sie in der IdentityServer4-Dokumentation oder unter Authentifizierung und Autorisierung für SPAs.For more information, see the IdentityServer4 documentation or Authentication and authorization for SPAs.

Zertifikat- und Kerberos-AuthentifizierungCertificate and Kerberos authentication

Die Zertifikatsauthentifizierung erfordert Folgendes:Certificate authentication requires:

  • Der Server muss so konfiguriert werden, dass er Zertifikate akzeptiert.Configuring the server to accept certificates.
  • Die Authentifizierungsmiddleware muss in Startup.Configure hinzugefügt werden.Adding the authentication middleware in Startup.Configure.
  • Der Zertifikatauthentifizierungsdienst muss in Startup.ConfigureServices hinzugefügt werden.Adding the certificate authentication service in Startup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(
        CertificateAuthenticationDefaults.AuthenticationScheme)
            .AddCertificate();
    // Other service configuration removed.
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseAuthentication();
    // Other app configuration removed.
}

Die Optionen für die Zertifikatauthentifizierung umfassen folgende Möglichkeiten:Options for certificate authentication include the ability to:

  • Akzeptieren selbstsignierter Zertifikate.Accept self-signed certificates.
  • Überprüfen auf Zertifikatswiderruf.Check for certificate revocation.
  • Überprüfen, ob das angebotene Zertifikat die richtigen Nutzungsflags enthält.Check that the proffered certificate has the right usage flags in it.

Aus den Zertifikateigenschaften wird ein Standardbenutzerprinzipal erstellt.A default user principal is constructed from the certificate properties. Der Benutzerprinzipal enthält ein Ereignis, das das Ergänzen oder Ersetzen des Prinzipals ermöglicht.The user principal contains an event that enables supplementing or replacing the principal. Weitere Informationen finden Sie unter Konfigurieren der Zertifikat Authentifizierung in ASP.net Core.For more information, see Konfigurieren der Zertifikat Authentifizierung in ASP.net Core.

Die Windows-Authentifizierung wurde auf Linux und macOS erweitert.Windows Authentication has been extended onto Linux and macOS. In vorherigen Versionen war die Windows-Authentifizierung auf IIS und HttpSys beschränkt.In previous versions, Windows Authentication was limited to IIS and HttpSys. In ASP.NET Core 3.0 besitzt Kestrel die Möglichkeit, Negotiate, Kerberos und NTLM unter Windows, Linux und macOS für Hosts zu verwenden, die der Windows-Domäne beigetreten sind.In ASP.NET Core 3.0, Kestrel has the ability to use Negotiate, Kerberos, and NTLM on Windows, Linux, and macOS for Windows domain-joined hosts. Die Kestrel-Unterstützung für diese Authentifizierungsschemas wird durch das Paket Microsoft.AspNetCore.Authentication.Negotiate NuGet bereitgestellt.Kestrel support of these authentication schemes is provided by the Microsoft.AspNetCore.Authentication.Negotiate NuGet package. Wie bei anderen Authentifizierungsdiensten auch sollte erst die Authentifizierung auf App-Ebene und dann der Dienst konfiguriert werden:As with the other authentication services, configure authentication app wide, then configure the service:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
        .AddNegotiate();
    // Other service configuration removed.
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseAuthentication();
    // Other app configuration removed.
}

Hostanforderungen:Host requirements:

  • Windows-Hosts müssen dem Benutzerkonto, das die App hostet, Dienstprinzipalnamen hinzufügen.Windows hosts must have Service Principal Names (SPNs) added to the user account hosting the app.
  • Linux- und macOS-Computer müssen der Domäne beigetreten sein.Linux and macOS machines must be joined to the domain.
    • Für den Webprozess müssen Dienstprinzipalnamen erstellt werden.SPNs must be created for the web process.
    • Keytab-Dateien müssen generiert und auf dem Hostcomputer konfiguriert werden.Keytab files must be generated and configured on the host machine.

Weitere Informationen finden Sie unter Konfigurieren der Windows-Authentifizierung in ASP.net Core.For more information, see Konfigurieren der Windows-Authentifizierung in ASP.net Core.

Änderungen an VorlagenTemplate changes

Aus den Vorlagen für Webbenutzeroberflächen (Razor Pages, MVC mit Controller und Ansichten) wurde Folgendes entfernt:The web UI templates (Razor Pages, MVC with controller and views) have the following removed:

Die Angular-Vorlage wurde auf Angular 8 aktualisiert.The Angular template updated to use Angular 8.

Die Vorlage der Razor-Klassenbibliothek (Razor Class Library, RCL) gilt standardmäßig für die Razor-Komponentenentwicklung.The Razor class library (RCL) template defaults to Razor component development by default. Eine neue Vorlagenoption in Visual Studio bietet Vorlagenunterstützung für Seiten und Ansichten.A new template option in Visual Studio provides template support for pages and views. Übergeben Sie beim Erstellen einer RCL aus einer Vorlage in einer Befehlsshell die Option --support-pages-and-views (dotnet new razorclasslib --support-pages-and-views).When creating an RCL from the template in a command shell, pass the --support-pages-and-views option (dotnet new razorclasslib --support-pages-and-views).

Generischer HostGeneric Host

Die ASP.NET Core 3.0-Vorlagen verwenden Generischer .NET-Host in ASP.NET Core.The ASP.NET Core 3.0 templates use Generischer .NET-Host in ASP.NET Core. In vorherigen Versionen wurde WebHostBuilder verwendet.Previous versions used WebHostBuilder. Durch Verwendung des generischen .NET Core-Hosts (HostBuilder) lässt sich eine bessere Integration von ASP.NET Core-Apps in andere, nicht webspezifische Serverszenarios erzielen.Using the .NET Core Generic Host (HostBuilder) provides better integration of ASP.NET Core apps with other server scenarios that aren't web-specific. Weitere Informationen finden Sie unter HostBuilder ersetzt WebHostBuilder.For more information, see HostBuilder replaces WebHostBuilder.

Konfiguration des HostsHost configuration

Vor ASP.NET Core 3.0 wurden Umgebungsvariablen mit dem Präfix ASPNETCORE_ für die Hostkonfiguration des Webhosts geladen.Prior to the release of ASP.NET Core 3.0, environment variables prefixed with ASPNETCORE_ were loaded for host configuration of the Web Host. In Version 3.0 wird AddEnvironmentVariables zum Laden von Umgebungsvariablen mit dem Präfix DOTNET_ zur Hostkonfiguration mit CreateDefaultBuilder verwendet.In 3.0, AddEnvironmentVariables is used to load environment variables prefixed with DOTNET_ for host configuration with CreateDefaultBuilder.

Änderungen an der StartkonstruktorinjektionChanges to Startup constructor injection

Der generische Host unterstützt nur die folgenden Typen für die Injektion des Startup-Konstruktors:The Generic Host only supports the following types for Startup constructor injection:

Alle Dienste können weiterhin direkt als Argumente in die Startup.Configure-Methode eingefügt werden.All services can still be injected directly as arguments to the Startup.Configure method. Weitere Informationen finden Sie unter Generic Host restricts Startup constructor injection (aspnet/Announcements #353) (Generischer Host schränkt Startkonstruktorinjektion ein).For more information, see Generic Host restricts Startup constructor injection (aspnet/Announcements #353).

KestrelKestrel

  • Die Kestrel-Konfiguration wurde für die Migration zum generischen Host aktualisiert.Kestrel configuration has been updated for the migration to the Generic Host. In Version 3.0 ist Kestrel im Webhostgenerator konfiguriert, der durch ConfigureWebHostDefaults bereitgestellt wird.In 3.0, Kestrel is configured on the web host builder provided by ConfigureWebHostDefaults.
  • Verbindungsadapter wurden aus Kestrel entfernt und durch Verbindungsmiddleware ersetzt. Diese ähnelt der HTTP-Middleware in der ASP.NET Core-Pipeline, ist aber für Verbindungen auf niedrigerer Ebene konzipiert.Connection Adapters have been removed from Kestrel and replaced with Connection Middleware, which is similar to HTTP Middleware in the ASP.NET Core pipeline but for lower-level connections.
  • Die Kestrel-Transportschicht wurde in Connections.Abstractions als öffentliche Schnittstelle verfügbar gemacht.The Kestrel transport layer has been exposed as a public interface in Connections.Abstractions.
  • Eine Mehrdeutigkeit zwischen Headern und Trailern wurde aufgelöst, indem nachstehende Header in eine neue Sammlung verschoben wurden.Ambiguity between headers and trailers has been resolved by moving trailing headers to a new collection.
  • APIs mit synchronen E/A-Vorgängen, wie z. B. HttpRequest.Body.Read, sind eine häufige Quelle für einen Ressourcenmangel im Thread, der zu App-Abstürzen führt.Synchronous I/O APIs, such as HttpRequest.Body.Read, are a common source of thread starvation leading to app crashes. In 3.0 ist AllowSynchronousIO standardmäßig deaktiviert.In 3.0, AllowSynchronousIO is disabled by default.

Weitere Informationen finden Sie unter Migrieren von ASP.net Core 2,2 zu 3,0.For more information, see Migrieren von ASP.net Core 2,2 zu 3,0.

HTTP/2 standardmäßig aktiviertHTTP/2 enabled by default

HTTP/2 ist in Kestrel für HTTPS-Endpunkte standardmäßig aktiviert.HTTP/2 is enabled by default in Kestrel for HTTPS endpoints. Die HTTP/2-Unterstützung für IIS oder HTTP.sys ist aktiviert, wenn dies vom Betriebssystem unterstützt wird.HTTP/2 support for IIS or HTTP.sys is enabled when supported by the operating system.

EventCounters auf AnforderungEventCounters on request

Die Hostingereignisquelle Microsoft.AspNetCore.Hosting gibt die folgenden neuen EventCounter-Typen zurück, die im Zusammenhang mit eingehenden Anforderungen stehen:The Hosting EventSource, Microsoft.AspNetCore.Hosting, emits the following new EventCounter types related to incoming requests:

  • requests-per-second
  • total-requests
  • current-requests
  • failed-requests

EndpunktroutingEndpoint routing

Das Endpunktrouting, das den reibungslosen Einsatz von Frameworks (z. B. MVC) mit Middleware ermöglicht, wurde erweitert:Endpoint Routing, which allows frameworks (for example, MVC) to work well with middleware, is enhanced:

  • Die Reihenfolge von Middlewarekomponenten und Endpunkten kann in der Startup.Configure-Pipeline für die Anforderungsverarbeitung konfiguriert werden.The order of middleware and endpoints is configurable in the request processing pipeline of Startup.Configure.
  • Endpunkte und Middlewarekomponenten lassen sich gut mit anderen ASP.NET Core-basierten Technologien wie z. B. Integritätsprüfungen kombinieren.Endpoints and middleware compose well with other ASP.NET Core-based technologies, such as Health Checks.
  • Endpunkte können sowohl in der Middleware als auch in MVC eine Richtlinie wie beispielsweise CORS oder Autorisierung implementieren.Endpoints can implement a policy, such as CORS or authorization, in both middleware and MVC.
  • Filter und Attribute können in Controllermethoden platziert werden.Filters and attributes can be placed on methods in controllers.

Weitere Informationen finden Sie unter Routing in ASP.NET Core.For more information, see Routing in ASP.NET Core.

IntegritätsprüfungenHealth Checks

Integritätsprüfungen verwenden das Endpunktrouting mit dem generischen Host.Health Checks use endpoint routing with the Generic Host. Rufen Sie in Startup.Configure auf der Endpunkterstellung mit der Endpunkt-URL oder dem relativen Pfad MapHealthChecks auf:In Startup.Configure, call MapHealthChecks on the endpoint builder with the endpoint URL or relative path:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health");
});

Für Endpunkte für Integritätsprüfungen gilt Folgendes:Health Checks endpoints can:

  • Sie geben mindestens einen zugelassenen Host oder Port an.Specify one or more permitted hosts/ports.
  • Sie erfordern Autorisierung.Require authorization.
  • Sie erfordern CORS.Require CORS.

Weitere Informationen finden Sie in den folgenden Artikeln:For more information, see the following articles:

Pipes in HttpContextPipes on HttpContext

Es ist jetzt möglich, mit der System.IO.Pipelines-API den Anforderungstext zu lesen und den Antworttext schreiben.It's now possible to read the request body and write the response body using the System.IO.Pipelines API. DieThe HttpRequest.BodyReader-Eigenschaft stellt einen PipeReader bereit, der zum Lesen des Anforderungstexts verwendet werden kann.HttpRequest.BodyReader property provides a PipeReader that can be used to read the request body. DieThe HttpResponse.BodyWriter-Eigenschaft stellt einen PipeWriter bereit, der zum Schreiben des Antworttexts verwendet werden kann.HttpResponse.BodyWriter property provides a PipeWriter that can be used to write the response body. HttpRequest.BodyReader funktioniert analog zum HttpRequest.Body-Stream.HttpRequest.BodyReader is an analogue of the HttpRequest.Body stream. HttpResponse.BodyWriter funktioniert analog zum HttpResponse.Body-Stream.HttpResponse.BodyWriter is an analogue of the HttpResponse.Body stream.

Verbesserte Fehlerberichterstellung in IISImproved error reporting in IIS

Startfehler beim Hosten von ASP.NET Core-Apps in IIS erzeugen jetzt umfangreichere Diagnosedaten.Startup errors when hosting ASP.NET Core apps in IIS now produce richer diagnostic data. Diese Fehler werden mit Stapelüberwachung im Windows-Ereignisprotokoll gemeldet, wann immer möglich.These errors are reported to the Windows Event Log with stack traces wherever applicable. Darüber hinaus werden alle Warnungen, Fehler und Ausnahmefehler im Windows-Ereignisprotokoll protokolliert.In addition, all warnings, errors, and unhandled exceptions are logged to the Windows Event Log.

Workerdienst und Worker SDKWorker Service and Worker SDK

.NET Core 3.0 führt eine neue Vorlage für die Workerdienst-App ein..NET Core 3.0 introduces the new Worker Service app template. Diese Vorlage dient als Ausgangspunkt für das Schreiben von zeitintensiven Diensten in .NET Core.This template provides a starting point for writing long running services in .NET Core.

Weitere Informationen finden Sie unter:For more information, see:

Verbesserungen an Middleware für weitergeleitete HeaderForwarded Headers Middleware improvements

In früheren Versionen von ASP.NET Core war der Aufruf von UseHsts und UseHttpsRedirection problematisch, wenn die Bereitstellung auf einem Azure Linux-Computer oder hinter einem anderen Reverseproxy als IIS erfolgt war.In previous versions of ASP.NET Core, calling UseHsts and UseHttpsRedirection were problematic when deployed to an Azure Linux or behind any reverse proxy other than IIS. Die Problembehebung für frühere Versionen ist unter Das Schema für Linux- und Nicht-IIS-Reverseproxys weiterleiten dokumentiert.The fix for previous versions is documented in Forward the scheme for Linux and non-IIS reverse proxies.

Dieses Szenario wurde in ASP.NET Core 3.0 behoben.This scenario is fixed in ASP.NET Core 3.0. Der Host aktiviert die Middleware für weitergeleitete Header, wenn die Umgebungsvariable ASPNETCORE_FORWARDEDHEADERS_ENABLED auf true festgelegt ist.The host enables the Forwarded Headers Middleware when the ASPNETCORE_FORWARDEDHEADERS_ENABLED environment variable is set to true. ASPNETCORE_FORWARDEDHEADERS_ENABLED ist in unseren Containerimages auf true festgelegt.ASPNETCORE_FORWARDEDHEADERS_ENABLED is set to true in our container images.

LeistungsverbesserungenPerformance improvements

ASP.NET Core 3.0 enthält viele Verbesserungen, die die Arbeitsspeichernutzung reduzieren und den Durchsatz erhöhen:ASP.NET Core 3.0 includes many improvements that reduce memory usage and improve throughput:

  • Bei Verwendung des integrierten Containers für die Abhängigkeitsinjektion für bereichsbezogene Dienste wird weniger Arbeitsspeicher verbraucht.Reduction in memory usage when using the built-in dependency injection container for scoped services.
  • Im gesamten Framework, einschließlich Middlewareszenarien und Routing, wurden Zuweisungen reduziert.Reduction in allocations across the framework, including middleware scenarios and routing.
  • Für Websocketverbindungen wird weniger Arbeitsspeicher verbraucht.Reduction in memory usage for WebSocket connections.
  • Bei HTTPS-Verbindungen wurde die Arbeitsspeichernutzung reduziert und der Durchsatz verbessert.Memory reduction and throughput improvements for HTTPS connections.
  • Es steht ein neues optimiertes und vollständig asynchrones JSON-Serialisierungsmodul zur Verfügung.New optimized and fully asynchronous JSON serializer.
  • Bei der Formularanalyse wurde die Arbeitsspeichernutzung reduziert und der Durchsatz verbessert.Reduction in memory usage and throughput improvements in form parsing.

ASP.NET Core 3.0 funktioniert nur in .NET Core 3.0ASP.NET Core 3.0 only runs on .NET Core 3.0

Ab ASP.NET Core 3.0 ist .NET Framework kein unterstütztes Zielframework mehr.As of ASP.NET Core 3.0, .NET Framework is no longer a supported target framework. Projekte, die auf .NET Framework abzielen, können mit dem .NET Core 2.1 LTS-Release weiterhin mit vollständiger Unterstützung ausgeführt werden.Projects targeting .NET Framework can continue in a fully supported fashion using the .NET Core 2.1 LTS release. Die meisten auf ASP.NET Core 2.1.x bezogenen Pakete werden unbegrenzt unterstützt, auch nach dem dreijährigen LTS-Zeitraum für .NET Core 2.1.Most ASP.NET Core 2.1.x related packages will be supported indefinitely, beyond the three-year LTS period for .NET Core 2.1.

Informationen zur Migration finden Sie unter Portieren Ihres Codes von .NET Framework auf .NET Core.For migration information, see Port your code from .NET Framework to .NET Core.

Verwenden des freigegebenen ASP.NET Core-FrameworksUse the ASP.NET Core shared framework

Das freigegebene ASP.NET Core 3.0-Framework, das im Microsoft.AspNetCore.App-Metapaket enthalten ist, erfordert kein explizites <PackageReference />-Element in der Projektdatei mehr.The ASP.NET Core 3.0 shared framework, contained in the Microsoft.AspNetCore.App metapackage, no longer requires an explicit <PackageReference /> element in the project file. Bei Verwendung des Microsoft.NET.Sdk.Web SDK in der Projektdatei wird automatisch auf das freigegebene Framework verwiesen:The shared framework is automatically referenced when using the Microsoft.NET.Sdk.Web SDK in the project file:

<Project Sdk="Microsoft.NET.Sdk.Web">

Aus dem freigegebenen ASP.NET Core-Framework entfernte AssemblysAssemblies removed from the ASP.NET Core shared framework

Die wichtigsten Assemblys, die aus dem freigegebenen ASP.NET Core 3.0-Framework entfernt wurden:The most notable assemblies removed from the ASP.NET Core 3.0 shared framework are:

Eine vollständige Liste der Assemblys, die aus dem freigegebenen Framework entfernt wurden, finden Sie unter Assemblies being removed from Microsoft.AspNetCore.App 3.0 (Assemblys, die aus Microsoft.AspNetCore.App 3.0 entfernt werden).For a complete list of assemblies removed from the shared framework, see Assemblies being removed from Microsoft.AspNetCore.App 3.0. Weitere Informationen zu den Beweggründen für diese Änderung finden Sie unter Breaking changes to Microsoft.AspNetCore.App in 3.0 (Breaking Changes an Microsoft.AspNetCore.App in Version 3.0) und A first look at changes coming in ASP.NET Core 3.0 (Ein erster Blick auf die Änderungen in ASP.NET Core 3.0).For more information on the motivation for this change, see Breaking changes to Microsoft.AspNetCore.App in 3.0 and A first look at changes coming in ASP.NET Core 3.0.