Breaking Changes in .NET Core 3.0
Wenn Sie von Version 3.0 von .NET Core, ASP.NET Core oder EF Core migrieren, können sich die in diesem Artikel aufgeführten Breaking Changes auf Ihre App auswirken.
ASP.NET Core
- Veraltete Antifälschungs-, CORS-, Diagnose-, MVC- und Routing-APIs wurden entfernt
- „Pubternal“-APIs entfernt
- Authentifizierung: Google+ ist veraltet
- Authentifizierung: HttpContext.Authentication-Eigenschaft wurde entfernt
- Authentifizierung: Newtonsoft.Json-Typen wurden ersetzt
- Authentifizierung: Signatur von OAuthHandler.ExchangeCodeAsync wurde geändert
- Autorisierung: AddAuthorization-Überladung wurde in andere Assembly verschoben
- Autorisierung: IAllowAnonymous wurde aus AuthorizationFilterContext.Filters entfernt
- Autorisierung: Implementierungen von IAuthorizationPolicyProvider erfordern eine neue Methode
- Zwischenspeicherung: CompactOnMemoryPressure-Eigenschaft wurde entfernt
- Zwischenspeicherung: Microsoft.Extensions.Caching.SqlServer verwendet neues SqlClient-Paket
- Zwischenspeicherung: „pubternal“-Typen wurden in ResponseCaching in „internal“-Typen geändert
- Datenschutz: DataProtection.Blobs verwendet neue Azure Storage-APIs
- Hosting: AspNetCoreModule v1 wurde aus dem Windows-Hostingpaket entfernt
- Hosting: Generischer Host schränkt Startup-Konstruktorinjektion ein
- Hosting: HTTPS-Umleitung für IIS-Out-of-Process-Apps aktiviert
- Hosting: Typen IHostingEnvironment und IApplicationLifetime wurden ersetzt
- Hosting: ObjectPoolProvider wurde aus WebHostBuilder-Abhängigkeiten entfernt
- HTTP: Erweiterbarkeit von DefaultHttpContext wurde entfernt
- HTTP: HeaderNames-Felder wurden in „static readonly“ (statisch schreibgeschützt) geändert
- HTTP: Änderungen an der Infrastruktur von Antworttexten
- HTTP: Einige Standardwerte für Cookie-SameSite wurden geändert
- HTTP: Synchrone E/A-Vorgänge wurden standardmäßig deaktiviert
- Identität: AddDefaultUI-Methodenüberladung wurde entfernt
- Identität: Bootstrap-Version der Benutzeroberfläche wurde geändert
- Identität: SignInAsync löst eine Ausnahme für eine nicht authentifizierte Identität aus
- Identität: SignInManager-Konstruktor akzeptiert neuen Parameter
- Identität: Benutzeroberfläche verwendet Funktion für statische Webressourcen
- Kestrel: Verbindungsadapter wurde entfernt
- Kestrel: Leere HTTPS-Assembly wurde entfernt
- Kestrel: Anforderungstrailer-Header wurden in neue Sammlung verschoben
- Kestrel: Transportabstraktionsebene wurde geändert
- Lokalisierung: APIs wurden als veraltet markiert
- Protokollierung: DebugLogger-Klasse wurde als „internal“ deklariert
- MVC: Async-Suffix wurde für Controlleraktion entfernt
- MVC: JsonResult wurde in Microsoft.AspNetCore.Mvc.Core verschoben
- MVC: Vorkompilierungstool wurde als veraltet markiert
- MVC: Typen wurden in „internal“ geändert
- MVC: Web-API-Kompatibilitätsshim wurde entfernt
- Razor: RazorTemplateEngine-API wurde entfernt
- Razor: Laufzeitkompilierung wurde in ein Paket verschoben
- Sitzungszustand: Veraltete APIs wurden entfernt
- Freigegebenes Framework: Assembly aus Microsoft.AspNetCore.App wurde entfernt
- Freigegebenes Framework: Microsoft.AspNetCore.All wurde entfernt
- SignalR: HandshakeProtocol.SuccessHandshakeData wurde ersetzt
- SignalR: HubConnection-Methoden wurden entfernt
- SignalR: HubConnectionContext-Konstruktoren wurden geändert
- SignalR: Name des JavaScript-Clientpakets wurde geändert
- SignalR: Veraltete APIs
- SPAs: SpaServices und NodeServices wurden als veraltet markiert
- SPAs: Standard für Konsolenprotokollierungsfallback für SpaServices und NodeServices wurde geändert
- Zielframework: .NET Framework nicht unterstützt
Veraltete Antifälschungs-, CORS-, Diagnose-, MVC- und Routing-APIs wurden entfernt.
Veraltete Member und Kompatibilitätsschalter in ASP.NET Core 2.2 wurden entfernt.
Eingeführt in Version
3.0
Grund für die Änderung
Fortlaufende Verbesserung der API-Schnittstelle.
Empfohlene Aktion
Wenn Sie .NET Core 2.2 als Ziel verwenden, befolgen Sie die Anweisungen in den Meldungen zum veralteten Build, um stattdessen die neuen APIs zu verwenden.
Kategorie
ASP.NET Core
Betroffene APIs
Die folgenden Typen und Member wurden für ASP.NET Core 2.1 und 2.2 als veraltet markiert:
Typen
Microsoft.AspNetCore.Diagnostics.Views.WelcomePage
Microsoft.AspNetCore.DiagnosticsViewPage.Views.AttributeValue
Microsoft.AspNetCore.DiagnosticsViewPage.Views.BaseView
Microsoft.AspNetCore.DiagnosticsViewPage.Views.HelperResult
Microsoft.AspNetCore.Mvc.Formatters.Xml.ProblemDetails21Wrapper
Microsoft.AspNetCore.Mvc.Formatters.Xml.ValidationProblemDetails21Wrapper
Microsoft.AspNetCore.Mvc.Razor.Compilation.ViewsFeatureProvider
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageArgumentBinder
Microsoft.AspNetCore.Routing.IRouteValuesAddressMetadata
Microsoft.AspNetCore.Routing.RouteValuesAddressMetadata
Konstruktoren
Microsoft.AspNetCore.Cors.Infrastructure.CorsService(IOptions{CorsOptions})
Microsoft.AspNetCore.Routing.Tree.TreeRouteBuilder(ILoggerFactory,UrlEncoder,ObjectPool{UriBuildingContext},IInlineConstraintResolver)
Microsoft.AspNetCore.Mvc.Formatters.OutputFormatterCanWriteContext
Microsoft.AspNetCore.Mvc.ApiExplorer.DefaultApiDescriptionProvider(IOptions{MvcOptions},IInlineConstraintResolver,IModelMetadataProvider)
Microsoft.AspNetCore.Mvc.ApiExplorer.DefaultApiDescriptionProvider(IOptions{MvcOptions},IInlineConstraintResolver,IModelMetadataProvider,IActionResultTypeMapper)
Microsoft.AspNetCore.Mvc.Formatters.FormatFilter(IOptions{MvcOptions})
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ArrayModelBinder`1(IModelBinder)
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ByteArrayModelBinder
- Microsoft.AspNetCore.Mvc.ModelBinding.Binders.CollectionModelBinder`1(IModelBinder)
- Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder(IDictionary`2)
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DictionaryModelBinder`2(IModelBinder,IModelBinder)
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DoubleModelBinder(System.Globalization.NumberStyles)
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FloatModelBinder(System.Globalization.NumberStyles)
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FormCollectionModelBinder
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FormFileModelBinder
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.HeaderModelBinder
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.KeyValuePairModelBinder`2(IModelBinder,IModelBinder)
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.SimpleTypeModelBinder(System.Type)
Microsoft.AspNetCore.Mvc.ModelBinding.ModelAttributes(IEnumerable{System.Object})
Microsoft.AspNetCore.Mvc.ModelBinding.ModelAttributes(IEnumerable{System.Object},IEnumerable{System.Object})
Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderFactory(IModelMetadataProvider,IOptions{MvcOptions})
Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder(IModelMetadataProvider,IModelBinderFactory,IObjectModelValidator)
- Microsoft.AspNetCore.Mvc.Routing.KnownRouteValueConstraint()
Microsoft.AspNetCore.Mvc.Formatters.XmlDataContractSerializerInputFormatter
Microsoft.AspNetCore.Mvc.Formatters.XmlDataContractSerializerInputFormatter(System.Boolean)
Microsoft.AspNetCore.Mvc.Formatters.XmlDataContractSerializerInputFormatter(MvcOptions)
Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerInputFormatter
Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerInputFormatter(System.Boolean)
Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerInputFormatter(MvcOptions)
- Microsoft.AspNetCore.Mvc.TagHelpers.ImageTagHelper(IHostingEnvironment,IMemoryCache,HtmlEncoder,IUrlHelperFactory)
Microsoft.AspNetCore.Mvc.TagHelpers.LinkTagHelper(IHostingEnvironment,IMemoryCache,HtmlEncoder,JavaScriptEncoder,IUrlHelperFactory)
Microsoft.AspNetCore.Mvc.TagHelpers.ScriptTagHelper(IHostingEnvironment,IMemoryCache,HtmlEncoder,JavaScriptEncoder,IUrlHelperFactory)
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.RazorPageAdapter(RazorPageBase)
Eigenschaften
Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions.CookieDomain
Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions.CookieName
Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions.CookiePath
Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions.RequireSsl
Microsoft.AspNetCore.Mvc.ApiBehaviorOptions.AllowInferringBindingSourceForCollectionTypesAsFromQuery
Microsoft.AspNetCore.Mvc.ApiBehaviorOptions.SuppressUseValidationProblemDetailsForInvalidModelStateResponses
Microsoft.AspNetCore.Mvc.CookieTempDataProviderOptions.CookieName
Microsoft.AspNetCore.Mvc.CookieTempDataProviderOptions.Domain
Microsoft.AspNetCore.Mvc.CookieTempDataProviderOptions.Path
Microsoft.AspNetCore.Mvc.DataAnnotations.MvcDataAnnotationsLocalizationOptions.AllowDataAnnotationsLocalizationForEnumDisplayAttributes
Microsoft.AspNetCore.Mvc.Formatters.Xml.MvcXmlOptions.AllowRfc7807CompliantProblemDetailsFormat
Microsoft.AspNetCore.Mvc.MvcOptions.AllowBindingHeaderValuesToNonStringModelTypes
Microsoft.AspNetCore.Mvc.MvcOptions.AllowCombiningAuthorizeFilters
Microsoft.AspNetCore.Mvc.MvcOptions.AllowShortCircuitingValidationWhenNoValidatorsArePresent
Microsoft.AspNetCore.Mvc.MvcOptions.AllowValidatingTopLevelNodes
Microsoft.AspNetCore.Mvc.MvcOptions.InputFormatterExceptionPolicy
Microsoft.AspNetCore.Mvc.MvcOptions.SuppressBindingUndefinedValueToEnumType
Microsoft.AspNetCore.Mvc.MvcViewOptions.AllowRenderingMaxLengthAttribute
Microsoft.AspNetCore.Mvc.MvcViewOptions.SuppressTempDataAttributePrefix
Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions.AllowAreas
Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions.AllowDefaultHandlingForOptionsRequests
Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions.AllowMappingHeadRequestsToGetHandler
Methoden
Microsoft.AspNetCore.Mvc.LocalRedirectResult.ExecuteResult(ActionContext)
Microsoft.AspNetCore.Mvc.RedirectResult.ExecuteResult(ActionContext)
Microsoft.AspNetCore.Mvc.RedirectToActionResult.ExecuteResult(ActionContext)
Microsoft.AspNetCore.Mvc.RedirectToPageResult.ExecuteResult(ActionContext)
Microsoft.AspNetCore.Mvc.RedirectToRouteResult.ExecuteResult(ActionContext)
Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext,IValueProvider,ParameterDescriptor)
- Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext,IValueProvider,ParameterDescriptor,Object)
„Pubternal“-APIs entfernt
Um die öffentliche API-Oberfläche von ASP.NET Core besser zu verwalten, sind die meisten Typen in *.Internal
-Namespaces (als "pubternal"-APIs bezeichnet) wirklich intern geworden. Member in diesen Namespaces sollten nie als öffentlich ausgerichtete APIs unterstützt werden. Bei den APIs konnten in Nebenversionen Fehler auftreten, was auch häufig der Fall war. Bei Code, der von diesen APIs abhängig ist, treten beim Aktualisieren auf ASP.Net Core 3.0 Fehler auf.
Weitere Informationen finden Sie unter dotnet/aspnetcore#4932 und dotnet/aspnetcore#11312.
Eingeführt in Version
3.0
Altes Verhalten
Die betroffenen APIs werden mit dem public
-Zugriffsmodifizierer gekennzeichnet und sind in *.Internal
-Namespaces vorhanden.
Neues Verhalten
Die betroffenen APIs sind mit dem internal-Zugriffsmodifizierer gekennzeichnet und können nicht mehr von Code außerhalb dieser Assembly verwendet werden.
Grund für die Änderung
Die Richtlinie für diese "pubternal"-APIs war:
- Sie konnten ohne vorherige Ankündigung geändert werden.
- Sie unterlagen nicht den .NET-Richtlinien zum Verhindern von Breaking Changes.
Die APIs public
zu lassen (selbst in den *.Internal
-Namespaces), war für Kunden verwirrend.
Empfohlene Aktion
Verwenden Sie diese "pubternal"-APIs nicht mehr. Wenn Sie Fragen zu alternativen APIs haben, öffnen Sie ein Issue im dotnet/aspnetcore-Repository.
Sehen Sie sich beispielsweise den folgenden HTTP-Anforderungspuffercode in einem ASP.NET Core 2.2-Projekt an. Die EnableRewind
-Erweiterungsmethode ist im Microsoft.AspNetCore.Http.Internal
-Namespace vorhanden.
HttpContext.Request.EnableRewind();
Ersetzen Sie den EnableRewind
-Aufruf in einem ASP.NET Core 3.0-Projekt durch einen Aufruf der EnableBuffering
-Erweiterungsmethode. Das Feature für die Anforderungspufferung funktioniert wie bisher. EnableBuffering
ruft die jetzige internal
-API auf.
HttpContext.Request.EnableBuffering();
Kategorie
ASP.NET Core
Betroffene APIs
Alle APIs in den Microsoft.AspNetCore.*
-und Microsoft.Extensions.*
-Namespaces mit einem Internal
-Segment im Namespacenamen. Zum Beispiel:
Microsoft.AspNetCore.Authentication.Internal
Microsoft.AspNetCore.Builder.Internal
Microsoft.AspNetCore.DataProtection.Cng.Internal
Microsoft.AspNetCore.DataProtection.Internal
Microsoft.AspNetCore.Hosting.Internal
Microsoft.AspNetCore.Http.Internal
Microsoft.AspNetCore.Mvc.Core.Infrastructure
Microsoft.AspNetCore.Mvc.Core.Internal
Microsoft.AspNetCore.Mvc.Cors.Internal
Microsoft.AspNetCore.Mvc.DataAnnotations.Internal
Microsoft.AspNetCore.Mvc.Formatters.Internal
Microsoft.AspNetCore.Mvc.Formatters.Json.Internal
Microsoft.AspNetCore.Mvc.Formatters.Xml.Internal
Microsoft.AspNetCore.Mvc.Internal
Microsoft.AspNetCore.Mvc.ModelBinding.Internal
Microsoft.AspNetCore.Mvc.Razor.Internal
Microsoft.AspNetCore.Mvc.RazorPages.Internal
Microsoft.AspNetCore.Mvc.TagHelpers.Internal
Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
Microsoft.AspNetCore.Rewrite.Internal
Microsoft.AspNetCore.Routing.Internal
Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure
Microsoft.AspNetCore.Server.Kestrel.Https.Internal
Authentifizierung: Google+ als veraltet markiert und ersetzt
Google hat ab 28. Januar 2019 damit begonnen, die Google+-Anmeldung für Apps einzustellen.
Änderungsbeschreibung
ASP.NET 4.x und ASP.NET Core verwendeten die Google+-Anmelde-APIs zum Authentifizieren von Google-Benutzerkonten in Web-Apps. Die betroffenen NuGet-Pakete sind Microsoft.AspNetCore.Authentication.Google für ASP.NET Core und Microsoft.Owin.Security.Google für Microsoft.Owin
mit ASP.NET Web Forms und MVC.
Die Ersetzungs-APIs von Google nutzen eine andere Datenquelle und ein anderes Format. Mit den unten aufgeführten Entschärfungen und Lösungen wird auf diese strukturellen Änderungen reagiert. Apps sollten überprüfen, ob die Daten selbst weiterhin die Anforderungen erfüllen. Beispielsweise können Namen, E-Mail-Adressen, Profilverknüpfungen und Profilfotos etwas andere Werte als zuvor bereitstellen.
Eingeführt in Version
Alle Versionen. Diese Änderung ist extern von ASP.NET Core.
Empfohlene Maßnahme
Owin mit ASP.NET Web Forms und MVC
Für Microsoft.Owin
3.1.0 und höher finden Sie hier eine vorübergehende Entschärfung. Apps sollten Tests mit der Entschärfung durchführen, um Änderungen am Datenformat zu überprüfen. Es gibt Pläne, Microsoft.Owin
4.0.1 mit einer Korrektur zu veröffentlichen. Apps, die eine frühere Version verwenden, sollten auf Version 4.0.1 aktualisiert werden.
ASP.NET Core 1.x
Die Entschärfung in Owin mit ASP.NET Web Forms und MVC kann an ASP.NET Core 1.x angepasst werden. NuGet-Paketpatches sind nicht geplant, da Version 1.x das Ende des Lebenszyklus erreicht hat.
ASP.NET Core 2.x
Ersetzen Sie für Microsoft.AspNetCore.Authentication.Google
Version 2.x den vorhandenen Aufruf von AddGoogle
in Startup.ConfigureServices
durch folgenden Code:
.AddGoogle(o =>
{
o.ClientId = Configuration["Authentication:Google:ClientId"];
o.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
o.UserInformationEndpoint = "https://www.googleapis.com/oauth2/v2/userinfo";
o.ClaimActions.Clear();
o.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
o.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
o.ClaimActions.MapJsonKey(ClaimTypes.GivenName, "given_name");
o.ClaimActions.MapJsonKey(ClaimTypes.Surname, "family_name");
o.ClaimActions.MapJsonKey("urn:google:profile", "link");
o.ClaimActions.MapJsonKey(ClaimTypes.Email, "email");
});
Die Februar-Patches 2.1 und 2.2 enthalten die vorherige Neukonfiguration als neuen Standard. Es ist kein Patch für ASP.NET Core 2.0 geplant, da diese Version das Ende des Lebenszyklus erreicht hat.
ASP.NET Core 3.0
Die für ASP.NET Core 2.x angegebene Entschärfung kann auch für ASP.NET Core 3.0 verwendet werden. In den nächsten Vorschauversionen für 3.0 wird das Paket Microsoft.AspNetCore.Authentication.Google
möglicherweise entfernt. Benutzer würden stattdessen an Microsoft.AspNetCore.Authentication.OpenIdConnect
weitergeleitet werden. Im folgenden Code wird das Ersetzen von AddGoogle
durch AddOpenIdConnect
in Startup.ConfigureServices
veranschaulicht. Diese Ersetzung kann mit ASP.NET Core 2.0 und höher verwendet und bei Bedarf für ASP.NET Core 1.x angepasst werden.
.AddOpenIdConnect("Google", o =>
{
o.ClientId = Configuration["Authentication:Google:ClientId"];
o.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
o.Authority = "https://accounts.google.com";
o.ResponseType = OpenIdConnectResponseType.Code;
o.CallbackPath = "/signin-google"; // Or register the default "/signin-oidc"
o.Scope.Add("email");
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
Kategorie
ASP.NET Core
Betroffene APIs
Microsoft.AspNetCore.Authentication.Google
Authentifizierung: HttpContext.Authentication-Eigenschaft wurde entfernt
Die veraltete Authentication
-Eigenschaft in HttpContext
wurde entfernt.
Beschreibung der Änderung:
Gemäß dotnet/aspnetcore#6504 wurde die veraltete Authentication
-Eigenschaft für HttpContext
entfernt. Die Authentication
-Eigenschaft ist seit Version 2.0 veraltet. Es wurde eine Migrationsanleitung veröffentlicht, um Code, der diese veraltete Eigenschaft verwendet, zu den neuen Ersatz-APIs zu migrieren. Die verbleibenden nicht verwendeten Klassen/APIs, die sich auf den alten ASP.NET Core 1.x-Authentifizierungsstapel beziehen, wurden im Commit dotnet/aspnetcore@d7a7c65 entfernt.
Weitere Informationen finden Sie unter dotnet/aspnetcore#6533.
Eingeführt in Version
3.0
Grund für die Änderung
Die ASP.NET Core 1.0-APIs wurden durch Erweiterungsmethoden in Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions ersetzt.
Empfohlene Maßnahme
Lesen Sie die Migrationsanleitung.
Kategorie
ASP.NET Core
Betroffene APIs
- Microsoft.AspNetCore.Http.Authentication.AuthenticateInfo
- Microsoft.AspNetCore.Http.Authentication.AuthenticationManager
- Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties
- Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext
- Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior
- Microsoft.AspNetCore.Http.Features.Authentication.ChallengeContext
- Microsoft.AspNetCore.Http.Features.Authentication.DescribeSchemesContext
- Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler
- Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature.Handler
- Microsoft.AspNetCore.Http.Features.Authentication.SignInContext
- Microsoft.AspNetCore.Http.Features.Authentication.SignOutContext
- Microsoft.AspNetCore.Http.HttpContext.Authentication
Authentifizierung: Newtonsoft.Json-Typen wurden ersetzt.
In ASP.NET Core 3.0 wurden die in Authentifizierungs-APIs verwendeten Newtonsoft.Json
-Typen durch System.Text.Json
-Typen ersetzt. Mit Ausnahme der folgenden Fälle ist die grundlegende Verwendung der Authentifizierungspakete nicht betroffen:
- Von den OAuth-Anbietern abgeleitete Klassen (z. B. von aspnet-contrib )
- Erweiterte Implementierungen von Anspruchsbearbeitungen
Weitere Informationen finden Sie unter dotnet/aspnetcore#7105. Weitere Informationen finden Sie unter dotnet/aspnetcore#7289.
Eingeführt in Version
3.0
Empfohlene Aktion
Bei abgeleiteten OAuth-Implementierungen besteht die häufigste Änderung darin, dass JObject.Parse
in der CreateTicketAsync
-Überschreibung durch JsonDocument.Parse
ersetzt wird, wie hier gezeigt. JsonDocument
implementiert IDisposable
.
In der folgenden Liste werden bekannte Änderungen erläutert:
- ClaimAction.Run(JObject, ClaimsIdentity, String) wird
ClaimAction.Run(JsonElement userData, ClaimsIdentity identity, string issuer)
. Alle abgeleiteten Implementierungen vonClaimAction
sind gleichermaßen betroffen. - ClaimActionCollectionMapExtensions.MapCustomJson(ClaimActionCollection, String, Func<JObject,String>) wird zu
MapCustomJson(this ClaimActionCollection collection, string claimType, Func<JsonElement, string> resolver)
- ClaimActionCollectionMapExtensions.MapCustomJson(ClaimActionCollection, String, String, Func<JObject,String>) wird zu
MapCustomJson(this ClaimActionCollection collection, string claimType, string valueType, Func<JsonElement, string> resolver)
- Aus OAuthCreatingTicketContext wurde ein alter Konstruktor entfernt und im anderen
JObject
durchJsonElement
ersetzt. DieUser
-Eigenschaft und dieRunClaimActions
-Methode wurden entsprechend angepasst. - Success(JObject) akzeptiert jetzt einen Parameter vom Typ
JsonDocument
anstelle vonJObject
. DieResponse
-Eigenschaft wurde entsprechend angepasst.OAuthTokenResponse
kann nun verworfen und durchOAuthHandler
ersetzt werden. Abgeleitete OAuth-Implementierungen, dieExchangeCodeAsync
überschreiben, müssen dasJsonDocument
oder dieOAuthTokenResponse
nicht verwerfen. - UserInformationReceivedContext.User wurde von
JObject
inJsonDocument
geändert. - TwitterCreatingTicketContext.User wurde von
JObject
inJsonElement
geändert. - Der letzte Parameter von TwitterHandler.CreateTicketAsync(ClaimsIdentity,AuthenticationProperties,AccessToken,JObject) wurde von
JObject
inJsonElement
geändert. Die Ersatzmethode ist TwitterHandler.CreateTicketAsync(ClaimsIdentity, AuthenticationProperties, AccessToken, JsonElement).
Kategorie
ASP.NET Core
Betroffene APIs
- Microsoft.AspNetCore.Authentication.Facebook
- Microsoft.AspNetCore.Authentication.Google
- Microsoft.AspNetCore.Authentication.MicrosoftAccount
- Microsoft.AspNetCore.Authentication.OAuth
- Microsoft.AspNetCore.Authentication.OpenIdConnect
- Microsoft.AspNetCore.Authentication.Twitter
Authentifizierung: Signatur von OAuthHandler.ExchangeCodeAsync wurde geändert
In ASP.NET Core 3.0 wurde die Signatur von OAuthHandler.ExchangeCodeAsync
geändert von:
protected virtual System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.OAuth.OAuthTokenResponse> ExchangeCodeAsync(string code, string redirectUri) { throw null; }
Nach:
protected virtual System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.OAuth.OAuthTokenResponse> ExchangeCodeAsync(Microsoft.AspNetCore.Authentication.OAuth.OAuthCodeExchangeContext context) { throw null; }
Eingeführt in Version
3.0
Altes Verhalten
Die Zeichenfolgen code
und redirectUri
wurden als separate Argumente übergeben.
Neues Verhalten
Code
und RedirectUri
sind Eigenschaften von OAuthCodeExchangeContext
, die über den OAuthCodeExchangeContext
-Konstruktor festgelegt werden können. Der neue OAuthCodeExchangeContext
-Typ ist das einzige Argument, das an OAuthHandler.ExchangeCodeAsync
übergeben wird.
Grund für die Änderung
Diese Änderung ermöglicht die Bereitstellung zusätzlicher Parameter, ohne dass es zu Breaking Changes kommt. Es müssen keine neuen ExchangeCodeAsync
-Überladungen erstellt werden.
Empfohlene Maßnahme
Erstellen Sie einen OAuthCodeExchangeContext
mit geeigneten Werten für code
und redirectUri
. Es muss eine AuthenticationProperties-Instanz bereitgestellt werden. Diese einzelne OAuthCodeExchangeContext
-Instanz kann anstelle mehrerer Argumente an OAuthHandler.ExchangeCodeAsync
übergeben werden.
Kategorie
ASP.NET Core
Betroffene APIs
OAuthHandler<TOptions>.ExchangeCodeAsync(String, String)
Autorisierung: AddAuthorization-Überladung wurde in andere Assembly verschoben
Die wichtigsten AddAuthorization
-Methoden, die bisher in Microsoft.AspNetCore.Authorization
enthalten waren, wurden in AddAuthorizationCore
umbenannt. Die alten AddAuthorization
-Methoden sind immer noch vorhanden, befinden sich jedoch stattdessen in der Assembly Microsoft.AspNetCore.Authorization.Policy
. Dies sollte auf Apps, die beide Methoden verwenden, keine Auswirkung haben. Beachten Sie, dass Microsoft.AspNetCore.Authorization.Policy
jetzt im freigegebenen Framework und nicht einem eigenständigen Paket enthalten ist, wie in Freigegebenes Framework: Assemblys aus Microsoft.AspNetCore.App entfernt beschrieben.
Eingeführt in Version
3.0
Altes Verhalten
Die AddAuthorization
-Methoden waren in Microsoft.AspNetCore.Authorization
enthalten.
Neues Verhalten
Die AddAuthorization
-Methoden sind jetzt in Microsoft.AspNetCore.Authorization.Policy
enthalten. AddAuthorizationCore
ist der neue Name für die alten Methoden.
Grund für die Änderung
AddAuthorization
ist ein besserer Methodenname für das Hinzufügen aller allgemeinen Dienste, die für die Autorisierung benötigt werden.
Empfohlene Maßnahme
Fügen Sie entweder einen Verweis auf Microsoft.AspNetCore.Authorization.Policy
hinzu, oder verwenden Sie stattdessen AddAuthorizationCore
.
Kategorie
ASP.NET Core
Betroffene APIs
Autorisierung: IAllowAnonymous wurde aus AuthorizationFilterContext.Filters entfernt
Ab ASP.NET Core 3.0 fügt MVC keine AllowAnonymousFilters für [AllowAnonymous]-Attribute hinzu, die für Controller und Aktionsmethoden ermittelt wurden. Diese Änderung wird lokal für Ableitungen von AuthorizeAttributebehandelt, ist aber ein Breaking Change für IAsyncAuthorizationFilter- und IAuthorizationFilter-Implementierungen. Solche Implementierungen, die ein [TypeFilter]-Attribut als Wrapper verwenden, sind eine gängige und unterstützte Möglichkeit, um eine stark typisierte, attributbasierte Autorisierung zu erreichen, wenn sowohl Konfiguration als auch Abhängigkeitsinjektion (Dependency Injection, DI) erforderlich sind.
Eingeführt in Version
3.0
Altes Verhalten
IAllowAnonymous war in der AuthorizationFilterContext.Filters-Sammlung enthalten. Das Testen auf das Vorhandensein der Schnittstelle war ein gültiger Ansatz, um den Filter für einzelne Controllermethoden zu überschreiben oder zu deaktivieren.
Neues Verhalten
IAllowAnonymous
ist nicht mehr in der AuthorizationFilterContext.Filters
-Sammlung enthalten. IAsyncAuthorizationFilter
-Implementierungen, die vom alten Verhalten abhängig sind, verursachen in der Regel vorübergehende HTTP 401- (Nicht autorisiert) oder HTTP 403-Antworten (Unzulässig).
Grund für die Änderung
In ASP.NET Core 3.0 wurde eine neue Endpunktroutingstrategie eingeführt.
Empfohlene Maßnahme
Suchen Sie nach den Endpunktmetadaten für IAllowAnonymous
. Beispiel:
var endpoint = context.HttpContext.GetEndpoint();
if (endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null)
{
}
Ein Beispiel für diese Technik finden Sie in dieser HasAllowAnonymous-Methode.
Kategorie
ASP.NET Core
Betroffene APIs
Keine
Autorisierung: Implementierungen von IAuthorizationPolicyProvider erfordern eine neue Methode
In ASP.NET Core 3.0 wurde IAuthorizationPolicyProvider
eine neue GetFallbackPolicyAsync
-Methode hinzugefügt. Diese Fallbackrichtlinie wird von der Autorisierungsmiddleware verwendet, wenn keine Richtlinie angegeben wird.
Weitere Informationen finden Sie unter dotnet/aspnetcore#9759.
Eingeführt in Version
3.0
Altes Verhalten
Implementierungen von IAuthorizationPolicyProvider
haben keine GetFallbackPolicyAsync
-Methode erfordert.
Neues Verhalten
Implementierungen von IAuthorizationPolicyProvider
erfordern eine GetFallbackPolicyAsync
-Methode.
Grund für die Änderung
Es war eine neue Methode erforderlich, damit die neue AuthorizationMiddleware
verwendet wird, wenn keine Richtlinie angegeben wird.
Empfohlene Maßnahme
Fügen Sie Ihren Implementierungen von IAuthorizationPolicyProvider
die GetFallbackPolicyAsync
-Methode hinzu.
Kategorie
ASP.NET Core
Betroffene APIs
Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider
Zwischenspeicherung: CompactOnMemoryPressure-Eigenschaft wurde entfernt
Die veralteten MemoryCacheOptions-APIs wurden im Release ASP.NET Core 3.0 entfernt.
Änderungsbeschreibung
Diese Änderung resultiert aus aspnet/Caching#221. Weitere Informationen finden Sie unter dotnet/extensions#1062.
Eingeführt in Version
3.0
Altes Verhalten
Die MemoryCacheOptions.CompactOnMemoryPressure
-Eigenschaft war verfügbar.
Neues Verhalten
Die MemoryCacheOptions.CompactOnMemoryPressure
-Eigenschaft wurde entfernt.
Grund für die Änderung
Die automatische Komprimierung des Caches hat Probleme verursacht. Um unerwartetes Verhalten zu vermeiden, sollte der Cache nur bei Bedarf komprimiert werden.
Empfohlene Maßnahme
Um den Cache zu komprimieren, führen Sie eine Umwandlung in MemoryCache
durch und rufen bei Bedarf Compact
auf.
Kategorie
ASP.NET Core
Betroffene APIs
MemoryCacheOptions.CompactOnMemoryPressure
Zwischenspeicherung: Microsoft.Extensions.Caching.SqlServer verwendet neues SqlClient-Paket
Das Paket Microsoft.Extensions.Caching.SqlServer
verwendet anstelle des Pakets System.Data.SqlClient
das neue Paket Microsoft.Data.SqlClient
. Diese Änderung kann zu geringfügigen Breaking Changes beim Verhalten führen. Weitere Informationen finden Sie unter Introducing the new Microsoft.Data.SqlClient (Vorstellung des neuen Microsoft.Data.SqlClient).
Eingeführt in Version
3.0
Altes Verhalten
Das Paket Microsoft.Extensions.Caching.SqlServer
hat das Paket System.Data.SqlClient
verwendet.
Neues Verhalten
Microsoft.Extensions.Caching.SqlServer
verwendet jetzt das Paket Microsoft.Data.SqlClient
.
Grund für die Änderung
Microsoft.Data.SqlClient
ist ein neues Paket, das aus System.Data.SqlClient
erstellt wurde. Es enthält ab sofort alle neuen Funktionen.
Empfohlene Maßnahme
Kunden müssen sich um diesen Breaking Change nur kümmern, wenn sie die vom Paket Microsoft.Extensions.Caching.SqlServer
zurückgegebenen Typen verwendet und in System.Data.SqlClient
-Typen umgewandelt haben. Wenn z. B. eine DbConnection
in den alten SqlConnection-Typ umgewandelt wurde, muss die Umwandlung in den neuen Microsoft.Data.SqlClient.SqlConnection
-Typ geändert werden.
Kategorie
ASP.NET Core
Betroffene APIs
Keine
Zwischenspeicherung: „pubternal“-Typen wurden in ResponseCaching in „internal“-Typen geändert
In ASP.NET Core 3.0 wurden „pubternal“-Typen in ResponseCaching
in internal
geändert.
Außerdem werden die Standardimplementierungen von IResponseCachingPolicyProvider
und IResponseCachingKeyProvider
Diensten nicht mehr als Teil der AddResponseCaching
-Methode hinzugefügt.
Änderungsbeschreibung
In ASP.NET Core werden „pubternal“-Typen als public
deklariert, befinden sich jedoch in einem Namespace mit dem Suffix .Internal
. Diese Typen sind zwar öffentlich („public“), sie verfügen jedoch nicht über eine Unterstützungsrichtlinie und können daher Breaking Changes unterliegen. Da diese Typen leider relativ häufig versehentlich verwendet werden, können an diesen Projekten Breaking Changes auftreten, und die Fähigkeit zum Verwalten des Frameworks kann eingeschränkt werden.
Eingeführt in Version
3.0
Altes Verhalten
Diese Typen waren öffentlich sichtbar, wurden jedoch nicht unterstützt.
Neues Verhalten
Diese Typen sind jetzt internal
.
Grund für die Änderung
Der Geltungsbereich internal
entspricht besser der nicht unterstützten Richtlinie.
Empfohlene Maßnahme
Kopieren Sie Typen, die von Ihrer App oder Bibliothek verwendet werden.
Kategorie
ASP.NET Core
Betroffene APIs
Microsoft.AspNetCore.ResponseCaching.Internal.CachedResponse
Microsoft.AspNetCore.ResponseCaching.Internal.CachedVaryByRules
Microsoft.AspNetCore.ResponseCaching.Internal.IResponseCache
Microsoft.AspNetCore.ResponseCaching.Internal.IResponseCacheEntry
Microsoft.AspNetCore.ResponseCaching.Internal.IResponseCachingKeyProvider
Microsoft.AspNetCore.ResponseCaching.Internal.IResponseCachingPolicyProvider
Microsoft.AspNetCore.ResponseCaching.Internal.MemoryResponseCache
Microsoft.AspNetCore.ResponseCaching.Internal.ResponseCachingContext
Microsoft.AspNetCore.ResponseCaching.Internal.ResponseCachingKeyProvider
Microsoft.AspNetCore.ResponseCaching.Internal.ResponseCachingPolicyProvider
- Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.ResponseCachingMiddleware(RequestDelegate, IOptions<ResponseCachingOptions>, ILoggerFactory, IResponseCachingPolicyProvider, IResponseCache, IResponseCachingKeyProvider)
Schutz von Daten: DataProtection.Blobs verwendet neue Azure Storage-APIs
Azure.Extensions.AspNetCore.DataProtection.Blobs
hängt von den Azure Storage-Bibliotheken ab. Für diese Bibliotheken wurden die Assemblys, Pakete und Namespaces umbenannt. Ab ASP.NET Core 3.0 verwendet Azure.Extensions.AspNetCore.DataProtection.Blobs
die neuen APIs und Pakete mit dem Präfix Azure.Storage.
.
Wenn Sie Fragen zu den Azure Storage-APIs haben, lesen Sie unter https://github.com/Azure/azure-storage-net nach. Dieses Problem wird unter dotnet/aspnetcore#19570 behandelt.
Eingeführt in Version
3.0
Altes Verhalten
Das Paket verwies auf das NuGet-Paket WindowsAzure.Storage
.
Das Pakete verweist auf das NuGet-Paket Microsoft.Azure.Storage.Blob
.
Neues Verhalten
Das Pakete verweist auf das NuGet-Paket Azure.Storage.Blob
.
Grund für die Änderung
Diese Änderung ermöglicht Azure.Extensions.AspNetCore.DataProtection.Blobs
die Migration zu den empfohlenen Azure Storage-Paketen.
Empfohlene Aktion
Wenn Sie weiterhin die älteren Azure Storage-APIs mit ASP.NET Core 3.0 verwenden müssen, fügen Sie eine direkte Abhängigkeit vom Paket WindowsAzure.Storage oder Microsoft Azure Storage hinzu. Dieses Paket kann parallel zu den neuen Azure.Storage
-APIs installiert werden.
In vielen Fällen umfasst das Upgrade nur das Ändern der using
-Anweisungen, um die neuen Namespaces zu verwenden:
- using Microsoft.WindowsAzure.Storage;
- using Microsoft.WindowsAzure.Storage.Blob;
- using Microsoft.Azure.Storage;
- using Microsoft.Azure.Storage.Blob;
+ using Azure.Storage;
+ using Azure.Storage.Blobs;
Kategorie
ASP.NET Core
Betroffene APIs
Keine
Hosting: AspNetCoreModule v1 wurde aus dem Windows-Hostingpaket entfernt
Ab ASP.NET Core 3.0 ist AspNetCoreModule v1 (ANCM) nicht mehr im Windows-Hostingpaket enthalten.
ANCM v2 ist abwärtskompatibel mit ANCM OutOfProcess und wird für die Verwendung mit ASP.NET Core 3.0-Apps empfohlen.
Weitere Informationen finden Sie unter dotnet/aspnetcore#7095.
Eingeführt in Version
3.0
Altes Verhalten
ANCM v1 war im Windows-Hostingpaket enthalten.
Neues Verhalten
ANCM v1 ist nicht mehr im Windows-Hostingpaket enthalten.
Grund für die Änderung
ANCM v2 ist abwärtskompatibel mit ANCM OutOfProcess und wird für die Verwendung mit ASP.NET Core 3.0-Apps empfohlen.
Empfohlene Maßnahme
Verwenden Sie ANCM v2 mit ASP.NET Core 3.0-Apps.
Wenn ANCM v1 erforderlich ist, kann es mit dem Windows-Hostingpaket für ASP.NET Core 2.1 oder 2.2 installiert werden.
Diese Änderung stellt einen Breaking Change für ASP.NET Core 3.0-Apps dar, für die Folgendes gilt:
- Sie verwenden ANCM v1 explizit über
<AspNetCoreModuleName>AspNetCoreModule</AspNetCoreModuleName>
. - Sie verfügen über eine benutzerdefinierte Datei web.config mit
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
.
Kategorie
ASP.NET Core
Betroffene APIs
Keine
Hosting: Generischer Host schränkt Startup-Konstruktorinjektion ein
Die einzigen Typen, die vom generischen Host für Konstruktorinjektionen der Startup
-Klasse unterstützt werden, sind IHostEnvironment
, IWebHostEnvironment
und IConfiguration
. Apps, die WebHost
verwenden, sind nicht betroffen.
Änderungsbeschreibung
Vor ASP.NET Core 3.0 konnte die Konstruktorinjektion für beliebige Typen im Konstruktor der Startup
-Klasse verwendet werden. In ASP.NET Core 3.0 wurde der Webstapel der Bibliothek des generischen Hosts zugeordnet. Sie können die Änderung in der Datei Program.cs der Vorlagen sehen:
ASP.NET Core 2.x:
ASP.NET Core 3.0:
Host
verwendet einen Container zur Abhängigkeitsinjektion, um die App zu erstellen. WebHost
verwendet zwei Container: einen für den Host und einen für die App. Daher unterstützt der Startup
-Konstruktor keine benutzerdefinierte Dienstinjektion mehr. Es können nur IHostEnvironment
, IWebHostEnvironment
und IConfiguration
eingefügt werden. Diese Änderung verhindert Probleme mit Abhängigkeitsinjektionen, z. B. die doppelte Erstellung eines Singletondiensts.
Eingeführt in Version
3.0
Grund für die Änderung
Diese Änderung ist eine Folge der geänderten Zuordnung des Webstapels zur Bibliothek des generischen Hosts.
Empfohlene Maßnahme
Fügen Sie Dienste in die Signatur der Startup.Configure
-Methode ein. Zum Beispiel:
public void Configure(IApplicationBuilder app, IOptions<MyOptions> options)
Kategorie
ASP.NET Core
Betroffene APIs
Keine
Hosting: HTTPS-Umleitung für IIS-Out-of-Process-Apps aktiviert
In der Version 13.0.19218.0 des ASP.NET Core-Moduls (ANCM) für das Hosten über IIS-Out-of-Process wurde ein vorhandenes HTTPS-Umleitungsfeature für ASP.NET Core 3.0- und ASP.NET Core 2.2.-Apps aktiviert.
Weitere Informationen finden Sie unter dotnet/AspNetCore#15243.
Eingeführt in Version
3.0
Altes Verhalten
Bei der ASP.NET Core 2.1-Projektvorlage wurde zuerst Unterstützung für HTTPS-Middlewaremethoden wie UseHttpsRedirection und UseHsts eingeführt. Es musste eine Konfiguration hinzugefügt werden, um die HTTPS-Umleitung zu aktivieren, da Apps in der Entwicklung nicht den Standardport 443 verwenden. HTTP Strict Transport Security (HSTS) ist nur aktiv, wenn die Anforderung bereits HTTPS verwendet. Der Localhost wird standardmäßig übersprungen.
Neues Verhalten
In ASP.NET Core 3.0 wurde das IIS-HTTPS-Szenario verbessert. Dank dieser Optimierung kann eine App nun die HTTPS-Ports eines Servers ermitteln, und UseHttpsRedirection
funktioniert standardmäßig. Die In-Process-Komponente hat das Ermitteln von Ports mithilfe des IServerAddresses
-Features möglich gemacht. Das betrifft nur ASP.NET Core 3.0-Apps, da die In-Process-Bibliothek mit dem Framework versioniert ist. Die Out-of-Process-Komponente wurde so geändert, dass die ASPNETCORE_HTTPS_PORT
-Umgebungsvariable automatisch hinzugefügt wird. Diese Änderung wirkt sich sowohl auf ASP.NET Core 2.2- als auch ASP.NET Core 3.0-Apps aus, da die Out-of-Process-Komponente global geteilt wird. ASP.NET Core 2.1-Apps sind nicht betroffen, da sie standardmäßig eine ältere ANCM-Version verwenden.
Das hier beschriebene Verhalten wurde in ASP.NET Core 3.0.1 und ASP.NET Core 3.1.0 Preview 3 so geändert, dass die Behavior Changes in ASP.NET Core 2.x umgekehrt werden. Diese Änderungen betreffen nur IIS-Out-of-Process-Apps.
Wie oben beschrieben hatte das Installieren von ASP.NET Core 3.0.0 die Begleiterscheinung, dass auch die UseHttpsRedirection
-Middleware in ASP.NET Core 2.x-Apps aktiviert wurde. Deshalb wurde das ANCM in ASP.NET Core 3.0.1 und in ASP.NET Core 3.1.0 Preview 3 so geändert, dass eine Installation des Frameworks nicht mehr diese Begleiterscheinung für ASP.NET Core 2.x-Apps hat. Die ASPNETCORE_HTTPS_PORT
-Umgebungsvariable, die in ASP.NET Core 3.0.0 vom ANCM aufgefüllt wurde, wurde in ASP.NET Core 3.0.1 und ASP.NET Core 3.1.0 Preview 3 in ASPNETCORE_ANCM_HTTPS_PORT
geändert. UseHttpsRedirection
wurde in diesen Releases ebenfalls aktualisiert, sodass die neuen und die alten Variablen verstanden werden können. ASP.NET Core 2.x wird nicht aktualisiert. Das führt dazu, dass das vorherige Verhalten (standardmäßig deaktiviert) wiederhergestellt wird.
Grund für die Änderung
Verbesserung der ASP.NET Core 3.0-Funktionen.
Empfohlene Maßnahme
Es ist keine Aktion erforderlich, wenn Sie möchten, dass alle Clients HTTPS verwenden. Wenn Sie zulassen möchten, dass einige Clients HTTP verwenden, führen Sie einen der folgenden Schritte aus:
Entfernen Sie die Aufrufe von
UseHttpsRedirection
undUseHsts
aus derStartup.Configure
-Methode Ihres Projekts, und stellen Sie die App neu bereit.Legen Sie in der Datei web.config die
ASPNETCORE_HTTPS_PORT
-Umgebungsvariable auf eine leere Zeichenfolge fest. Diese Änderung kann direkt auf dem Server ausgeführt werden, ohne dass die App dafür neu bereitgestellt werden muss. Beispiel:<aspNetCore processPath="dotnet" arguments=".\WebApplication3.dll" stdoutLogEnabled="false" stdoutLogFile="\\?\%home%\LogFiles\stdout" > <environmentVariables> <environmentVariable name="ASPNETCORE_HTTPS_PORT" value="" /> </environmentVariables> </aspNetCore>
Folgende Aktionen sind für UseHttpsRedirection
weiterhin möglich:
- Manuelles Aktivieren in ASP.NET Core 2.x, indem die
ASPNETCORE_HTTPS_PORT
-Umgebungsvariable auf die entsprechende Portnummer festgelegt wird. In den meisten Produktionsszenarios ist das 443. - Deaktivieren in ASP.NET Core 3.x, indem
ASPNETCORE_ANCM_HTTPS_PORT
mit einem leeren Zeichenfolgenwert definiert wird. Dieser Wert wird auf dieselbe Art und Weise festgelegt, wie im vorherigenASPNETCORE_HTTPS_PORT
-Beispiel.
Auf Computern, auf denen ASP.NET Core 3.0.0-Apps ausgeführt werden, sollte die ASP.NET Core 3.0.1-Runtime installiert werden, bevor das ANCM von ASP.NET Core 3.1.0 Preview 3 installiert wird. Dadurch kann sichergestellt werden, dass UseHttpsRedirection
für ASP.NET Core 3.0-Apps weiterhin erwartungsgemäß ausgeführt wird.
In Azure App Service wird das ANCM aufgrund seiner globalen Natur gemäß eines von der Runtime unabhängigen Plans bereitgestellt. Das ANCM wurde in Azure nach den Bereitstellungen von ASP.NET Core 3.0.1 und ASP.NET Core 3.1.0 mit diesen Änderungen bereitgestellt.
Kategorie
ASP.NET Core
Betroffene APIs
HttpsPolicyBuilderExtensions.UseHttpsRedirection(IApplicationBuilder)
Hosting: IHostingEnvironment- und IApplicationLifetime-Typen als veraltet markiert und ersetzt
Es wurden neue Typen eingeführt, um die vorhandenen Typen IHostingEnvironment
und IApplicationLifetime
zu ersetzen.
Eingeführt in Version
3.0
Altes Verhalten
Es gab zwei verschiedene IHostingEnvironment
- und IApplicationLifetime
-Typen von Microsoft.Extensions.Hosting
und Microsoft.AspNetCore.Hosting
.
Neues Verhalten
Die alten Typen wurden als veraltet markiert und durch neue ersetzt.
Grund für die Änderung
Als Microsoft.Extensions.Hosting
in ASP.NET Core 2.1 eingeführt wurde, wurden einige Typen wie IHostingEnvironment
und IApplicationLifetime
aus Microsoft.AspNetCore.Hosting
kopiert. Einige Änderungen in ASP.NET Core 3.0 führen dazu, dass Apps die beiden Namespaces Microsoft.Extensions.Hosting
und Microsoft.AspNetCore.Hosting
enthalten. Jede Verwendung dieser doppelten Typen verursacht einen Compilerfehler aufgrund eines mehrdeutigen Verweises, wenn auf beide Namespaces verwiesen wird.
Empfohlene Maßnahme
Ersetzen Sie alle Verwendungen der alten Typen wie unten gezeigt durch die neu eingeführten Typen:
Veraltete Typen (Warnung):
- Microsoft.Extensions.Hosting.IHostingEnvironment
- Microsoft.AspNetCore.Hosting.IHostingEnvironment
- Microsoft.Extensions.Hosting.IApplicationLifetime
- Microsoft.AspNetCore.Hosting.IApplicationLifetime
- Microsoft.Extensions.Hosting.EnvironmentName
- Microsoft.AspNetCore.Hosting.EnvironmentName
Neue Typen:
- Microsoft.Extensions.Hosting.IHostEnvironment
Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment
- Microsoft.Extensions.Hosting.IHostApplicationLifetime
- Microsoft.Extensions.Hosting.Environments
Die neuen Erweiterungsmethoden IHostEnvironment
, IsDevelopment
und IsProduction
befinden sich im Microsoft.Extensions.Hosting
-Namespace. Dieser Namespace muss Ihrem Projekt eventuell hinzugefügt werden.
Kategorie
ASP.NET Core
Betroffene APIs
- Microsoft.AspNetCore.Hosting.EnvironmentName
- Microsoft.AspNetCore.Hosting.IApplicationLifetime
- Microsoft.AspNetCore.Hosting.IHostingEnvironment
- Microsoft.Extensions.Hosting.EnvironmentName
- Microsoft.Extensions.Hosting.IApplicationLifetime
- Microsoft.Extensions.Hosting.IHostingEnvironment
Hosting: ObjectPoolProvider wurde aus WebHostBuilder-Abhängigkeiten entfernt
Um ASP.NET Core produktiver zu machen, wurde der ObjectPoolProvider
aus dem Hauptsatz von Abhängigkeiten entfernt. Bestimmte Komponenten, die von ObjectPoolProvider
abhängen, fügen sich jetzt selbst hinzu.
Weitere Informationen finden Sie unter dotnet/aspnetcore#5944.
Eingeführt in Version
3.0
Altes Verhalten
WebHostBuilder
hat ObjectPoolProvider
standardmäßig im Container für Abhängigkeitsinjektionen bereitgestellt.
Neues Verhalten
WebHostBuilder
stellt ObjectPoolProvider
nicht mehr standardmäßig im Container für Abhängigkeitsinjektionen bereit.
Grund für die Änderung
Diese Änderung wurde vorgenommen, um ASP.NET Core produktiver zu machen.
Empfohlene Maßnahme
Wenn die Komponente ObjectPoolProvider
erfordert, muss sie Ihren Abhängigkeiten über die IServiceCollection
hinzugefügt werden.
Kategorie
ASP.NET Core
Betroffene APIs
Keine
HTTP: Erweiterbarkeit von DefaultHttpContext wurde entfernt
Im Rahmen der Leistungsverbesserungen in ASP.NET Core 3.0 wurde die Erweiterbarkeit von DefaultHttpContext
aufgehoben. Die Klasse ist jetzt sealed
. Weitere Informationen finden Sie unter dotnet/aspnetcore#6504.
Wenn Sie für Komponententests Mock<DefaultHttpContext>
verwenden, nutzen Sie stattdessen Mock<HttpContext>
oder new DefaultHttpContext()
.
Weitere Informationen finden Sie unter dotnet/aspnetcore#6534.
Eingeführt in Version
3.0
Altes Verhalten
Klassen konnten von DefaultHttpContext
abgeleitet werden.
Neues Verhalten
Klassen können nicht mehr von DefaultHttpContext
abgeleitet werden.
Grund für die Änderung
Die Erweiterbarkeit wurde anfänglich bereitgestellt, um das Pooling des HttpContext
zu ermöglichen, sie führt aber zu einer unnötigen Komplexität und hat andere Optimierungen behindert.
Empfohlene Maßnahme
Wenn Sie in Komponententests Mock<DefaultHttpContext>
verwenden, nutzen Sie stattdessen Mock<HttpContext>
.
Kategorie
ASP.NET Core
Betroffene APIs
Microsoft.AspNetCore.Http.DefaultHttpContext
HTTP: HeaderNames-Konstanten zu „static readonly“ geändert
Ab ASP.NET Core 3.0 Preview 5 wurden die Felder in Microsoft.Net.Http.Headers.HeaderNames von const
in static readonly
geändert.
Weitere Informationen finden Sie unter dotnet/aspnetcore#9514.
Eingeführt in Version
3.0
Altes Verhalten
Diese Felder waren const
.
Neues Verhalten
Diese Felder sind nun static readonly
.
Grund für die Änderung
Die Änderung hat folgende Gründe:
- Sie verhindert, dass die Werte über Assemblygrenzen hinweg eingebettet werden, sodass bei Bedarf Korrekturen an Werten möglich sind.
- Sie ermöglicht schnellere Überprüfungen der Verweisgleichheit.
Empfohlene Maßnahme
Kompilieren Sie mit 3.0 neu. Sie müssen Quellcode ändern, der diese Felder auf folgende Weise verwendet:
- Als unzulässiges Attributargument
- Als einen
case
in einerswitch
-Anweisung - Beim Definieren einer anderen
const
Um diesen Breaking Change zu umgehen, verwenden Sie selbst definierte Headernamenkonstanten oder Zeichenfolgenliterale.
Kategorie
ASP.NET Core
Betroffene APIs
Microsoft.Net.Http.Headers.HeaderNames
HTTP: Änderungen an der Infrastruktur von Antworttexten
Die Infrastruktur für HTTP-Antworttexte wurde geändert. Wenn Sie HttpResponse
direkt verwenden, sollten keine Änderungen am Code erforderlich sein. Wenn Sie HttpResponse.Body
umschließen oder auf HttpContext.Features
zugreifen, lesen Sie weiter.
Eingeführt in Version
3.0
Altes Verhalten
Dem HTTP-Antworttext waren drei APIs zugeordnet:
IHttpResponseFeature.Body
IHttpSendFileFeature.SendFileAsync
IHttpBufferingFeature.DisableResponseBuffering
Neues Verhalten
Wenn Sie HttpResponse.Body
ersetzen, wird das gesamte IHttpResponseBodyFeature
durch einen Wrapper um den angegebenen Stream ersetzt, indem StreamResponseBodyFeature
verwendet wird, um Standardimplementierungen für alle erwarteten APIs bereitzustellen. Durch das Zurücksetzen des ursprünglichen Streams wird diese Änderung zurückgesetzt.
Grund für die Änderung
Die Antworttext-APIs sollen in einer einzigen neuen Funktionsschnittstelle zusammengefasst werden.
Empfohlene Maßnahme
Verwenden Sie IHttpResponseBodyFeature
an den Stellen, an denen Sie zuvor IHttpResponseFeature.Body
, IHttpSendFileFeature
oder IHttpBufferingFeature
verwendet haben.
Kategorie
ASP.NET Core
Betroffene APIs
- Microsoft.AspNetCore.Http.Features.IHttpBufferingFeature
- Microsoft.AspNetCore.Http.Features.IHttpResponseFeature.Body
- Microsoft.AspNetCore.Http.Features.IHttpSendFileFeature
HTTP: einige Standardwerte für SameSite für Cookies zu „None“ geändert
Bei SameSite
handelt es sich um eine Option für Cookies, mit der einige CSRF-Angriffe (Cross-Site Request Forgery, websiteübergreifende Anforderungsfälschung) entschärft werden können. Als diese Option erstmals eingeführt wurde, wurden inkonsistente Standardwerte für verschiedene ASP.NET Core-APIs verwendet. Diese Inkonsistenz führte zu verwirrenden Ergebnissen. Ab ASP.NET Core 3.0 sind diese Standardeinstellungen besser abgestimmt. Sie müssen dieses Feature auf Komponentenbasis aktivieren.
Eingeführt in Version
3.0
Altes Verhalten
Ähnliche ASP.NET Core-APIs verwendeten unterschiedliche SameSiteMode-Standardwerte. Ein Beispiel für die Inkonsistenz sind HttpResponse.Cookies.Append(String, String)
und HttpResponse.Cookies.Append(String, String, CookieOptions)
, wofür die Standardwerte SameSiteMode.None
bzw. SameSiteMode.Lax
verwendet wurden.
Neues Verhalten
Alle betroffenen APIs verwenden standardmäßig SameSiteMode.None
.
Grund für die Änderung
Der Standardwert wurde geändert, um SameSite
zu einem Feature zu machen, das aktiviert werden muss.
Empfohlene Maßnahme
Für jede Komponente, die Cookies ausgibt, muss entschieden werden, ob SameSite
für die zugehörigen Szenarios geeignet ist. Überprüfen Sie die Nutzung der betroffenen APIs, und konfigurieren Sie SameSite
nach Bedarf neu.
Kategorie
ASP.NET Core
Betroffene APIs
HTTP: Synchrones E/A auf allen Servern deaktiviert
Ab ASP.NET Core 3.0 sind synchrone Servervorgänge standardmäßig deaktiviert.
Änderungsbeschreibung
AllowSynchronousIO
ist eine Option auf sämtlichen Servern, die synchrone E/A-APIs wie HttpRequest.Body.Read
, HttpResponse.Body.Write
und Stream.Flush
aktiviert bzw. deaktiviert. Diese APIs waren schon länger Ursache für fehlende Threads und hängende Apps. Ab ASP.NET Core 3.0 Preview 3 sind diese synchronen Vorgänge standardmäßig deaktiviert.
Betroffene Server:
- Kestrel
- HttpSys
- IIS In-Process
- TestServer
Erwartbare Fehler:
Synchronous operations are disallowed. Call ReadAsync or set AllowSynchronousIO to true instead.
Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead.
Synchronous operations are disallowed. Call FlushAsync or set AllowSynchronousIO to true instead.
Jeder Server verfügt über eine AllowSynchronousIO
-Option, die dieses Verhalten steuert und nun standardmäßig false
ist.
Das Verhalten kann auch auf Anforderung als vorübergehende Entschärfung überschrieben werden. Beispiel:
var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
}
Wenn Sie Probleme mit einem TextWriter
oder einem anderen Stream haben, der eine synchrone API in Dispose
aufruft, rufen Sie stattdessen die neue DisposeAsync
-API auf.
Weitere Informationen finden Sie unter dotnet/aspnetcore#7644.
Eingeführt in Version
3.0
Altes Verhalten
HttpRequest.Body.Read
, HttpResponse.Body.Write
und Stream.Flush
waren standardmäßig zulässig.
Neues Verhalten
Diese synchronen APIs sind nun standardmäßig nicht mehr zulässig:
Erwartbare Fehler:
Synchronous operations are disallowed. Call ReadAsync or set AllowSynchronousIO to true instead.
Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead.
Synchronous operations are disallowed. Call FlushAsync or set AllowSynchronousIO to true instead.
Grund für die Änderung
Diese synchronen APIs waren schon länger Ursache für fehlende Threads und hängende Apps. Ab ASP.NET Core 3.0 Preview 3 sind synchrone Vorgänge standardmäßig deaktiviert.
Empfohlene Maßnahme
Verwenden Sie die asynchronen Versionen der Methoden. Das Verhalten kann auch auf Anforderung als vorübergehende Entschärfung überschrieben werden.
var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
}
Kategorie
ASP.NET Core
Betroffene APIs
Identität: AddDefaultUI-Methodenüberladung wurde entfernt.
Ab ASP.NET Core 3.0 ist die Methodenüberladung IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder,UIFramework) nicht mehr vorhanden.
Eingeführt in Version
3.0
Grund für die Änderung
Diese Änderung wurde aufgrund der Einführung der Funktion für statische Webressourcen notwendig.
Empfohlene Aktion
Rufen Sie anstelle der Überladung IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder) auf, die zwei Argumente akzeptiert. Wenn Sie Bootstrap 3 verwenden, fügen Sie außerdem die folgende Zeile in einem <PropertyGroup>
-Element in Ihrer Projektdatei hinzu:
<IdentityUIFrameworkVersion>Bootstrap3</IdentityUIFrameworkVersion>
Kategorie
ASP.NET Core
Betroffene APIs
IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder,UIFramework)
Identität: Bootstrap-Standardversion der Benutzeroberfläche geändert
Ab ASP.NET Core 3.0 verwendet die Identitäts-Benutzeroberfläche standardmäßig Version 4 von Bootstrap.
Eingeführt in Version
3.0
Altes Verhalten
Der services.AddDefaultIdentity<IdentityUser>().AddDefaultUI();
-Methodenaufruf war mit services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap3);
identisch.
Neues Verhalten
Der services.AddDefaultIdentity<IdentityUser>().AddDefaultUI();
-Methodenaufruf ist mit services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap4);
identisch.
Grund für die Änderung
Bootstrap 4 wurde im Zeitrahmen von ASP.NET Core 3.0 veröffentlicht.
Empfohlene Maßnahme
Diese Änderung hat Auswirkungen auf Ihre Arbeit, wenn Sie die Standardbenutzeroberfläche für Identitäten verwenden und diese in Startup.ConfigureServices
hinzugefügt haben, wie im folgenden Beispiel gezeigt:
services.AddDefaultIdentity<IdentityUser>().AddDefaultUI();
Führen Sie eine der folgenden Aktionen aus:
Migrieren Sie Ihre App mithilfe der Migrationsanleitung zur Verwendung von Bootstrap 4.
Aktualisieren Sie
Startup.ConfigureServices
, um die Verwendung von Bootstrap 3 zu erzwingen. Zum Beispiel:services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap3);
Kategorie
ASP.NET Core
Betroffene APIs
Keine
Identität: SignInAsync löst eine Ausnahme für eine nicht authentifizierte Identität aus
Standardmäßig löst SignInAsync
eine Ausnahme für Prinzipale/Identitäten aus, bei denen IsAuthenticated
false
ist.
Eingeführt in Version
3.0
Altes Verhalten
SignInAsync
akzeptiert alle Prinzipale/Identitäten, einschließlich Identitäten, bei denen IsAuthenticated
false
ist.
Neues Verhalten
Standardmäßig löst SignInAsync
eine Ausnahme für Prinzipale/Identitäten aus, bei denen IsAuthenticated
false
ist. Es gibt ein neues Flag, mit dem dieses Verhalten unterdrückt werden kann, aber das Standardverhalten wurde geändert.
Grund für die Änderung
Das alte Verhalten war problematisch, da diese Prinzipale standardmäßig von [Authorize]
/ RequireAuthenticatedUser()
abgelehnt wurden.
Empfohlene Maßnahme
In ASP.NET Core 3.0 Preview 6 gibt es das Flag RequireAuthenticatedSignIn
in AuthenticationOptions
, das standardmäßig true
ist. Legen Sie dieses Flag auf false
fest, um das alte Verhalten wiederherzustellen.
Kategorie
ASP.NET Core
Betroffene APIs
Keine
Identität: SignInManager-Konstruktor akzeptiert neuen Parameter
Ab ASP.NET Core 3.0 wurde dem SignInManager
-Konstruktor ein neuer IUserConfirmation<TUser>
-Parameter hinzugefügt. Weitere Informationen finden Sie unter dotnet/aspnetcore#8356.
Eingeführt in Version
3.0
Grund für die Änderung
Diese Änderung war erforderlich, um Unterstützung für neue E-Mail-/Bestätigungsflows für Identitäten zu erzielen.
Empfohlene Maßnahme
Wenn Sie manuell einen SignInManager
erstellen, stellen Sie eine Implementierung von IUserConfirmation
bereit, oder nutzen Sie dafür eine der Abhängigkeitsinjektion.
Kategorie
ASP.NET Core
Betroffene APIs
Identität: Benutzeroberfläche verwendet Funktion für statische Webressourcen
In ASP.NET Core 3.0 wurde eine Funktion für statische Webressourcen eingeführt, an die die Identitäts-Benutzeroberfläche nun angepasst wurde.
Änderungsbeschreibung
Die Identitäts-Benutzeroberfläche wurde an die Funktion für statische Webressourcen angepasst:
- Die Auswahl des Frameworks erfolgt mithilfe der
IdentityUIFrameworkVersion
-Eigenschaft in Ihrer Projektdatei. - Bootstrap 4 ist das Standardframework für die Identitäts-Benutzeroberfläche. Bootstrap 3 hat das Ende des Lebenszyklus erreicht, und Sie sollten zu einer unterstützten Version migrieren.
Eingeführt in Version
3.0
Altes Verhalten
Das Standardframework für die Identitäts-Benutzeroberfläche war bisher Bootstrap 3. Das Benutzeroberflächen-Framework kann mithilfe eines Parameters im AddDefaultUI
-Methodenaufruf in Startup.ConfigureServices
konfiguriert werden.
Neues Verhalten
Das Standardframework für die Identitäts-Benutzeroberfläche ist nun Bootstrap 4. Das Benutzeroberflächen-Framework muss in der Projektdatei und nicht mehr im AddDefaultUI
-Methodenaufruf konfiguriert werden.
Grund für die Änderung
Durch die Einführung der Funktion für statische Webressourcen musste die Konfiguration des Benutzeroberflächen-Frameworks auf MSBuild umgestellt werden. Die Entscheidung über das einzubettende Framework wird zur Buildzeit und nicht zur Laufzeit getroffen.
Empfohlene Maßnahme
Überprüfen Sie die Website-Benutzeroberfläche, um sicherzustellen, dass die neuen Bootstrap 4-Komponenten kompatibel sind. Verwenden Sie ggf. die MSBuild-Eigenschaft IdentityUIFrameworkVersion
, um zu Bootstrap 3 zurückzukehren. Fügen Sie die-Eigenschaft einem <PropertyGroup>
-Element in Ihrer Projektdatei hinzu:
<IdentityUIFrameworkVersion>Bootstrap3</IdentityUIFrameworkVersion>
Kategorie
ASP.NET Core
Betroffene APIs
IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder, UIFramework)
Kestrel: Verbindungsadapter wurde entfernt
Als Teil der Umstellung von „pubternal“-APIs zu public
wurde das Konzept eines IConnectionAdapter
aus Kestrel entfernt. Verbindungsadapter wurden durch Verbindungsmiddleware ersetzt. Diese ähnelt der HTTP-Middleware in der ASP.NET Core-Pipeline, ist aber für Verbindungen auf niedrigerer Ebene konzipiert. Die HTTPS- und Verbindungsprotokollierung wurden von den Verbindungsadaptern zur Verbindungsmiddleware verschoben. Diese Erweiterungsmethoden sollten weiterhin nahtlos funktionieren, aber die Implementierungsdetails wurden geändert.
Weitere Informationen finden Sie unter dotnet/aspnetcore#11412. Weitere Informationen finden Sie unter dotnet/aspnetcore#11475.
Eingeführt in Version
3.0
Altes Verhalten
Kestrel-Erweiterbarkeitskomponenten wurden mit IConnectionAdapter
erstellt.
Neues Verhalten
Kestrel-Erweiterbarkeitskomponenten werden als Middleware erstellt.
Grund für die Änderung
Mit dieser Änderung soll eine flexiblere Erweiterbarkeitsarchitektur bereitgestellt werden.
Empfohlene Maßnahme
Stellen Sie alle Implementierungen von IConnectionAdapter
wie hier gezeigt auf das neue Middlewarekonzept um.
Kategorie
ASP.NET Core
Betroffene APIs
Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal.IConnectionAdapter
Kestrel: Leere HTTPS-Assembly wurde entfernt
Die Assembly Microsoft.AspNetCore.Server.Kestrel.Https wurde entfernt.
Eingeführt in Version
3.0
Grund für die Änderung
In ASP.NET Core 2.1 wurde der Inhalt von Microsoft.AspNetCore.Server.Kestrel.Https
nach Microsoft.AspNetCore.Server.Kestrel.Core verschoben. Diese Änderung wurde ohne Breaking Change mithilfe von [TypeForwardedTo]
-Attributen durchgeführt.
Empfohlene Maßnahme
- In Bibliotheken, die auf
Microsoft.AspNetCore.Server.Kestrel.Https
2.0 verweisen, sollten alle ASP.NET Core-Abhängigkeiten auf 2.1 oder höher aktualisiert werden. Andernfalls können sie beim Laden in eine ASP.NET Core 3.0-App unterbrochen werden. - In Apps und Bibliotheken, die auf ASP.NET Core 2.1 und höher abzielen, sollten alle direkten Verweise auf das NuGet-Paket
Microsoft.AspNetCore.Server.Kestrel.Https
entfernt werden.
Kategorie
ASP.NET Core
Betroffene APIs
Keine
Kestrel: Anforderungstrailer-Header wurden in neue Sammlung verschoben
In früheren Versionen fügte Kestrel aufgeteilte HTTP/1.1-Trailer-Header in die Sammlung der Anforderungsheader ein, wenn der Anforderungstext bis zum Ende gelesen wurde. Durch dieses Verhalten war keine eindeutige Trennung zwischen Headern und Trailern möglich. Es wurde entschieden, die Trailer in eine neue Sammlung zu verschieben.
HTTP/2-Anforderungstrailer waren in ASP.NET Core 2.2 nicht verfügbar. Sie sind jetzt aber in dieser neuen Sammlung in ASP.NET Core 3.0 enthalten.
Für den Zugriff auf diese Trailer wurden neue Anforderungserweiterungsmethoden hinzugefügt.
HTTP/1.1-Trailer sind verfügbar, sobald der gesamte Anforderungstext gelesen wurde.
HTTP/2-Trailer sind verfügbar, sobald sie vom Client empfangen wurden. Der Client sendet die Trailer erst, wenn der gesamte Anforderungstext mindestens vom Server gepuffert wurde. Sie müssen möglicherweise den Anforderungstext lesen, um Pufferspeicher freizugeben. Trailer sind immer verfügbar, wenn Sie den Anforderungstext bis zum Ende lesen. Die Trailer markieren das Ende des Texts.
Eingeführt in Version
3.0
Altes Verhalten
Anforderungstrailer-Header wurden der Sammlung HttpRequest.Headers
hinzugefügt.
Neues Verhalten
Anforderungstrailer-Header sind nicht in der Sammlung HttpRequest.Headers
enthalten. Verwenden Sie die folgenden Erweiterungsmethoden in HttpRequest
, um darauf zuzugreifen:
GetDeclaredTrailers()
ruft den Anforderungsheader „Trailer“ ab, in dem aufgelistet wird, welche Trailer nach dem Text erwartet werden.SupportsTrailers()
gibt an, ob die Anforderung das Empfangen von Trailer-Headern unterstützt.CheckTrailersAvailable()
legt fest, ob die Anforderung Trailer unterstützt und ob diese zum Lesen verfügbar sind.GetTrailer(string trailerName)
ruft den angeforderten Trailer-Header aus der Antwort ab.
Grund für die Änderung
Trailer stellen ein wichtiges Feature in Szenarien wie gRPC dar. Das Zusammenführen der Trailer mit den Anforderungsheadern war für Benutzer verwirrend.
Empfohlene Maßnahme
Verwenden Sie die trailerbezogenen Erweiterungsmethoden in HttpRequest
, um auf Trailer zuzugreifen.
Kategorie
ASP.NET Core
Betroffene APIs
Kestrel: Transportabstraktionen entfernt und öffentlich gemacht
Im Rahmen der Umstellung von „pubternal“-APIs werden die Kestrel-APIs auf der Datentransportschicht als öffentliche Schnittstelle in der Microsoft.AspNetCore.Connections.Abstractions
-Bibliothek verfügbar gemacht.
Eingeführt in Version
3.0
Altes Verhalten
- Abstraktionen zum Datentransport waren in der
Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions
-Bibliothek verfügbar. - Die
ListenOptions.NoDelay
-Eigenschaft war verfügbar.
Neues Verhalten
- Die
IConnectionListener
-Schnittstelle wurde in derMicrosoft.AspNetCore.Connections.Abstractions
-Bibliothek eingeführt, um die am häufigsten verwendeten Funktionen aus der...Transport.Abstractions
-Bibliothek verfügbar zu machen. NoDelay
ist nun in den Datentransportoptionen (LibuvTransportOptions
undSocketTransportOptions
) verfügbar.SchedulingMode
ist nicht mehr verfügbar.
Grund für die Änderung
In ASP.NET Core 3.0 werden keine „pubternal“-APIs mehr verwendet.
Empfohlene Maßnahme
Kategorie
ASP.NET Core
Betroffene APIs
Keine
Lokalisierung: ResourceManagerWithCultureStringLocalizer und WithCulture wurden als veraltet markiert.
Die ResourceManagerWithCultureStringLocalizer-Klasse und der Schnittstellenmember WithCulture führten häufig zu Verwirrung bei Benutzern der Lokalisierung, insbesondere bei der Erstellung einer eigenen Implementierung von IStringLocalizer
. Diese Elemente vermittelten dem Benutzer den Eindruck, dass eine IStringLocalizer
-Instanz lediglich „pro Sprache, pro Ressource“ gilt. Tatsächlich sollten die Instanzen nur „pro Ressource“ gelten. Die gesuchte Sprache wird zur Ausführungszeit von der CultureInfo.CurrentUICulture
festgelegt. Um dieses Problem zu beheben, wurden die APIs in ASP.NET Core 3.0 als veraltet markiert. Die APIs werden in einem der nächsten Releases entfernt.
Weitere Kontextinformationen finden Sie unter dotnet/aspnetcore#3324. Weitere Informationen finden Sie unter dotnet/aspnetcore#7756.
Eingeführt in Version
3.0
Altes Verhalten
Methoden wurden nicht als Obsolete
gekennzeichnet.
Neues Verhalten
Methoden werden als Obsolete
gekennzeichnet.
Grund für die Änderung
Die APIs stellten einen Anwendungsfall dar, der nicht empfohlen wird. Der Entwurf der Lokalisierung war unklar.
Empfohlene Aktion
Es wird empfohlen, stattdessen ResourceManagerStringLocalizer
zu verwenden. Lassen Sie die Kultur durch CurrentCulture
festlegen. Falls dies nicht möglich ist, erstellen Sie eine Kopie von ResourceManagerWithCultureStringLocalizer, und verwenden Sie diese.
Kategorie
ASP.NET Core
Betroffene APIs
Microsoft.Extensions.Localization.ResourceManagerWithCultureStringLocalizer
Microsoft.Extensions.Localization.ResourceManagerStringLocalizer.WithCulture
Protokollierung: DebugLogger-Klasse wurde als „internal“ deklariert
Vor ASP.NET Core 3.0 war public
Zugriffsmodifizierer von DebugLogger
. In ASP.NET Core 3.0 wurde der Zugriffsmodifizierer in internal
geändert.
Eingeführt in Version
3.0
Grund für die Änderung
Die Änderung erfolgt aus folgenden Gründen:
- Erzwingen von Konsistenz mit anderen Protokollierungsimplementierungen, z. B.
ConsoleLogger
- Reduzieren der API-Oberfläche
Empfohlene Maßnahme
Verwenden Sie die AddDebug ILoggingBuilder
-Erweiterungsmethode, um die Debugprotokollierung zu aktivieren. DebugLoggerProvider ist auch weiterhin public
, wenn der Dienst manuell registriert werden muss.
Kategorie
ASP.NET Core
Betroffene APIs
Microsoft.Extensions.Logging.Debug.DebugLogger
MVC: Async-Suffix aus Controlleraktionsnamen entfernt
Im Zusammenhang mit dotnet/aspnetcore#4849 entfernt ASP.NET Core MVC das Suffix Async
standardmäßig aus Aktionsnamen. Ab ASP.NET Core 3.0 wirkt sich diese Änderung sowohl auf das Routing als auch auf die Linkgenerierung aus.
Eingeführt in Version
3.0
Altes Verhalten
Nehmen Sie den folgenden ASP.NET Core MVC-Controller an:
public class ProductController : Controller
{
public async IActionResult ListAsync()
{
var model = await DbContext.Products.ToListAsync();
return View(model);
}
}
Die Aktion ist über Product/ListAsync
routingfähig. Für die Linkgenerierung muss das Suffix Async
angegeben werden. Beispiel:
<a asp-controller="Product" asp-action="ListAsync">List</a>
Neues Verhalten
In ASP.NET Core 3.0 ist die Aktion über Product/List
routingfähig. Der Code zur Linkgenerierung sollte das Suffix Async
nicht verwenden. Beispiel:
<a asp-controller="Product" asp-action="List">List</a>
Diese Änderung hat keine Auswirkungen auf Namen, die mit dem [ActionName]
-Attribut angegeben werden. Sie können neue Verhalten deaktivieren, indem Sie MvcOptions.SuppressAsyncSuffixInActionNames
in Startup.ConfigureServices
auf false
festlegen:
services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});
Grund für die Änderung
Es gibt die Konvention, asynchrone .NET-Methoden durch das Suffix Async
zu kennzeichnen. Wenn eine Methode jedoch eine MVC-Aktion definiert, ist das Suffix Async
nicht wünschenswert.
Empfohlene Maßnahme
Wenn Ihre App von MVC-Aktionen abhängig ist, die das Suffix Async
im Namen beibehalten, führen Sie eine der folgenden Maßnahmen aus:
- Verwenden Sie das
[ActionName]
-Attribut, um den ursprünglichen Namen beizubehalten. - Deaktivieren Sie das Umbenennen vollständig, indem Sie
MvcOptions.SuppressAsyncSuffixInActionNames
inStartup.ConfigureServices
auffalse
festlegen:
services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});
Kategorie
ASP.NET Core
Betroffene APIs
Keine
MVC: JsonResult wurde in Microsoft.AspNetCore.Mvc.Core verschoben
JsonResult
wurde in die Microsoft.AspNetCore.Mvc.Core
-Assembly verschoben. Dieser Typ wurde bisher in Microsoft.AspNetCore.Mvc.Formatters.Json definiert. Ein [TypeForwardedTo]-Attribut auf Assemblyebene wurde Microsoft.AspNetCore.Mvc.Formatters.Json
hinzugefügt, um dieses Problem für die Mehrheit der Benutzer zu beheben. Bei Apps, die Bibliotheken von Drittanbietern verwenden, treten möglicherweise Probleme auf.
Eingeführt in Version
3.0 Vorschau 6
Altes Verhalten
Eine App, die eine auf Version 2.2 basierende Bibliothek verwendet, wird erfolgreich erstellt.
Neues Verhalten
Für eine App, die eine auf Version 2.2 basierende Bibliothek verwendet, schlägt die Kompilierung fehl. Eine Fehlermeldung, die ähnlich wie der folgende Text lautet, wird bereitgestellt:
The type 'JsonResult' exists in both 'Microsoft.AspNetCore.Mvc.Core, Version=3.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' and 'Microsoft.AspNetCore.Mvc.Formatters.Json, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
Ein Beispiel für ein solches Problem finden Sie unter dotnet/aspnetcore#7220.
Grund für die Änderung
Änderungen auf Plattformebene an der Zusammenstellung von ASP.NET Core wie unter aspnet/Announcements#325 beschrieben.
Empfohlene Maßnahme
Bibliotheken, die anhand von Version 2.2 von Microsoft.AspNetCore.Mvc.Formatters.Json
kompiliert wurden, müssen möglicherweise erneut kompiliert werden, um das Problem für alle Benutzer zu beheben. Wenden Sie sich an den Autor der Bibliothek, wenn Sie davon betroffen sind. Fordern Sie eine Neukompilierung der Bibliothek mit dem Ziel ASP.NET Core 3.0 an.
Kategorie
ASP.NET Core
Betroffene APIs
Microsoft.AspNetCore.Mvc.JsonResult
MVC: Vorkompilierungstool wurde als veraltet markiert
In ASP.NET Core 1.1 wurde das Paket Microsoft.AspNetCore.Mvc.Razor.ViewCompilation
(MVC-Vorkompilierungstool) eingeführt, um die Kompilierung von Razor-Dateien (CSHTML-Dateien) bei der Veröffentlichung zu unterstützen. In ASP.NET Core 2.1 wurde das Razor SDK eingeführt, um die Funktionen des Vorkompilierungstools zu erweitern. Mit dem Razor SDK wurde auch die Möglichkeit geschaffen, Razor-Dateien bei der Erstellung und Veröffentlichung zu kompilieren. Das SDK überprüft die Richtigkeit der CSHTML-Dateien zur Erstellungszeit und verbessert gleichzeitig die Startzeit der App. Das Razor SDK ist standardmäßig aktiviert und kann ohne weitere Aktion verwendet werden.
In ASP.NET Core 3.0 wurde das MVC-Vorkompilierungstool aus der Zeit von ASP.NET Core 1.1 entfernt. Frühere Paketversionen erhalten weiterhin wichtige Fehler- und Sicherheitskorrekturen, wenn Patches veröffentlicht werden.
Eingeführt in Version
3.0
Altes Verhalten
Das Paket Microsoft.AspNetCore.Mvc.Razor.ViewCompilation
wurde zum Vorkompilieren von MVC-Razor-Ansichten verwendet.
Neues Verhalten
Das Razor SDK unterstützt diese Funktion nun nativ. Das Paket Microsoft.AspNetCore.Mvc.Razor.ViewCompilation
wird nicht mehr aktualisiert.
Grund für die Änderung
Das Razor SDK bietet mehr Funktionen und überprüft die Richtigkeit der CSHTML-Dateien zur Erstellungszeit. Das SDK verbessert auch die Startzeit von Apps.
Empfohlene Maßnahme
Benutzer von ASP.NET Core 2.1 oder höher sollten auf die native Unterstützung für die Vorkompilierung im Razor SDK wechseln. Wenn Fehler oder fehlende Features die Migration zum Razor SDK verhindern, melden Sie auf dotnet/aspnetcore ein Problem.
Kategorie
ASP.NET Core
Betroffene APIs
Keine
MVC: pubternal-Typen zu internal-Typen geändert
In ASP.NET Core 3.0 wurden alle „pubternal“-Typen in MVC je nach Anwendungsfall in public
in einem unterstützten Namespace oder in internal
geändert.
Änderungsbeschreibung
In ASP.NET Core werden „pubternal“-Typen als public
deklariert, befinden sich jedoch in einem Namespace mit dem Suffix .Internal
. Diese Typen sind zwar public
, sie verfügen jedoch nicht über eine Unterstützungsrichtlinie und können daher Breaking Changes unterliegen. Da diese Typen leider relativ häufig versehentlich verwendet werden, können an diesen Projekten Breaking Changes auftreten, und die Fähigkeit zum Verwalten des Frameworks kann eingeschränkt werden.
Eingeführt in Version
3.0
Altes Verhalten
Einige Typen in MVC waren public
– aber in einem .Internal
-Namespace. Diese Typen verfügten nicht über eine Unterstützungsrichtlinie und konnten daher Breaking Changes unterliegen.
Neues Verhalten
Alle diese Typen wurden entweder als public
in einem unterstützten Namespace oder als internal
gekennzeichnet.
Grund für die Änderung
Da die „pubternal“-Typen relativ häufig versehentlich verwendet wurden, konnten an diesen Projekten Breaking Changes auftreten, und die Fähigkeit zum Verwalten des Frameworks konnte eingeschränkt werden.
Empfohlene Maßnahme
Wenn Sie Typen verwenden, die tatsächlich public
waren und in einen neuen, unterstützten Namespace verschoben wurden, aktualisieren Sie Ihre Verweise entsprechend den neuen Namespaces.
Wenn Sie Typen verwenden, die als internal
gekennzeichnet wurden, müssen Sie eine Alternative suchen. Die zuvor als „pubternal“ deklarierten Typen waren nie für die öffentliche Verwendung vorgesehen. Wenn diese Namespaces bestimmte Typen enthalten, die für Ihre Apps wichtig sind, melden Sie ein Problem bei dotnet/aspnetcore. Es ist eventuell möglich, die angeforderten Typen public
zu machen.
Kategorie
ASP.NET Core
Betroffene APIs
Diese Änderung umfasst Typen in den folgenden Namespaces:
Microsoft.AspNetCore.Mvc.Cors.Internal
Microsoft.AspNetCore.Mvc.DataAnnotations.Internal
Microsoft.AspNetCore.Mvc.Formatters.Internal
Microsoft.AspNetCore.Mvc.Formatters.Json.Internal
Microsoft.AspNetCore.Mvc.Formatters.Xml.Internal
Microsoft.AspNetCore.Mvc.Internal
Microsoft.AspNetCore.Mvc.ModelBinding.Internal
Microsoft.AspNetCore.Mvc.Razor.Internal
Microsoft.AspNetCore.Mvc.RazorPages.Internal
Microsoft.AspNetCore.Mvc.TagHelpers.Internal
Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
MVC: Web-API-Kompatibilitätsshim wurde entfernt
Ab ASP.NET Core 3.0 ist das Paket Microsoft.AspNetCore.Mvc.WebApiCompatShim
nicht mehr verfügbar.
Änderungsbeschreibung
Das Paket Microsoft.AspNetCore.Mvc.WebApiCompatShim
(WebApiCompatShim) bietet partielle Kompatibilität in ASP.NET Core mit der ASP.NET 4.x-Web-API 2, um die Migration vorhandener Web-API-Implementierungen zu ASP.NET Core zu vereinfachen. Apps, die WebApiCompatShim verwenden, profitieren jedoch nicht von den API-bezogenen Features der letzten ASP.NET Core-Releases. Zu diesen Features zählen die verbesserte Generierung von Open API-Spezifikationen, die standardisierte Fehlerbehandlung und die Generierung von Clientcode. Um die API in 3.0 noch weiter zu optimieren, wurde WebApiCompatShim entfernt. Vorhandene Apps, die WebApiCompatShim verwenden, sollten zum neueren [ApiController]
-Modell migriert werden.
Eingeführt in Version
3.0
Grund für die Änderung
Das Web-API-Kompatibilitätsshim war ein Migrationstool. Es beschränkt den Benutzerzugriff auf neue Funktionen, die in ASP.NET Core hinzugefügt wurden.
Empfohlene Maßnahme
Entfernen Sie alle Verwendungen dieses Shims, und migrieren Sie direkt zu der entsprechenden Funktionalität in ASP.NET Core.
Kategorie
ASP.NET Core
Betroffene APIs
Microsoft.AspNetCore.Mvc.WebApiCompatShim
Razor: RazorTemplateEngine-API wurde entfernt
Die API RazorTemplateEngine
wurde entfernt und durch Microsoft.AspNetCore.Razor.Language.RazorProjectEngine
ersetzt.
Weitere Informationen finden Sie unter dem GitHub-Issue dotnet/aspnetcore#25215.
Eingeführt in Version
3.0
Altes Verhalten
Ein Vorlagen-Engine kann erstellt und zum Analysieren und Generieren von Code für Razor-Dateien verwendet werden.
Neues Verhalten
RazorProjectEngine
kann erstellt und mit derselben Art von Informationen wie RazorTemplateEngine
versorgt werden, um Code für Razor-Dateien zu analysieren und zu generieren. RazorProjectEngine
stellt außerdem zusätzliche Konfigurationsebenen bereit.
Grund für die Änderung
RazorTemplateEngine
war zu eng an die vorhandenen Implementierungen gekoppelt. Diese enge Kopplung führte zu weiteren Fragen beim Versuch, eine Razor-Pipeline für die Analyse/Generierung von Code ordnungsgemäß zu konfigurieren.
Empfohlene Aktion
Verwenden Sie RazorProjectEngine
anstelle von RazorTemplateEngine
. Betrachten Sie die folgenden Beispiele.
Erstellen und Konfigurieren der RazorProjectEngine-API
RazorProjectEngine projectEngine =
RazorProjectEngine.Create(RazorConfiguration.Default,
RazorProjectFileSystem.Create(@"C:\source\repos\ConsoleApp4\ConsoleApp4"),
builder =>
{
builder.ConfigureClass((document, classNode) =>
{
classNode.ClassName = "MyClassName";
// Can also configure other aspects of the class here.
});
// More configuration can go here
});
Generieren von Code für eine Razor-Datei
RazorProjectItem item = projectEngine.FileSystem.GetItem(
@"C:\source\repos\ConsoleApp4\ConsoleApp4\Example.cshtml",
FileKinds.Legacy);
RazorCodeDocument output = projectEngine.Process(item);
// Things available
RazorSyntaxTree syntaxTree = output.GetSyntaxTree();
DocumentIntermediateNode intermediateDocument =
output.GetDocumentIntermediateNode();
RazorCSharpDocument csharpDocument = output.GetCSharpDocument();
Kategorie
ASP.NET Core
Betroffene APIs
RazorTemplateEngine
RazorTemplateEngineOptions
Razor: Laufzeitkompilierung wurde in ein Paket verschoben
Die Unterstützung für die Laufzeitkompilierung von Razor-Ansichten und Razor Pages wurde in ein separates Paket verschoben.
Eingeführt in Version
3.0
Altes Verhalten
Die Laufzeitkompilierung ist ohne zusätzliche Pakete verfügbar.
Neues Verhalten
Die Funktionalität wurde in das Paket Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation verschoben.
Die folgenden APIs waren bereits in Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions
zur Unterstützung der Laufzeitkompilierung verfügbar. Die APIs sind jetzt über Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.MvcRazorRuntimeCompilationOptions
verfügbar.
RazorViewEngineOptions.FileProviders
ist jetztMvcRazorRuntimeCompilationOptions.FileProviders
RazorViewEngineOptions.AdditionalCompilationReferences
ist jetztMvcRazorRuntimeCompilationOptions.AdditionalReferencePaths
Darüber hinaus wurde Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions.AllowRecompilingViewsOnFileChange
entfernt. Die erneute Kompilierung von Dateiänderungen wird durch einen Verweis auf das Paket Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
standardmäßig aktiviert.
Grund für die Änderung
Diese Änderung war erforderlich, um die Abhängigkeit des freigegebenen ASP.NET Core-Frameworks von Roslyn aufzuheben.
Empfohlene Maßnahme
Für Apps, die eine Laufzeitkompilierung oder eine erneute Kompilierung von Razor-Dateien erfordern, sollten die folgenden Schritte ausgeführt werden:
Fügen Sie einen Verweis auf das Paket
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
hinzu.Aktualisieren Sie die
Startup.ConfigureServices
-Methode des Projekts so, dass diese einen Aufruf vonAddRazorRuntimeCompilation
enthält. Zum Beispiel:services.AddMvc() .AddRazorRuntimeCompilation();
Kategorie
ASP.NET Core
Betroffene APIs
Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions
Sitzungszustand: Veraltete APIs wurden entfernt
Veraltete APIs zum Konfigurieren von Sitzungscookies wurden entfernt. Weitere Informationen finden Sie unter aspnet/Announcements#257.
Eingeführt in Version
3.0
Grund für die Änderung
Diese Änderung erzwingt Konsistenz zwischen APIs zum Konfigurieren von Funktionen, die Cookies verwenden.
Empfohlene Maßnahme
Migrieren Sie alle Verwendungen der entfernten APIs zu ihren neueren Ersetzungen. Betrachten Sie das folgende Beispiel in Startup.ConfigureServices
:
public void ConfigureServices(ServiceCollection services)
{
services.AddSession(options =>
{
// Removed obsolete APIs
options.CookieName = "SessionCookie";
options.CookieDomain = "contoso.com";
options.CookiePath = "/";
options.CookieHttpOnly = true;
options.CookieSecure = CookieSecurePolicy.Always;
// new API
options.Cookie.Name = "SessionCookie";
options.Cookie.Domain = "contoso.com";
options.Cookie.Path = "/";
options.Cookie.HttpOnly = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});
}
Kategorie
ASP.NET Core
Betroffene APIs
- Microsoft.AspNetCore.Builder.SessionOptions.CookieDomain
- Microsoft.AspNetCore.Builder.SessionOptions.CookieHttpOnly
- Microsoft.AspNetCore.Builder.SessionOptions.CookieName
- Microsoft.AspNetCore.Builder.SessionOptions.CookiePath
- Microsoft.AspNetCore.Builder.SessionOptions.CookieSecure
Freigegebenes Framework: Assemblys aus Microsoft.AspNetCore.App entfernt
Ab ASP.NET Core 3.0 enthält das freigegebene ASP.NET Core-Framework (Microsoft.AspNetCore.App
) nur Erstanbieterassemblys, die vollständig von Microsoft entwickelt, unterstützt und verwaltet werden.
Änderungsbeschreibung
Stellen Sie sich die Änderung als Neudefinition der Grenzen für die ASP.NET Core-„Plattform“ vor. Das freigegebene Framework kann von allen Benutzern über GitHub aus der Quelle erstellt werden und bietet Ihren Apps auch weiterhin die bereits vorhandenen Vorteile der freigegebenen .NET Core-Frameworks. Zu den Vorteilen zählen die kleinere Bereitstellungsgröße, das zentralisierte Patchen und die schnellere Startzeit.
Im Rahmen der Änderung werden einige wichtige Breaking Changes in Microsoft.AspNetCore.App
eingeführt.
Eingeführt in Version
3.0
Altes Verhalten
Projekte verwiesen über ein <PackageReference>
-Element in der Projektdatei auf Microsoft.AspNetCore.App
.
Außerdem enthielt Microsoft.AspNetCore.App
die folgenden Unterkomponenten:
- Json.NET (
Newtonsoft.Json
) - Entity Framework Core (Assemblys mit Präfix
Microsoft.EntityFrameworkCore.
) - Roslyn (
Microsoft.CodeAnalysis
)
Neues Verhalten
Für einen Verweis auf Microsoft.AspNetCore.App
ist kein <PackageReference>
-Element in der Projektdatei mehr erforderlich. Das .NET Core SDK unterstützt ein neues Element mit dem Namen <FrameworkReference>
, das <PackageReference>
ersetzt.
Weitere Informationen finden Sie unter dotnet/aspnetcore#3612.
Entity Framework Core wird als NuGet-Pakete bereitgestellt. Diese Änderung stellt eine Anpassung an das Auslieferungsmodell aller anderen Datenzugriffsbibliotheken in .NET dar. Es bietet Entity Framework Core die einfachste Möglichkeit, weiterhin Innovationen mit Unterstützung der verschiedenen .NET-Plattformen zu schaffen. Das Verschieben von Entity Framework Core aus dem freigegebenen Framework hat keine Auswirkung auf seinen Status als eine von Microsoft entwickelte, unterstützte und gewartete Bibliothek. Die .NET Core-Supportrichtlinie gilt auch weiterhin.
Json.NET und Entity Framework Core funktionieren auch In Zukunft mit ASP.NET Core. Sie sind jedoch nicht mehr im freigegebenen Framework enthalten.
Weitere Informationen finden Sie unter The future of JSON in .NET Core 3.0 (Die Zukunft von JSON in .NET Core 3.0). Sehen Sie sich auch die komplette Liste der Binärdateien an, die aus dem freigegebenen Framework entfernt wurden.
Grund für die Änderung
Diese Änderung vereinfacht die Verwendung von Microsoft.AspNetCore.App
und verringert Duplizierungen zwischen NuGet-Paketen und freigegebenen Frameworks.
Weitere Informationen zu den Gründen für diese Änderung finden Sie in diesem Blogbeitrag.
Empfohlene Aktion
Ab ASP.NET Core 3.0 ist es nicht mehr erforderlich, dass Projekte Assemblys in Microsoft.AspNetCore.App
als NuGet-Pakete verwenden. Um die Ausrichtung und Verwendung des freigegebenen ASP.NET Core-Frameworks zu vereinfachen, werden viele NuGet-Pakete, die seit ASP.NET Core 1.0 eingeführt wurden, nicht mehr erstellt. Die von diesen Paketen bereitgestellten APIs sind für Apps weiterhin mithilfe eines <FrameworkReference>
auf Microsoft.AspNetCore.App
verfügbar. Beispiele für gängige APIs sind Kestrel, MVC und Razor.
Diese Änderung gilt nicht für alle Binärdateien, auf die über Microsoft.AspNetCore.App
in ASP.NET Core 2.x verwiesen wird. Wichtige Ausnahmen sind:
Microsoft.Extensions
-Bibliotheken, die weiterhin auf .NET Standard abzielen, sind als NuGet-Pakete verfügbar (siehe https://github.com/dotnet/extensions).- APIs, die vom ASP.NET Core-Team erstellt werden und die nicht Teil
Microsoft.AspNetCore.App
sind. Die folgenden Komponenten sind beispielsweise als NuGet-Pakete verfügbar:- Entity Framework Core
- APIs, die eine Integration von Drittanbietern bereitstellen
- Experimentelle Features
- APIs mit Abhängigkeiten, die die Anforderungen für die Aufnahme in das freigegebene Framework nicht erfüllen konnten
- Erweiterungen für MVC zur Unterstützung von Json.NET. Eine API wird als NuGet-Paket bereitgestellt, um die Verwendung von Json.NET und MVC zu unterstützen. Weitere Informationen finden Sie im Migrationsleitfaden zu ASP.NET Core.
- Der SignalR-.NET-Client unterstützt weiterhin .NET Standard und wird als NuGet-Paket bereitgestellt. Er ist für die Verwendung in vielen .NET-Runtimes vorgesehen, z. B. Xamarin und UWP.
Weitere Informationen finden Sie unter Stop producing packages for shared framework assemblies in 3.0 (Beenden der Erstellung von Paketen für Assemblys in freigegebenen Frameworks in 3.0). Weitere Informationen finden Sie unter dotnet/aspnetcore#3757.
Kategorie
ASP.NET Core
Betroffene APIs
Freigegebenes Framework: Microsoft.AspNetCore.All entfernt
Ab ASP.NET Core 3.0 werden das Metapaket Microsoft.AspNetCore.All
und das entsprechende freigegebene Framework Microsoft.AspNetCore.All
nicht mehr erstellt. Dieses Paket ist in ASP.NET Core 2.2 verfügbar und wird auch weiterhin mit Wartungsupdates in ASP.NET Core 2.1 versorgt.
Eingeführt in Version
3.0
Altes Verhalten
Apps konnten das Metapaket Microsoft.AspNetCore.All
verwenden, um das freigegebene Framework Microsoft.AspNetCore.All
als Ziel in .NET Core zu verwenden.
Neues Verhalten
.NET Core 3.0 enthält das freigegebene Framework Microsoft.AspNetCore.All
nicht mehr.
Grund für die Änderung
Das Metapaket Microsoft.AspNetCore.All
enthielt eine große Anzahl externer Abhängigkeiten.
Empfohlene Maßnahme
Stellen Sie Ihr Projekt auf die Verwendung des Frameworks Microsoft.AspNetCore.App
um. Komponenten, die zuvor in Microsoft.AspNetCore.All
verfügbar waren, sind weiterhin in NuGet verfügbar. Diese Komponenten werden nun mit Ihrer App bereitgestellt, anstatt in das freigegebene Framework eingefügt zu werden.
Kategorie
ASP.NET Core
Betroffene APIs
Keine
SignalR: HandshakeProtocol.SuccessHandshakeData wurde ersetzt
Das Feld HandshakeProtocol.SuccessHandshakeData wurde entfernt und durch eine Hilfsmethode ersetzt, die eine erfolgreiche Handshakeantwort für ein bestimmtes IHubProtocol
generiert.
Eingeführt in Version
3.0
Altes Verhalten
HandshakeProtocol.SuccessHandshakeData
war ein public static ReadOnlyMemory<byte>
-Feld.
Neues Verhalten
HandshakeProtocol.SuccessHandshakeData
wurde durch eine static
GetSuccessfulHandshake(IHubProtocol protocol)
-Methode ersetzt, die basierend auf dem angegebenen Protokoll ein ReadOnlyMemory<byte>
-Element zurückgibt.
Grund für die Änderung
Der Handshakeantwort wurden zusätzliche Felder hinzugefügt, die nicht konstant sind und je nach ausgewähltem Protokoll abweichen.
Empfohlene Aktion
Keine Dieser Typ ist nicht für die Verwendung in Benutzercode vorgesehen. Er ist public
, damit er von SignalR-Server und -Client gemeinsam verwendet werden kann. Er kann auch von SignalR-Kundenclients verwendet werden, die in .NET geschrieben wurden. Benutzer von SignalR sollten von dieser Änderung nicht betroffen sein.
Kategorie
ASP.NET Core
Betroffene APIs
HandshakeProtocol.SuccessHandshakeData
SignalR: ResetSendPing- und ResetTimeout-Methoden aus HubConnection entfernt
Die Methoden ResetSendPing
und ResetTimeout
wurden aus der SignalR-API HubConnection
entfernt. Diese Methoden waren ursprünglich nur für die interne Verwendung vorgesehen, wurden aber in ASP.NET Core 2.2 öffentlich („public“) gemacht. Diese Methoden sind ab dem Release ASP.NET Core 3.0 Preview 4 nicht mehr verfügbar. Weitere Informationen finden Sie unter dotnet/aspnetcore#8543.
Eingeführt in Version
3.0
Altes Verhalten
Die APIs waren verfügbar.
Neues Verhalten
Die APIs wurden entfernt.
Grund für die Änderung
Diese Methoden waren ursprünglich nur für die interne Verwendung vorgesehen, wurden aber in ASP.NET Core 2.2 öffentlich („public“) gemacht.
Empfohlene Maßnahme
Verwenden Sie diese Methoden nicht mehr.
Kategorie
ASP.NET Core
Betroffene APIs
SignalR: HubConnectionContext-Konstruktoren wurden geändert
Die HubConnectionContext
-Konstruktoren von SignalR wurden so geändert, dass sie anstelle von mehreren Parametern einen Optionstyp akzeptieren, damit auch in Zukunft Optionen hinzugefügt werden können. Durch diese Änderung werden zwei Konstruktoren durch einen einzelnen Konstruktor ersetzt, der einen Optionstyp akzeptiert.
Eingeführt in Version
3.0
Altes Verhalten
HubConnectionContext
hatte zwei Konstruktoren:
public HubConnectionContext(ConnectionContext connectionContext, TimeSpan keepAliveInterval, ILoggerFactory loggerFactory);
public HubConnectionContext(ConnectionContext connectionContext, TimeSpan keepAliveInterval, ILoggerFactory loggerFactory, TimeSpan clientTimeoutInterval);
Neues Verhalten
Die beiden Konstruktoren wurden entfernt und durch einen Konstruktor ersetzt:
public HubConnectionContext(ConnectionContext connectionContext, HubConnectionContextOptions contextOptions, ILoggerFactory loggerFactory)
Grund für die Änderung
Der neue Konstruktor verwendet ein neues Optionsobjekt. Aus diesem Grund können die Features von HubConnectionContext
in Zukunft erweitert werden, ohne dass weitere Konstruktoren erforderlich werden oder Breaking Changes vorgenommen werden müssen.
Empfohlene Maßnahme
Verwenden Sie anstelle der folgenden Konstruktoren:
HubConnectionContext connectionContext = new HubConnectionContext(
connectionContext,
keepAliveInterval: TimeSpan.FromSeconds(15),
loggerFactory,
clientTimeoutInterval: TimeSpan.FromSeconds(15));
den folgenden Konstruktor:
HubConnectionContextOptions contextOptions = new HubConnectionContextOptions()
{
KeepAliveInterval = TimeSpan.FromSeconds(15),
ClientTimeoutInterval = TimeSpan.FromSeconds(15)
};
HubConnectionContext connectionContext = new HubConnectionContext(connectionContext, contextOptions, loggerFactory);
Kategorie
ASP.NET Core
Betroffene APIs
- HubConnectionContext(ConnectionContext, TimeSpan, ILoggerFactory)
- HubConnectionContext(ConnectionContext, TimeSpan, ILoggerFactory, TimeSpan)
SignalR: Name des JavaScript-Clientpakets geändert
In ASP.NET Core 3.0 Preview 7 wurde der Name des SignalR-JavaScript-Clientpakets von @aspnet/signalr
in @microsoft/signalr
geändert. Die Namensänderung spiegelt die Tatsache wider, dass SignalR dank Azure SignalR Service für mehr als nur ASP.NET Core-Apps nützlich ist.
Um auf diese Änderung zu reagieren, ändern Sie die Verweise in Ihren package.json-Dateien, require
-Anweisungen und ECMAScript-import
-Anweisungen. Im Rahmen dieser Umbenennung werden keine APIs geändert.
Weitere Informationen finden Sie unter dotnet/aspnetcore#11637.
Eingeführt in Version
3.0
Altes Verhalten
Das Clientpaket hatte den Namen @aspnet/signalr
.
Neues Verhalten
Das Clientpaket hat jetzt den Namen @microsoft/signalr
.
Grund für die Änderung
Die Namensänderung macht deutlich, dass SignalR dank Azure SignalR Service für mehr als nur ASP.NET Core-Apps nützlich ist.
Empfohlene Maßnahme
Stellen Sie auf das neue Paket @microsoft/signalr
um.
Kategorie
ASP.NET Core
Betroffene APIs
Keine
SignalR: UseSignalR- und UseConnections-Methoden als veraltet markiert
Die Methoden UseConnections
und UseSignalR
sowie die Klassen ConnectionsRouteBuilder
und HubRouteBuilder
wurden in ASP.NET Core 3.0 als veraltet markiert.
Eingeführt in Version
3.0
Altes Verhalten
Das Hubrouting in SignalR wurde mithilfe von UseSignalR
oder UseConnections
konfiguriert.
Neues Verhalten
Das alte Verfahren zum Konfigurieren des Routings wurde als veraltet markiert und durch das Endpunktrouting ersetzt.
Grund für die Änderung
Die Middleware wurden auf das neue System mit Endpunktrouting umgestellt. Das alte Verfahren zum Hinzufügen von Middleware ist veraltet.
Empfohlene Maßnahme
Ersetzen Sie UseSignalR
durch UseEndpoints
:
Alter Code:
app.UseSignalR(routes =>
{
routes.MapHub<SomeHub>("/path");
});
Neuer Code:
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<SomeHub>("/path");
});
Kategorie
ASP.NET Core
Betroffene APIs
- Microsoft.AspNetCore.Builder.ConnectionsAppBuilderExtensions.UseConnections(IApplicationBuilder, Action<ConnectionsRouteBuilder>)
- Microsoft.AspNetCore.Builder.SignalRAppBuilderExtensions.UseSignalR(IApplicationBuilder, Action<HubRouteBuilder>)
- Microsoft.AspNetCore.Http.Connections.ConnectionsRouteBuilder
- Microsoft.AspNetCore.SignalR.HubRouteBuilder
SPAs: SpaServices und NodeServices wurden als veraltet markiert
Der Inhalt der folgenden NuGet-Pakete ist seit ASP.NET Core 2.1 nicht mehr erforderlich. Aus diesem Grund werden die folgenden Pakete als veraltet markiert:
Aus demselben Grund werden die folgenden npm-Module als veraltet markiert:
Die obigen Pakete und npm-Module werden später aus .NET 5 entfernt.
Eingeführt in Version
3.0
Altes Verhalten
Die veralteten Pakete und npm-Module waren für die Integration von ASP.NET Core mit verschiedenen SPA-Frameworks (Single-Page-Webanwendung) vorgesehen. Zu diesen Frameworks gehören Angular, React und React mit Redux.
Neues Verhalten
Im NuGet-Paket Microsoft.AspNetCore.SpaServices.Extensions steht ein neuer Integrationsmechanismus zur Verfügung. Das Paket bleibt die Basis der Angular- und React-Projektvorlagen seit ASP.NET Core 2.1.
Grund für die Änderung
ASP.NET Core unterstützt die Integration mit verschiedenen SPA-Frameworks (Single-Page-Webanwendung), einschließlich Angular, React und React mit Redux. Anfänglich wurde die Integration mit diesen Frameworks über ASP.NET Core-spezifische Komponenten erzielt, die Szenarien wie die serverseitige Vorabgenerierung und Integration mit WebPack behandelt haben. Im Laufe der Zeit haben sich die Industriestandards geändert. Alle SPA-Frameworks haben ihre eigenen Standard-Befehlszeilenschnittstellen veröffentlicht. Dazu gehören beispielsweise die Angular CLI und die create-react-app.
Als ASP.NET Core 2.1 im Mai 2018 veröffentlicht wurde, reagierte das Team auf die Änderungen bei den Standards. Es wurde eine neuere und einfachere Möglichkeit zur Integration mit den eigenen Toolketten des SPA-Frameworks bereitgestellt. Der neue Integrationsmechanismus ist im Paket Microsoft.AspNetCore.SpaServices.Extensions
enthalten und bleibt die Basis der Angular- und React-Projektvorlagen seit ASP.NET Core 2.1.
Um deutlich zu machen, dass die älteren ASP.NET Core-spezifischen Komponenten irrelevant sind und nicht empfohlen werden, wurde Folgendes umgesetzt:
- Der Integrationsmechanismus vor Version 2.1 wurde als veraltet markiert.
- Die unterstützenden npm-Pakete wurden als veraltet markiert.
Empfohlene Maßnahme
Wenn Sie diese Pakete verwenden, aktualisieren Sie Ihre Apps, um diese Funktionalität zu nutzen:
- Im Paket
Microsoft.AspNetCore.SpaServices.Extensions
. - Bereitgestellt von den von Ihnen verwendeten SPA-Frameworks
Informationen zum Aktivieren von Features wie dem serverseitigen Vorabrendering und dem „heißen“ Neuladen von Modulen finden Sie in der Dokumentation zum zugehörigen SPA-Framework. Die Funktionen in Microsoft.AspNetCore.SpaServices.Extensions
sind nicht veraltet und werden weiterhin unterstützt.
Kategorie
ASP.NET Core
Betroffene APIs
Microsoft.AspNetCore.NodeServices.HostingModels.INodeInstance
Microsoft.AspNetCore.NodeServices.HostingModels.NodeInvocationException
Microsoft.AspNetCore.NodeServices.HostingModels.NodeInvocationInfo
Microsoft.AspNetCore.NodeServices.HostingModels.NodeServicesOptionsExtensions
Microsoft.AspNetCore.NodeServices.HostingModels.OutOfProcessNodeInstance
Microsoft.AspNetCore.SpaServices.Prerendering.ISpaPrerenderer
Microsoft.AspNetCore.SpaServices.Prerendering.ISpaPrerendererBuilder
Microsoft.AspNetCore.SpaServices.Prerendering.JavaScriptModuleExport
Microsoft.AspNetCore.SpaServices.Prerendering.PrerenderTagHelper
Microsoft.AspNetCore.SpaServices.Prerendering.RenderToStringResult
Microsoft.AspNetCore.SpaServices.Webpack.WebpackDevMiddlewareOptions
Microsoft.Extensions.DependencyInjection.NodeServicesServiceCollectionExtensions
Microsoft.Extensions.DependencyInjection.PrerenderingServiceCollectionExtensions
SPAs: Kein Fallback auf die Konsolenprotokollierung mehr für SpaServices und NodeServices
Microsoft.AspNetCore.SpaServices und Microsoft.AspNetCore.NodeServices zeigen nur dann Konsolenprotokolle an, wenn die Protokollierung konfiguriert wurde.
Eingeführt in Version
3.0
Altes Verhalten
Microsoft.AspNetCore.SpaServices
und Microsoft.AspNetCore.NodeServices
erstellten automatisch eine Konsolenprotokollierung, wenn die Protokollierung nicht konfiguriert war.
Neues Verhalten
Microsoft.AspNetCore.SpaServices
und Microsoft.AspNetCore.NodeServices
zeigen nur dann Konsolenprotokolle an, wenn die Protokollierung konfiguriert wurde.
Grund für die Änderung
Mit dieser Änderung soll eine Anpassung an die Implementierung der Protokollierung in anderen ASP.NET Core-Paketen umgesetzt werden.
Empfohlene Maßnahme
Wenn das alte Verhalten erforderlich ist, fügen Sie zum Konfigurieren der Konsolenprotokollierung Ihrer Setup.ConfigureServices
-Methode services.AddLogging(builder => builder.AddConsole())
hinzu.
Kategorie
ASP.NET Core
Betroffene APIs
Keine
Zielframework: .NET Framework-Unterstützung aufgehoben
Ab ASP.NET Core 3.0 ist .NET Framework kein unterstütztes Zielframework mehr.
Änderungsbeschreibung
.NET Framework 4.8 ist die letzte Hauptversion von .NET Framework. Neue ASP.NET Core-Apps sollten mit .NET Core erstellt werden. Ab dem Release .NET Core 3.0 können Sie sich ASP.NET Core 3.0 als Teil von .NET Core vorstellen.
Kunden, die ASP.NET Core mit .NET Framework verwenden, erhalten mit dem LTS-Release 2.1 weiterhin vollständige Unterstützung. Support und Wartung für 2.1 werden mindestens bis zum 21. August 2021 fortgesetzt. Dieses Datum liegt gemäß der .NET-Supportrichtlinie drei Jahre nach der Bekanntgabe des LTS-Release. Die Unterstützung für ASP.NET Core 2.1-Pakete auf Grundlage von .NET Framework wird unbegrenzt verlängert (ähnlich der Dienstrichtlinie für andere paketbasierte ASP.NET-Frameworks).
Weitere Informationen zum Portieren von .NET Framework zu .NET Core finden Sie unter Portieren zu .NET Core.
Microsoft.Extensions
-Pakete (z. B. Protokollierung, Abhängigkeitsinjektion und Konfiguration) und Entity Framework Core sind nicht betroffen. Sie unterstützen .NET Standard auch weiterhin.
Weitere Informationen zu den Gründen für diese Änderung finden Sie im ursprünglichen Blogbeitrag.
Eingeführt in Version
3.0
Altes Verhalten
ASP.NET Core-Apps konnten unter .NET Core oder .NET Framework ausgeführt werden.
Neues Verhalten
ASP.NET Core-Apps können nur unter .NET Core ausgeführt werden.
Empfohlene Maßnahme
Führen Sie eine der folgenden Aktionen aus:
- Verwenden Sie für Ihre App auch weiterhin ASP.NET Core 2.1.
- Migrieren Sie Ihre App und die Abhängigkeiten zu .NET Core.
Kategorie
ASP.NET Core
Betroffene APIs
Keine
Core .NET-Bibliotheken
- APIs, die Versionsinformationen melden, melden nun die Produktversion und nicht die Dateiversion
- Benutzerdefinierte EncoderFallbackBuffer-Instanzen können kein rekursives Fallback ausführen
- Neues Verhalten bei Formatierung und Analyse von Gleitkommawerten
- Gleitkommaanalysevorgänge lösen keinen Fehler und keine OverflowException mehr aus
- InvalidAsynchronousStateException wurde in andere Assembly verschoben
- Ersetzen von falsch formatierten UTF-8-Bytesequenzen richtet sich nach Unicode-Vorgaben
- TypeDescriptionProviderAttribute wurde in andere Assembly verschoben
- ZipArchiveEntry verarbeitet keine Archive mit inkonsistenten Eintragsgrößen mehr
- FieldInfo.SetValue löst eine Ausnahme für statische reine Initialisierungsfelder aus
- Das Übergeben von GroupCollection an Erweiterungsmethoden, die IEnumerable<T> akzeptieren, erfordert Vermeidung von Mehrdeutigkeit
APIs, die Versionsinformationen melden, melden nun die Produktversion und nicht die Dateiversion
Viele APIs, die in .NET Core Versionsinformationen zurückgeben, geben nun anstelle der Dateiversion die Produktversion zurück.
Änderungsbeschreibung
In .NET Core 2.2 und früheren Versionen, wird in Methoden wie Environment.Version, RuntimeInformation.FrameworkDescription und im Dialogfeld mit den Dateieigenschaften für .NET Core-Assemblys die Dateiversion angegeben. Ab .NET Core 3.0 wird die Produktversion angegeben.
In der folgenden Abbildung sind die unterschiedlichen Versionsinformationen für die System.Runtime.dll-Assembly für .NET Core 2.2 (links) und .NET Core 3.0 (rechts) zu sehen, die im Dialogfeld mit Dateieigenschaften im Windows-Explorer angezeigt werden.
Eingeführt in Version
3.0
Empfohlene Aktion
Keine Durch diese Änderung soll die Version einfacher und intuitiver zu erkennen sein.
Kategorie
Core .NET-Bibliotheken
Betroffene APIs
Benutzerdefinierte EncoderFallbackBuffer-Instanzen können kein rekursives Fallback ausführen
Benutzerdefinierte EncoderFallbackBuffer-Instanzen können kein rekursives Fallback ausführen. Die Implementierung von EncoderFallbackBuffer.GetNextChar() muss zu einer Zeichensequenz führen, die in die Zielcodierung konvertiert werden kann. Andernfalls tritt eine Ausnahme auf.
Änderungsbeschreibung
Bei einem Zeichen-zu-Byte-Transcodierungsvorgang erkennt die Runtime falsch formatierte oder nicht konvertierbare UTF-16-Sequenzen und stellt diese Zeichen für die EncoderFallbackBuffer.Fallback-Methode bereit. Die Fallback
-Methode bestimmt, welche Zeichen die ursprünglichen nicht konvertierbaren Daten ersetzen, und diese Zeichen werden durch Aufrufen von EncoderFallbackBuffer.GetNextChar in einer Schleife ausgeglichen.
Die Runtime versucht dann, diese Ersetzungszeichen in die Zielcodierung zu transcodieren. Wenn dieser Vorgang erfolgreich ist, setzt die Runtime die Transcodierung an der Stelle fort, an der sie die ursprüngliche Eingabezeichenfolge verlassen hat.
In früheren Versionen können von benutzerdefinierten Implementierungen von EncoderFallbackBuffer.GetNextChar() Zeichensequenzen zurückgegeben werden, die nicht in die Zielcodierung konvertiert werden können. Wenn die ersetzten Zeichen nicht in die Zielcodierung transcodiert werden können, ruft die Runtime die EncoderFallbackBuffer.Fallback-Methode erneut mit den Ersetzungszeichen auf, wobei erwartet wird, dass die EncoderFallbackBuffer.GetNextChar()-Methode eine neue Ersetzungssequenz zurückgibt. Dieser Vorgang wird fortgesetzt, bis die Laufzeit eine wohlgeformte, konvertierbare Ersetzung erkennt oder eine maximale Anzahl von Rekursionen erreicht wird.
Ab .NET Core 3.0 müssen von benutzerdefinierten Implementierungen von EncoderFallbackBuffer.GetNextChar() Zeichensequenzen zurückgegeben werden, die in die Zielcodierung konvertiert werden können. Wenn die ersetzten Zeichen nicht in die Zielcodierung transcodiert werden können, wird eine ArgumentException ausgelöst. Die Laufzeit führt keine rekursiven Aufrufe der EncoderFallbackBuffer-Instanz mehr durch.
Dieses Verhalten gilt nur, wenn alle drei der folgenden Bedingungen erfüllt sind:
- Die Runtime erkennt eine falsch formatierte UTF-16-Sequenz oder eine UTF-16-Sequenz, die nicht in die Zielcodierung konvertiert werden kann.
- Ein benutzerdefinierter EncoderFallback wurde angegeben.
- Der benutzerdefinierte EncoderFallback versucht, eine neue falsch formatierte oder nicht konvertierbare UTF-16-Sequenz zu ersetzen.
Eingeführt in Version
3.0
Empfohlene Aktion
Die meisten Entwickler müssen keine Maßnahmen ergreifen.
Wenn eine Anwendung eine benutzerdefinierte EncoderFallback- und EncoderFallbackBuffer-Klasse verwendet, stellen Sie sicher, dass die Implementierung von EncoderFallbackBuffer.Fallback den Fallbackpuffer mit wohlgeformten UTF-16-Daten auffüllt, die direkt in die Zielcodierung konvertiert werden können, wenn die Fallback-Methode zuerst von der Runtime aufgerufen wird.
Kategorie
Core .NET-Bibliotheken
Betroffene APIs
Neues Verhalten bei Formatierung und Analyse von Gleitkommawerten
Das Verhalten bei der Analyse und Formatierung von Gleitkommawerten (durch die Typen Double und Single) ist jetzt IEEE-konform. Dadurch wird sichergestellt, dass das Verhalten von Gleitkommatypen in .NET dem Verhalten von anderen IEEE-konformen Sprachen entspricht. Beispielsweise muss double.Parse("SomeLiteral")
immer mit der Ausgabe von C# für double x = SomeLiteral
übereinstimmen.
Änderungsbeschreibung
In .NET Core 2.2 und früheren Versionen war die Formatierung mit Double.ToString und Single.ToString und die Analyse mit Double.Parse, Double.TryParse, Single.Parse und Single.TryParse nicht IEEE-konform. Daher kann nicht sichergestellt werden, dass ein Wert mit einer unterstützten Zeichenfolge in einem Standardformat oder in einem benutzerdefinierten Format einen Roundtrip durchführt. Bei einigen Eingaben kann bei der Analyse eines formatierten Werts ein Fehler auftreten. Bei anderen Eingaben kann es vorkommen, dass der analysierte Wert nicht dem ursprünglichen Wert entspricht.
Ab .NET Core 3.0 entsprechen Analyse- und Formatierungsvorgänge für Gleitkommawerte der Norm IEEE 754.
Die folgende Tabelle zeigt zwei Codeausschnitte und die Unterschiede in der Ausgabe zwischen .NET Core 2.2 und .NET Core 3.1.
Codeausschnitt | Ausgabe in .NET Core 2.2 | Ausgabe in .NET Core 3.1 |
---|---|---|
Console.WriteLine((-0.0).ToString()); |
0 | -0 |
var value = -3.123456789123456789; Console.WriteLine(value == double.Parse(value.ToString())); |
False |
True |
Weitere Informationen finden Sie im Blogbeitrag Verbesserungen bei Analyse und Formatierung von Gleitkommawerten in .NET Core 3.0.
Eingeführt in Version
3.0
Empfohlene Aktion
Im Abschnitt Potenzielle Auswirkungen auf vorhandenen Code im Blogbeitrag Verbesserungen der Analyse und Formatierung von Gleitkommawerten in .NET Core 3.0 werden einige Änderungen vorgeschlagen, die Sie an Ihrem Code vornehmen können, wenn Sie das vorherige Verhalten beibehalten möchten.
- Bei einigen Formatierungsunterschieden können Sie ein Verhalten erzielen, das dem vorherigen Verhalten entspricht, indem Sie eine andere Formatzeichenfolge angeben.
- Für Unterschiede bei der Analyse gibt es keinen Mechanismus zum Wiederherstellen des vorherigen Verhaltens.
Kategorie
Core .NET-Bibliotheken
Betroffene APIs
Gleitkomma-Analysevorgänge lösen keinen Fehler und keine OverflowException mehr aus
Die Gleitkomma-Analysemethoden lösen keine OverflowException mehr aus und geben auch nicht false
zurück, wenn sie eine Zeichenfolge analysieren, deren Zahlenwert außerhalb des Bereichs des Gleitkommatyps Single oder Double liegt.
Änderungsbeschreibung
In .NET Core 2.2 und früheren Versionen lösen die Methoden Double.Parse und Single.Parse eine OverflowException für Werte aus, die außerhalb des Bereichs ihres jeweiligen Typs liegen. Die Methoden Double.TryParse und Single.TryParse geben false
für die Zeichenfolgendarstellungen von numerischen Werten außerhalb des gültigen Bereichs zurück.
Ab .NET Core 3.0 schlagen die Methoden Double.Parse, Double.TryParse, Single.Parse und Single.TryParse nicht mehr fehl, wenn Sie außerhalb des gültigen Bereichs liegende numerische Zeichenfolgen analysieren. Stattdessen geben die Double-Analysemethoden Double.PositiveInfinity für Werte, die Double.MaxValue überschreiten, und Double.NegativeInfinity für Werte zurück, die kleiner als Double.MinValue sind. Analog dazu geben die Single-Analysemethoden Single.PositiveInfinity für Werte, die Single.MaxValue überschreiten, und Single.NegativeInfinity für Werte zurück, die kleiner als Single.MinValue sind.
Diese Änderung wurde vorgenommen, um die Konformität mit IEEE 754:2008 zu verbessern.
Eingeführt in Version
3.0
Empfohlene Aktion
Diese Änderung kann sich auf zwei Arten auf den Code auswirken:
Der Code hängt vom Handler für die OverflowException ab, der ausgeführt wird, wenn ein Überlauf auftritt. In diesem Fall sollten Sie die
catch
-Anweisung entfernen und erforderlichen Code in einerIf
-Anweisung platzieren, die testet, ob Double.IsInfinity oder Single.IsInfinitytrue
ist.Ihr Code geht davon aus, dass Gleitkommawerte nicht
Infinity
sind. In diesem Fall sollten Sie den erforderlichen Code hinzufügen, um auf Gleitkommawerte des TypsPositiveInfinity
undNegativeInfinity
zu prüfen.
Kategorie
Core .NET-Bibliotheken
Betroffene APIs
InvalidAsynchronousStateException in andere Assembly verschoben
Die InvalidAsynchronousStateException-Klasse wurde verschoben.
Änderungsbeschreibung
In .NET Core 2.2 und früheren Versionen befand sich die InvalidAsynchronousStateException-Klasse in der System.ComponentModel.TypeConverter-Assembly.
Seit .NET Core 3.0 befindet sie sich in der System.ComponentModel.Primitives-Assembly.
Eingeführt in Version
3.0
Empfohlene Aktion
Diese Änderung betrifft nur Anwendungen, welche die Reflektion zum Laden von InvalidAsynchronousStateException durch Aufrufen einer Methode wie Assembly.GetType oder eine Überladung von Activator.CreateInstance nutzen, bei der vorausgesetzt wird, dass sich der Typ in einer bestimmten Assembly befindet. Ist dies der Fall, aktualisieren Sie die im Methodenaufruf referenzierte Assembly entsprechend dem neuen Assemblyspeicherort des Typs.
Kategorie
Core .NET-Bibliotheken
Betroffene APIs
Keine.
Ersetzen von falsch formatierten UTF-8-Bytesequenzen von Unicode-Vorgaben abhängig
Wenn die Klasse UTF8Encoding während einer Byte-zu-Zeichen-Transcodierung auf eine falsch formatierte UTF-8-Bytesequenz trifft, ersetzt sie diese in der Ausgabezeichenfolge durch ein „�“-Zeichen (U+FFFD, ERSETZUNGSZEICHEN). .NET Core 3.0 unterscheidet sich von früheren Versionen von .NET Core und .NET Framework durch die Einhaltung der bewährten Unicode-Methoden für die Durchführung dieser Ersetzung während des Transcodierungsvorgangs.
Dies ist Teil einer größeren Maßnahme zur Verbesserung der UTF-8-Verarbeitung in .NET, auch bei den neuen Typen System.Text.Unicode.Utf8 und System.Text.Rune. Der Typ UTF8Encoding wurde mit einem verbesserten Verfahren für die Fehlerbehandlung versehen, sodass die Ausgabe konsistent mit den neu eingeführten Typen generiert wird.
Änderungsbeschreibung
Ab .NET Core 3.0 führt die UTF8Encoding-Klasse bei der Transcodierung von Bytes in Zeichen Zeichenersetzung basierend auf bewährten Unicode-Methoden aus. Der verwendete Ersetzungsmechanismus wird durch The Unicode Standard, Version 12.0, Abschnitt 3.9 (PDF) unter der Überschrift U+FFFD Substitution of Maximum Subparts beschrieben.
Dieses Verhalten gilt nur, wenn die Eingabebytesequenz falsch formatierte UTF-8-Daten enthält. Außerdem gilt: Wenn die UTF8Encoding-Instanz mit throwOnInvalidBytes: true
erstellt wurde, löst die UTF8Encoding
-Instanz bei ungültiger Eingabe weiterhin eine Ausnahme aus, anstatt eine Ersetzung mit U+FFFD auszuführen. Weitere Informationen über den Konstruktor UTF8Encoding
finden Sie unter UTF8Encoding(Boolean, Boolean).
In der folgenden Tabelle wird die Auswirkung dieser Änderung mit einer ungültigen 3-Byte-Eingabe veranschaulicht:
Falsch formatierte 3-Byte-Eingabe | Ausgabe vor .NET Core 3.0 | Ausgabe ab .NET Core 3.0 |
---|---|---|
[ ED A0 90 ] |
[ FFFD FFFD ] (2-Zeichen-Ausgabe) |
[ FFFD FFFD FFFD ] (3-Zeichen-Ausgabe) |
Die 3-Zeichen-Ausgabe ist die bevorzugte Ausgabe gemäß Tabelle 3–9 der oben genannten PDF-Datei zum Unicode-Standard.
Eingeführt in Version
3.0
Empfohlene Aktion
Auf der Seite des Entwicklers ist keine Aktion erforderlich.
Kategorie
Core .NET-Bibliotheken
Betroffene APIs
TypeDescriptionProviderAttribute in andere Assembly verschoben
Die TypeDescriptionProviderAttribute-Klasse wurde verschoben.
Änderungsbeschreibung
In .NET Core 2.2 und früheren Versionen befand sich die TypeDescriptionProviderAttribute-Klasse in der System.ComponentModel.TypeConverter-Assembly.
Seit .NET Core 3.0 befindet sie sich in der System.ObjectModel-Assembly.
Eingeführt in Version
3.0
Empfohlene Aktion
Diese Änderung betrifft nur Anwendungen, welche die Reflektion zum Laden des TypeDescriptionProviderAttribute-Typs durch Aufrufen einer Methode wie Assembly.GetType oder eine Überladung von Activator.CreateInstance nutzen, bei der vorausgesetzt wird, dass sich der Typ in einer bestimmten Assembly befindet. Ist dies der Fall, muss die im Methodenaufruf referenzierte Assembly entsprechend dem neuen Assemblyspeicherort des Typs aktualisiert werden.
Kategorie
Windows Forms
Betroffene APIs
Keine.
ZipArchiveEntry verarbeitet keine Archive mit inkonsistenten Eintragsgrößen mehr
ZIP-Archive listen sowohl die komprimierte als auch die unkomprimierte Größe im zentralen Verzeichnis und im lokalen Header auf. Die Eintragsdaten selbst geben die Größe ebenfalls an. In .NET Core 2.2 und früheren Versionen wurden diese Werte nie auf Konsistenz geprüft. Ab .NET Core 3.0 ist dies jetzt der Fall.
Änderungsbeschreibung
In .NET Core 2.2 und früheren Versionen ist ZipArchiveEntry.Open() selbst dann erfolgreich, wenn der lokale Header nicht mit dem zentralen Header der ZIP-Datei übereinstimmt. Die Daten werden dekomprimiert, bis das Ende des komprimierten Datenstroms erreicht ist, auch wenn seine Länge die im zentralen Verzeichnis/lokalen Header angegebene unkomprimierte Dateigröße überschreitet.
Ab .NET Core 3.0 überprüft die ZipArchiveEntry.Open()-Methode, ob der lokale Header und der zentrale Header hinsichtlich der komprimierten und unkomprimierten Größen eines Eintrags übereinstimmen. Wenn dies nicht der Fall ist, löst die Methode eine InvalidDataException aus, wenn die lokalen Größen der Header- und/oder Datendeskriptorlisten des Archivs nicht mit dem zentralen Verzeichnis der ZIP-Datei übereinstimmen. Beim Lesen eines Eintrags werden dekomprimierte Daten auf die nicht komprimierte Dateigröße abgeschnitten, die im Header aufgeführt ist.
Diese Änderung wurde vorgenommen, um sicherzustellen, dass ein ZipArchiveEntry die Größe seiner Daten richtig darstellt und nur diese Menge an Daten gelesen wird.
Eingeführt in Version
3.0
Empfohlene Aktion
Packen Sie jedes ZIP-Archiv neu, das diese Probleme aufweist.
Kategorie
Core .NET-Bibliotheken
Betroffene APIs
- ZipArchiveEntry.Open()
- ZipFileExtensions.ExtractToDirectory
- ZipFileExtensions.ExtractToFile
- ZipFile.ExtractToDirectory
FieldInfo.SetValue löst eine Ausnahme für statische reine Initialisierungsfelder aus
Ab .NET Core 3.0 wird eine Ausnahme ausgelöst, wenn Sie versuchen, einen Wert in einem statischen InitOnly-Feld durch Aufrufen von System.Reflection.FieldInfo.SetValue festzulegen.
Änderungsbeschreibung
In .NET Framework und Versionen von .NET Core vor 3.0 konnten Sie den Wert eines statischen Felds, das nach der Initialisierung konstant ist (schreibgeschützt in C#), durch Aufrufen von System.Reflection.FieldInfo.SetValue festlegen. Allerdings führte das Festlegen eines solchen Felds auf diese Weise je nach Zielframework und Optimierungseinstellungen zu einem unvorhersehbaren Verhalten.
Ab . NET Core 3.0 wird beim Aufrufen von SetValue für ein statisches InitOnly-Feld eine System.FieldAccessException-Ausnahme ausgelöst.
Tipp
Ein InitOnly-Feld ist ein Feld, das nur zum Zeitpunkt seiner Deklaration oder im Konstruktor für die enthaltende Klasse festgelegt werden kann. Das heißt, dass es nach der Initialisierung konstant ist.
Eingeführt in Version
3.0
Empfohlene Aktion
Initialisieren Sie statische InitOnly-Felder in einem statischen Konstruktor. Dies gilt sowohl für dynamische als auch für nicht dynamische Typen.
Alternativ können Sie das FieldAttributes.InitOnly-Attribut aus dem Feld entfernen und dann FieldInfo.SetValueaufrufen.
Kategorie
Core .NET-Bibliotheken
Betroffene APIs
- FieldInfo.SetValue(Object, Object)
- FieldInfo.SetValue(Object, Object, BindingFlags, Binder, CultureInfo)
Das Übergeben von GroupCollection an Erweiterungsmethoden, die IEnumerable<T> akzeptieren, erfordert Vermeidung von Mehrdeutigkeit
Wenn Sie eine Erweiterungsmethode aufrufen, die IEnumerable<T>
für GroupCollection akzeptiert, müssen Sie den Typ mithilfe einer Umwandlung verdeutlichen.
Änderungsbeschreibung
Ab .NET Core 3.0 implementiert System.Text.RegularExpressions.GroupCollection neben anderen Typen wie IEnumerable<Group>
auch IEnumerable<KeyValuePair<String,Group>>
. Dies resultiert in einer Mehrdeutigkeit, wenn eine Erweiterungsmethode aufgerufen wird, die IEnumerable<T> akzeptiert. Wenn Sie eine solche Erweiterungsmethode für eine GroupCollection-Instanz aufrufen, z. B. Enumerable.Count, wird der folgende Compilerfehler angezeigt:
CS1061: „GroupCollection“ enthält keine Definition für „Count“, und es konnte keine Erweiterungsmethode „Count“ gefunden werden, die ein erstes Argument vom Typ „GroupCollection“ akzeptiert (möglicherweise fehlt eine using-Anweisung oder ein Assemblyverweis).
In vorherigen Versionen von .NET gab es keine Mehrdeutigkeit und keinen Compilerfehler.
Eingeführt in Version
3.0
Grund für die Änderung
Hierbei handelt es sich um einen unbeabsichtigten Breaking Change. Da diese Funktionsweise seit einiger Zeit besteht, ist keine Änderung geplant. Außerdem würde eine solche Änderung selbst zu einem Breaking Change führen.
Empfohlene Maßnahme
Heben Sie für GroupCollection-Instanzen die Mehrdeutigkeit von Aufrufen der Erweiterungsmethoden auf, die IEnumerable<T>
mit einer Umwandlung akzeptieren.
// Without a cast - causes CS1061.
match.Groups.Count(_ => true)
// With a disambiguating cast.
((IEnumerable<Group>)m.Groups).Count(_ => true);
Kategorie
Core .NET-Bibliotheken
Betroffene APIs
Dies betrifft alle Erweiterungsmethoden, die IEnumerable<T> akzeptieren. Beispiel:
- System.Collections.Immutable.ImmutableArray.ToImmutableArray<TSource>(IEnumerable<TSource>)
- System.Collections.Immutable.ImmutableDictionary.ToImmutableDictionary
- System.Collections.Immutable.ImmutableHashSet.ToImmutableHashSet
- System.Collections.Immutable.ImmutableList.ToImmutableList<TSource>(IEnumerable<TSource>)
- System.Collections.Immutable.ImmutableSortedDictionary.ToImmutableSortedDictionary
- System.Collections.Immutable.ImmutableSortedSet.ToImmutableSortedSet
- System.Data.DataTableExtensions.CopyToDataTable
- Die meisten
System.Linq.Enumerable
-Methoden, z. B. System.Linq.Enumerable.Count. - System.Linq.ParallelEnumerable.AsParallel
- System.Linq.Queryable.AsQueryable
Kryptografie
- BEGIN TRUSTED CERTIFICATE-Syntax nicht mehr für Stammzertifikate unter Linux unterstützt
- EnvelopedCms verwendet standardmäßig AES-256-Verschlüsselung
- Die Mindestgröße für die Generierung von RSAOpenSsl-Schlüsseln wurde heraufgesetzt
- .NET Core 3.0 zieht OpenSSL 1.1.x OpenSSL 1.0.x vor
- CryptoStream.Dispose transformiert den abschließenden Block nur beim Schreiben
„BEGIN TRUSTED CERTIFICATE“-Syntax wird nicht mehr für Stammzertifikate unter Linux unterstützt
Stammzertifikate können unter Linux und anderen UNIX-ähnlichen Betriebssystemen (jedoch nicht macOS) in zwei Formen dargestellt werden: als Standard-PEM-Header BEGIN CERTIFICATE
oder als OpenSSL-spezifischen PEM-Header BEGIN TRUSTED CERTIFICATE
. Die letztere Syntax ermöglicht eine zusätzliche Konfiguration, die Kompatibilitätsprobleme mit der System.Security.Cryptography.X509Certificates.X509Chain-Klasse von .NET Core verursacht hat. BEGIN TRUSTED CERTIFICATE
-Stammzertifikatinhalte werden ab .NET Core 3.0 nicht mehr von der Ketten-Engine geladen.
Änderungsbeschreibung
Zuvor wurden sowohl die BEGIN CERTIFICATE
- als auch die BEGIN TRUSTED CERTIFICATE
-Syntax verwendet, um die Vertrauensliste des Stammzertifikats auszufüllen. Wenn die BEGIN TRUSTED CERTIFICATE
-Syntax verwendet wurde und zusätzliche Optionen in der Datei angegeben wurden, hat X509Chain möglicherweise gemeldet, dass die Vertrauenskette explizit nicht zulässig war (X509ChainStatusFlags.ExplicitDistrust). Wenn das Zertifikat jedoch auch mit der BEGIN CERTIFICATE
-Syntax in einer zuvor geladenen Datei angegeben wurde, war die Vertrauenskette zulässig.
Ab .NET Core 3.0 werden BEGIN TRUSTED CERTIFICATE
-Inhalte nicht mehr gelesen. Wenn das Zertifikat nicht auch über eine Standardsyntax BEGIN CERTIFICATE
angegeben wird, meldet X509Chain, dass der Stamm nicht vertrauenswürdig ist (X509ChainStatusFlags.UntrustedRoot).
Eingeführt in Version
3.0
Empfohlene Aktion
Die meisten Anwendungen sind von dieser Änderung nicht betroffen. Bei Anwendungen, denen aufgrund von Berechtigungsproblemen nicht beide Quellen des Stammzertifikats angezeigt werden, treten nach dem Upgrade möglicherweise unerwartete UntrustedRoot
-Fehler auf.
Viele Linux-Distributionen schreiben Stammzertifikate in zwei Speicherorte: in ein Verzeichnis mit einem einzigen Zertifikat pro Datei und in eine Verkettung mit einer Datei. Bei manchen Distributionen verwendet das Verzeichnis mit einem einzigen Zertifikat pro Datei die BEGIN TRUSTED CERTIFICATE
-Syntax, während die Dateiverkettung die Standardsyntax BEGIN CERTIFICATE
verwendet. Stellen Sie sicher, dass alle benutzerdefinierten Stammzertifikate an mindestens einem dieser Speicherorte als BEGIN CERTIFICATE
hinzugefügt werden und dass beide Speicherorte von Ihrer Anwendung gelesen werden können.
Das übliche Verzeichnis ist /etc/ssl/certs/ , und die übliche verkettete Datei ist /etc/ssl/cert.pem. Verwenden Sie den Befehl openssl version -d
, um den plattformspezifischen Stamm zu ermitteln, der sich von /etc/ssl/ unterscheiden kann. Unter Ubuntu 18.04 ist das Verzeichnis beispielsweise /usr/lib/ssl/certs/ und die Datei /usr/lib/ssl/cert.pem. /usr/lib/ssl/certs/ ist jedoch eine symbolische Verknüpfung mit /etc/ssl/certs/ , und /usr/lib/ssl/cert.pem ist nicht vorhanden.
$ openssl version -d
OPENSSLDIR: "/usr/lib/ssl"
$ ls -al /usr/lib/ssl
total 12
drwxr-xr-x 3 root root 4096 Dec 12 17:10 .
drwxr-xr-x 73 root root 4096 Feb 20 15:18 ..
lrwxrwxrwx 1 root root 14 Mar 27 2018 certs -> /etc/ssl/certs
drwxr-xr-x 2 root root 4096 Dec 12 17:10 misc
lrwxrwxrwx 1 root root 20 Nov 12 16:58 openssl.cnf -> /etc/ssl/openssl.cnf
lrwxrwxrwx 1 root root 16 Mar 27 2018 private -> /etc/ssl/private
Kategorie
Kryptografie
Betroffene APIs
EnvelopedCms verwendet standardmäßig AES-256-Verschlüsselung
Der von EnvelopedCms
verwendete symmetrische Standardverschlüsselungsalgorithmus hat sich von TripleDES in AES-256 geändert.
Änderungsbeschreibung
Wenn in früheren Versionen EnvelopedCms zum Verschlüsseln von Daten verwendet wird, ohne einen symmetrischen Verschlüsselungsalgorithmus über eine Konstruktorüberladung anzugeben, werden die Daten mit dem TripleDES/3DES/3DES/3DEA/DES3-EDE-Algorithmus verschlüsselt.
Ab .NET Core 3.0 (über Version 4.6.0 des NuGet-Pakets System.Security.Cryptography.Pkcs) wurde der Standardalgorithmus in AES-256 geändert, um die Algorithmen zu modernisieren und die Sicherheit von Standardoptionen zu verbessern. Wenn ein Nachrichtenempfängerzertifikat über einen öffentlichen Diffie-Hellman-Schlüssel (Nicht-EC) verfügt, kann die Verschlüsselung mit einer CryptographicException aufgrund von Einschränkungen der zugrunde liegenden Plattform fehlschlagen.
Im folgenden Beispielcode werden die Daten mit TripleDES verschlüsselt, wenn die Ausführung unter .NET Core 2.2 oder früher erfolgt. Wenn die Ausführung unter .NET Core 3.0 oder höher erfolgt, wird für die Verschlüsselung AES-256 verwendet.
EnvelopedCms cms = new EnvelopedCms(content);
cms.Encrypt(recipient);
return cms.Encode();
Eingeführt in Version
3.0
Empfohlene Aktion
Wenn Sie von der Änderung negativ betroffen sind, können Sie die TripleDES-Verschlüsselung wiederherstellen, indem Sie den Bezeichner des Verschlüsselungsalgorithmus in einem EnvelopedCms-Konstruktor explizit angeben, der einen Parameter vom Typ AlgorithmIdentifier enthält, beispielsweise:
Oid tripleDesOid = new Oid("1.2.840.113549.3.7", null);
AlgorithmIdentifier tripleDesIdentifier = new AlgorithmIdentifier(tripleDesOid);
EnvelopedCms cms = new EnvelopedCms(content, tripleDesIdentifier);
cms.Encrypt(recipient);
return cms.Encode();
Kategorie
Kryptografie
Betroffene APIs
Die Mindestgröße für die Generierung von RSAOpenSsl-Schlüsseln wurde heraufgesetzt
Die Mindestgröße für das Erstellen neuer RSA-Schlüssel unter Linux wurde von 384 Bit auf 512 Bit heraufgesetzt.
Änderungsbeschreibung
Mit .NET Core 3.0 wurde die mindestens erforderliche Schlüsselgröße, die von der LegalKeySizes
-Eigenschaft auf RSA-Instanzen von RSA.Create, RSAOpenSsl und RSACryptoServiceProvider unter Linux gemeldet wird, von 384 auf 512 erhöht.
Infolgedessen ist in . NET Core 2.2 und früheren Versionen ein Methodenaufruf wie RSA.Create(384)
erfolgreich. In .NET Core 3.0 und höheren Versionen löst der Methodenaufruf RSA.Create(384)
eine Ausnahme aus, die anzeigt, dass die Größe zu klein ist.
Diese Änderung wurde vorgenommen, weil für OpenSSL (Software zum Durchführen der kryptografischen Vorgänge unter Linux) der Mindestwert von Version 1.0.2 zu Version 1.1.0 erhöht wurde. .NET Core 3.0 zieht OpenSSL 1.1.x 1.0.x vor, und die mindestens gemeldete Version wurde erhöht, um dieser neuen höheren Abhängigkeitseinschränkung Rechnung zu tragen.
Eingeführt in Version
3.0
Empfohlene Aktion
Wenn Sie eine der betroffenen APIs aufzurufen, stellen Sie sicher, dass die Größe der generierten Schlüssel nicht kleiner ist als der Anbietermindestwert.
Hinweis
384-Bit-RSA wird bereits als unsicher angesehen (ebenso wie 512-Bit-RSA). Moderne Empfehlungen (z.B. NIST Special Publication 800-57 Part 1 Revision 4) schlagen 2048-Bit als Mindestgröße für neu generierte Schlüssel vor.
Kategorie
Kryptografie
Betroffene APIs
.NET Core 3.0 zieht OpenSSL 1.1.x OpenSSL 1.0.x vor
.NET Core für Linux, das über mehrere Linux-Distributionen hinweg funktioniert, kann sowohl OpenSSL 1.0.x als auch OpenSSL 1.1.x unterstützen. .NET Core 2.1 und .NET Core 2.2 suchen zuerst nach 1.0.x und dann nach 1.1.x. .NET Core 3.0 sucht zuerst nach 1.1.x. Diese Änderung wurde vorgenommen, um Unterstützung für neue Kryptografiestandards hinzuzufügen.
Diese Änderung kann sich auf Bibliotheken oder Anwendungen auswirken, die plattformübergreifendes Interop mit den OpenSSL-spezifischen Interoptypen in .NET Core durchführen.
Änderungsbeschreibung
In .NET Core 2.2 und früheren Versionen zieht die Runtime das Laden von OpenSSL 1.0.x dem Laden von 1.1.x vor. Dies bedeutet, dass der IntPtr- und SafeHandle-Typ für Interop mit OpenSSL mit libcrypto.so.1.0.0/libcrypto.so.1.0/libcrypto.so.10 bevorzugt verwendet werden.
Ab .NET Core 3.0 bevorzugt die Runtime das Laden von OpenSSL 1.1.x gegenüber OpenSSL 1.0.x, sodass die Typen IntPtr und SafeHandle für Interop mit OpenSSL mit libcrypto.so.1.1/libcrypto.so.11/libcrypto.so.1.1.0/libcrypto.so.1.1.1 verwendet werden. Infolgedessen können Bibliotheken und Anwendungen, die direkt mit OpenSSL interagieren, beim Upgrade von .NET Core 2.1 oder .NET Core 2.2 inkompatible Zeiger mit den von .NET Core bereitgestellten Werten aufweisen.
Eingeführt in Version
3.0
Empfohlene Aktion
Bibliotheken und Anwendungen, die direkte Vorgänge mit OpenSSL ausführen, müssen darauf achten, dass sichergestellt wird, dass sie die gleiche OpenSSL-Version wie die .NET Core-Runtime verwenden.
Alle Bibliotheken oder Anwendungen, die IntPtr- oder SafeHandle-Werte aus den kryptographischen .NET Core-Typen direkt mit OpenSSL verwenden, sollten die Version der von ihnen verwendeten Bibliothek mit der neuen SafeEvpPKeyHandle.OpenSslVersion-Eigenschaft vergleichen, um sicherzustellen, dass die Zeiger kompatibel sind.
Kategorie
Kryptografie
Betroffene APIs
- SafeEvpPKeyHandle
- RSAOpenSsl(IntPtr)
- RSAOpenSsl(SafeEvpPKeyHandle)
- RSAOpenSsl.DuplicateKeyHandle()
- DSAOpenSsl(IntPtr)
- DSAOpenSsl(SafeEvpPKeyHandle)
- DSAOpenSsl.DuplicateKeyHandle()
- ECDsaOpenSsl(IntPtr)
- ECDsaOpenSsl(SafeEvpPKeyHandle)
- ECDsaOpenSsl.DuplicateKeyHandle()
- ECDiffieHellmanOpenSsl(IntPtr)
- ECDiffieHellmanOpenSsl(SafeEvpPKeyHandle)
- ECDiffieHellmanOpenSsl.DuplicateKeyHandle()
- X509Certificate.Handle
CryptoStream.Dispose transformiert den abschließenden Block nur beim Schreiben
Die Methode CryptoStream.Dispose, die verwendet wird, um CryptoStream
-Vorgänge abzuschließen, versucht nicht mehr, den abschließenden Block beim Lesen zu transformieren.
Änderungsbeschreibung
In früheren Versionen von .NET konnte die Methode Dispose eine Ausnahme auslösen, wenn ein Benutzer bei der Verwendung von CryptoStream im Read-Modus einen unvollständigen Lesevorgang durchführte (z. B. bei Verwendung von AES mit Auffüllung). Die Ausnahme wurde ausgelöst, da versucht wurde, den abschließenden Block zu transformieren, die Daten aber unvollständig waren.
Ab .NET Core 3.0 versucht Dispose nicht mehr, den abschließenden Block beim Lesen zu transformieren, was unvollständige Lesevorgänge ermöglicht.
Grund für die Änderung
Diese Änderung ermöglicht unvollständige Lesevorgänge aus CryptoStream, wenn ein Netzwerkvorgang abgebrochen wird, ohne dass eine Ausnahme abgefangen werden muss.
Eingeführt in Version
3.0
Empfohlene Aktion
Die meisten Apps sollten von dieser Änderung nicht betroffen sein.
Wenn Ihre Anwendung bisher bei unvollständigen Lesevorgängen eine Ausnahme abgefangen hat, können Sie diesen catch
-Block löschen.
Wenn Ihre App das Transformieren des abschließenden Blocks in Hashingszenarios verwendet hat, müssen Sie möglicherweise sicherstellen, dass der gesamte Datenstrom gelesen wird, bevor er verworfen wird.
Kategorie
Kryptografie
Betroffene APIs
Entity Framework Core
Breaking Changes für Entity Framework Core
Globalisierung
Gebietsschema „C“ wird dem invarianten Gebietsschema zugeordnet
.NET Core 2.2 und frühere Versionen hängen von dem ICU-Standardverhalten ab, das das Gebietsschema „C“ zum Gebietsschema „en_US_POSIX“ zuordnet. Das Gebietsschema „en_US_POSIX“ weist ein unerwünschtes Sortierverhalten auf, da es keine Zeichenfolgenvergleiche ohne Berücksichtigung der Groß-/Kleinschreibung unterstützt. Da einige Linux-Verteilungen das Gebietsschema „C“ als Standardgebietsschema festlegen, kam es bei einigen Benutzern zu unerwartetem Verhalten.
Beschreibung der Änderung
Die Zuordnung des Gebietsschemas „C“ wurde ab .NET Core 3.0 geändert, sodass das invariante Gebietsschema anstelle von „en_US_POSIX“ verwendet wird. Die Zuordnung des Gebietsschemas „C“ zum invarianten Gebietsschema wird zur Gewährleistung der Konsistenz auch auf Windows angewendet.
Die Zuordnung von „C“ zu „en_US_POSIX“ sorgte bei Kunden für Verwirrung, da „en_US_POSIX“ keine Sortier- und Suchvorgänge für Zeichenfolgen ohne Beachtung der Groß-/Kleinschreibung unterstützt. Da das Gebietsschema „C“ in einigen Linux-Verteilungen als Standardgebietsschema verwendet wird, trat dieses unerwünschte Verhalten bei Kunden mit diesen Betriebssystemen auf.
Eingeführt in Version
3.0
Empfohlene Aktion
Es ist keine spezifische Maßnahme erforderlich. Sie sollten lediglich über die Änderung informiert sein. Diese Änderung wirkt sich nur auf Anwendungen aus, die die Zuordnung des Gebietsschemas „C“ verwenden.
Kategorie
Globalisierung
Betroffene APIs
Diese Änderung wirkt sich auf alle Sortierungs- und Kultur-APIs aus.
MSBuild
Änderung des Manifestdateinamens der Ressource
Ab .NET Core 3.0 generiert MSBuild im Standardfall einen anderen Manifestdateinamen für Ressourcendateien.
Eingeführt in Version
3.0
Änderungsbeschreibung
Vor .NET Core 3.0 hat MSBuild im Muster <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources
einen Manifestdateinamen generiert, wenn für ein EmbeddedResource
-Element in der Projektdatei nicht LogicalName
-, ManifestResourceName
- oder DependentUpon
-Metadaten angegeben wurden. Wenn RootNamespace
nicht in der Projektdatei definiert ist, wird standardmäßig der Projektname verwendet. Beispielsweise lautete der Name des generierten Manifests für eine Ressourcendatei mit dem Namen Form1.resx im Stammverzeichnis des Projekts MyProject.Form1.resources.
Ab .NET Core 3.0 verwendet MSBuild Typinformationen aus der Quelldatei, wenn eine Ressourcendatei mit einer Quelldatei desselben Namens (z. B. Form1.resx und Form1.cs) angeordnet wird, um den Manifestdateinamen im Muster <Namespace>.<ClassName>.resources
zu generieren. Der Namespace- und Klassenname werden aus dem ersten Typ in der angeordneten Quelldatei extrahiert. Beispielsweise lautet der generierte Manifestname für eine Ressourcendatei mit dem Namen Form1.resx, die mit einer Quelldatei mit dem Namen Form1.cs angeordnet wird, MyNamespace.Form1.resources. Wichtig ist zu beachten, dass der erste Teil des Dateinamens sich von früheren Versionen von .NET Core unterscheidet (MyNamespace anstelle von MyProject).
Hinweis
Wenn LogicalName
-, ManifestResourceName
- oder DependentUpon
-Metadaten für ein EmbeddedResource
-Element in der Projektdatei angegeben sind, wirkt sich diese Änderung nicht auf diese Ressourcendatei aus.
Dieser Breaking Change wurde mit dem Hinzufügen der EmbeddedResourceUseDependentUponConvention
-Eigenschaft zu .NET Core-Projekten eingeführt. Standardmäßig werden Ressourcendateien nicht explizit in einer .NET Core-Projektdatei aufgelistet, sodass Ihnen keine DependentUpon
-Metadaten zur Verfügung stehen, um anzugeben, wie die generierte RESOURCES-Datei benannt werden soll. Wenn EmbeddedResourceUseDependentUponConvention
dem Standard entsprechend auf true
festgelegt ist, sucht MSBuild nach einer angeordneten Quelldatei und extrahiert einen Namespace- und Klassennamen aus dieser Datei. Wenn Sie EmbeddedResourceUseDependentUponConvention
auf false
festlegen, generiert MSBuild den Namen des Manifests gemäß dem vorherigen Verhalten, wobei RootNamespace
und der relative Dateipfad kombiniert werden.
Empfohlene Aktion
In den meisten Fällen ist keine Aktion seitens des Entwicklers erforderlich, und Ihre App sollte weiterhin funktionieren. Wenn diese Änderung jedoch Ihre App beeinträchtigt, haben Sie folgende Möglichkeiten:
Ändern Sie den Code so, dass er den neuen Manifestnamen erwartet.
Um die neue Namenskonvention zu umgehen, legen Sie in Ihrer Projektdatei
EmbeddedResourceUseDependentUponConvention
auffalse
fest.<PropertyGroup> <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention> </PropertyGroup>
Kategorie
MSBuild
Betroffene APIs
–
Netzwerk
Standardwert von HttpRequestMessage.Version wurde in 1.1 geändert
Der Standardwert der Eigenschaft System.Net.Http.HttpRequestMessage.Version wurde aus 2.0 in 1.1 geändert.
Eingeführt in Version
3.0
Änderungsbeschreibung
In .NET Core 1.0 bis 2.0 ist der Standardwert der Eigenschaft System.Net.Http.HttpRequestMessage.Version 1.1. Ab .NET Core 2.1 wurde er in 2.1 geändert.
Ab .NET Core 3.0 ist die Standardversionsnummer, die von der System.Net.Http.HttpRequestMessage.Version-Eigenschaft zurückgegeben wird, erneut 1.1.
Empfohlene Maßnahme
Aktualisieren Sie Ihren Code, wenn die System.Net.Http.HttpRequestMessage.Version-Eigenschaft einen Standardwert von 2.0 zurückgeben muss.
Kategorie
Netzwerk
Betroffene APIs
WPF
Geändertes Drag-and-Drop-Verhalten in Texteditoren
.NET Core 3.0 hat eine Änderung der Erstellung von System.Windows.DataObject Text-Editor-Steuerelementen eingeführt, wenn Text auf ein anderes Steuerelement gezogen wird. Die Änderung deaktivierte autoconversion, wodurch der Vorgang die Daten beibehalten, anstatt DataFormats.Text DataFormats.UnicodeText sie in DataFormats.StringFormat.
Eingeführt in Version
.NET Core 3.0
Kategorie
Windows Presentation Foundation
Vorheriges Verhalten
Der Datentyp System.Windows.DataObject beim Ziehen von Text aus einem Text-Editor-Steuerelement war DataFormats.StringFormat.
Neues Verhalten
Der Datentyp beim System.Windows.DataObject Ziehen von Text aus einem Text-Editor-Steuerelement lautet DataFormats.Text oder DataFormats.UnicodeText.
Typ des Breaking Changes
Diese Änderung ist eine Verhaltensänderung.
Grund für die Änderung
Die Änderung war unbeabsichtigt.
Empfohlene Maßnahme
Diese Änderung wurde in .NET 7 wiederhergestellt. Führen Sie ein Upgrade auf .NET 7 oder höher durch.