Icke-bakåtkompatibla ändringar i .NET Core 3.0
Om du migrerar till version 3.0 av .NET Core, ASP.NET Core eller EF Core kan de icke-bakåtkompatibla ändringarna som anges i den här artikeln påverka din app.
ASP.NET Core
- Föråldrade API:er för förfalskning mot förfalskning, CORS, diagnostik, MVC och routning har tagits bort
- "Pubternal"-API:er har tagits bort
- Autentisering: Utfasning av Google+
- Autentisering: Egenskapen HttpContext.Authentication har tagits bort
- Autentisering: Newtonsoft.Json-typer ersatta
- Autentisering: OAuthHandler ExchangeCodeAsync-signaturen har ändrats
- Auktorisering: Överlagring av AddAuthorization har flyttats till en annan sammansättning
- Auktorisering: IAllowAnonymous har tagits bort från AuthorizationFilterContext.Filters
- Auktorisering: IAuthorizationPolicyProvider-implementeringar kräver ny metod
- Cachelagring: Egenskapen CompactOnMemoryPressure har tagits bort
- Cachelagring: Microsoft.Extensions.Caching.SqlServer använder nytt SqlClient-paket
- Cachelagring: ResponseCaching"pubternal"-typer har ändrats till interna
- Dataskydd: DataProtection.Blobs använder nya Azure Storage-API:er
- Värd: AspNetCoreModule V1 har tagits bort från Windows Hosting Bundle
- Värd: Allmän värd begränsar startkonstruktorinmatning
- Värd: HTTPS-omdirigering aktiverad för IIS-appar utan processer
- Värd: IHostingEnvironment- och IApplicationLifetime-typerna har ersatts
- Värd: ObjectPoolProvider har tagits bort från WebHostBuilder-beroenden
- HTTP: Utökningsbarheten defaultHttpContext har tagits bort
- HTTP: HeaderNames-fält har ändrats till statiskt skrivskyddat
- HTTP: Infrastrukturändringar för svarstext
- HTTP: Vissa standardvärden för cookien SameSite har ändrats
- HTTP: Synkron I/O inaktiverad som standard
- Identitet: Överlagring av AddDefaultUI-metod har tagits bort
- Identitet: Ändring av UI Bootstrap-version
- Identitet: SignInAsync genererar undantag för oautentiserad identitet
- Identitet: SignInManager-konstruktorn accepterar ny parameter
- Identitet: Användargränssnittet använder funktionen för statiska webbtillgångar
- Kestrel: Anslutningskort har tagits bort
- Kestrel: Tom HTTPS-sammansättning har tagits bort
- Kestrel: Begär att trailerhuvuden flyttas till ny samling
- Kestrel: Ändringar i transportabstraktionsskiktet
- Lokalisering: API:er markerade som föråldrade
- Loggning: DebugLogger-klassen har gjorts intern
- MVC: Async-suffix för kontrollantåtgärd har tagits bort
- MVC: JsonResult har flyttats till Microsoft.AspNetCore.Mvc.Core
- MVC: Förkompileringsverktyget är inaktuellt
- MVC: Typer som har ändrats till interna
- MVC: Kompatibilitetsshim för webb-API har tagits bort
- Razor: RazorTemplateEngine API har tagits bort
- Razor: Runtime-kompilering har flyttats till ett paket
- Sessionstillstånd: Föråldrade API:er har tagits bort
- Delat ramverk: Borttagning av sammansättning från Microsoft.AspNetCore.App
- Delat ramverk: Microsoft.AspNetCore.All har tagits bort
- SignalR: HandshakeProtocol.SuccessHandshakeData ersatt
- SignalR: HubConnection-metoder har tagits bort
- SignalR: HubConnectionContext-konstruktorer har ändrats
- SignalR: Namnändring av JavaScript-klientpaket
- SignalR: Föråldrade API:er
- SPA: SpaServices och NodeServices har markerats som föråldrade
- SPA:er: Standardändring av standardändring för SpaServices- och NodeServices-konsolloggning
- Målramverk: .NET Framework stöds inte
Föråldrade API:er för förfalskning mot förfalskning, CORS, diagnostik, MVC och routning har tagits bort
Föråldrade medlemmar och kompatibilitetsväxlar i ASP.NET Core 2.2 har tagits bort.
Version introducerad
3,0
Orsak till ändringen
Förbättring av API-ytan över tid.
Rekommenderad åtgärd
När du riktar in dig på .NET Core 2.2 följer du vägledningen i de föråldrade byggmeddelandena för att använda nya API:er i stället.
Kategori
ASP.NET Core
Berörda API:er
Följande typer och medlemmar har markerats som föråldrade för ASP.NET Core 2.1 och 2.2:
Typer
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
Konstruktörer
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)
Egenskaper
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
Metoder
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"-API:er har tagits bort
För att bättre underhålla den offentliga API-ytan för ASP.NET Core har de flesta typerna i *.Internal
namnområden (kallas "pubternal" API:er) blivit verkligt interna. Medlemmar i dessa namnområden var aldrig avsedda att stödjas som offentliga API:er. API:erna kan brytas i mindre versioner och gjorde det ofta. Kod som är beroende av dessa API:er bryts vid uppdatering till ASP.NET Core 3.0.
Mer information finns i dotnet/aspnetcore#4932 och dotnet/aspnetcore#11312.
Version introducerad
3,0
Gammalt beteende
De berörda API:erna markeras med public
åtkomstmodifieraren och finns i *.Internal
namnområden.
Nytt beteende
De berörda API:erna markeras med den interna åtkomstmodifieraren och kan inte längre användas av kod utanför sammansättningen.
Orsak till ändringen
Vägledningen för dessa "pubternal" API:er var att de:
- Kan ändras utan förvarning.
- Var inte föremål för .NET-principer för att förhindra icke-bakåtkompatibla ändringar.
Att lämna API:erna public
(även i *.Internal
namnrymderna) var förvirrande för kunderna.
Rekommenderad åtgärd
Sluta använda dessa "pubternal" API:er. Om du har frågor om alternativa API:er öppnar du ett problem på dotnet/aspnetcore-lagringsplatsen .
Tänk dig till exempel följande HTTP-begärandebuffertningskod i ett ASP.NET Core 2.2-projekt. Tilläggsmetoden EnableRewind
finns i Microsoft.AspNetCore.Http.Internal
namnområdet.
HttpContext.Request.EnableRewind();
I ett ASP.NET Core 3.0-projekt ersätter du anropet EnableRewind
med ett anrop till EnableBuffering
tilläggsmetoden. Funktionen för buffring av begäranden fungerar som den gjorde tidigare. EnableBuffering
anropar nu-API internal
:et.
HttpContext.Request.EnableBuffering();
Kategori
ASP.NET Core
Berörda API:er
Alla API:er i Microsoft.AspNetCore.*
namnrymderna och Microsoft.Extensions.*
som har ett Internal
segment i namnområdets namn. Till exempel:
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
Autentisering: Google+ inaktuellt och ersatt
Google börjar stänga av Google+ Inloggning för appar redan den 28 januari 2019.
Ändra beskrivning
ASP.NET 4.x och ASP.NET Core har använt API:erna för Google+ inloggning för att autentisera Google-kontoanvändare i webbappar. De aktuella NuGet-paketen är Microsoft.AspNetCore.Authentication.Google för ASP.NET Core och Microsoft.Owin.Security.Google för Microsoft.Owin
med ASP.NET Web Forms och MVC.
Googles ersättnings-API:er använder en annan datakälla och ett annat format. De åtgärder och lösningar som tillhandahålls nedan tar hänsyn till de strukturella förändringarna. Appar bör kontrollera att själva data fortfarande uppfyller sina krav. Namn, e-postadresser, profillänkar och profilfoton kan till exempel ge andra värden än tidigare.
Version introducerad
Alla versioner. Den här ändringen är extern för ASP.NET Core.
Rekommenderad åtgärd
Owin med ASP.NET Webbformulär och MVC
För Microsoft.Owin
3.1.0 och senare beskrivs en tillfällig åtgärd här. Appar bör slutföra testningen med åtgärden för att söka efter ändringar i dataformatet. Det finns planer på att släppa Microsoft.Owin
4.0.1 med en korrigering. Appar som använder en tidigare version bör uppdateras till version 4.0.1.
ASP.NET Core 1.x
Åtgärden i Owin med ASP.NET Web Forms och MVC kan anpassas till ASP.NET Core 1.x. NuGet-paketkorrigeringar är inte planerade eftersom 1.x har nått statusen slut på livslängden .
ASP.NET Core 2.x
För Microsoft.AspNetCore.Authentication.Google
version 2.x ersätter du ditt befintliga anrop till AddGoogle
i Startup.ConfigureServices
med följande kod:
.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");
});
Korrigeringarna 2.1 och 2.2 februari inkorporerade den föregående omkonfigurationen som det nya standardvärdet. Ingen korrigering planeras för ASP.NET Core 2.0 eftersom den har nått slutet av livet.
ASP.NET Core 3.0
Den åtgärd som ges för ASP.NET Core 2.x kan också användas för ASP.NET Core 3.0. I framtida förhandsversioner Microsoft.AspNetCore.Authentication.Google
av 3.0 kan paketet tas bort. Användare dirigeras till Microsoft.AspNetCore.Authentication.OpenIdConnect
i stället. Följande kod visar hur du ersätter AddGoogle
med AddOpenIdConnect
i Startup.ConfigureServices
. Den här ersättningen kan användas med ASP.NET Core 2.0 och senare och kan anpassas för ASP.NET Core 1.x efter behov.
.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();
Kategori
ASP.NET Core
Berörda API:er
Microsoft.AspNetCore.Authentication.Google
Autentisering: Egenskapen HttpContext.Authentication har tagits bort
Den inaktuella Authentication
egenskapen på HttpContext
har tagits bort.
Ändra beskrivning
Som en del av dotnet/aspnetcore#6504 har den inaktuella Authentication
egenskapen på HttpContext
tagits bort. Egenskapen Authentication
har varit inaktuell sedan 2.0. En migreringsguide publicerades för att migrera kod med den här inaktuella egenskapen till de nya ersättnings-API:erna. De återstående oanvända klasserna/API:erna som är relaterade till den gamla ASP.NET Core 1.x-autentiseringsstacken togs bort i commit dotnet/aspnetcore@d7a7c65.
Mer information finns i dotnet/aspnetcore#6533.
Version introducerad
3,0
Orsak till ändringen
ASP.NET Core 1.0 API:er har ersatts med tilläggsmetoder i Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions.
Rekommenderad åtgärd
Kategori
ASP.NET Core
Berörda API:er
- 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
Autentisering: Newtonsoft.Json-typer ersatta
I ASP.NET Core 3.0 Newtonsoft.Json
har typer som används i autentiserings-API:er ersatts med System.Text.Json
typer. Förutom i följande fall påverkas inte grundläggande användning av autentiseringspaketen:
- Klasser som härleds från OAuth-leverantörerna, till exempel de från aspnet-contrib.
- Avancerade implementeringar av anspråksmanipulering.
Mer information finns i dotnet/aspnetcore#7105. Mer information finns i dotnet/aspnetcore#7289.
Version introducerad
3,0
Rekommenderad åtgärd
För härledda OAuth-implementeringar är den vanligaste ändringen att ersätta JObject.Parse
med JsonDocument.Parse
i åsidosättningen CreateTicketAsync
enligt nedan. JsonDocument
implementerar IDisposable
.
I följande lista beskrivs kända ändringar:
- ClaimAction.Run(JObject, ClaimsIdentity, String) blir
ClaimAction.Run(JsonElement userData, ClaimsIdentity identity, string issuer)
. Alla härledda implementeringar avClaimAction
påverkas på samma sätt. - ClaimActionCollectionMapExtensions.MapCustomJson(ClaimActionCollection, String, Func<JObject,String>) Blir
MapCustomJson(this ClaimActionCollection collection, string claimType, Func<JsonElement, string> resolver)
- ClaimActionCollectionMapExtensions.MapCustomJson(ClaimActionCollection, String, String, Func<JObject,String>) Blir
MapCustomJson(this ClaimActionCollection collection, string claimType, string valueType, Func<JsonElement, string> resolver)
- OAuthCreatingTicketContext har en gammal konstruktor tagits bort och den andra ersatts
JObject
medJsonElement
. EgenskapenUser
ochRunClaimActions
metoden har uppdaterats så att de matchar. - Success(JObject) accepterar nu en parameter av typen
JsonDocument
i stället förJObject
. EgenskapenResponse
har uppdaterats så att den matchar.OAuthTokenResponse
är nu disponibel och kommer att tas bort avOAuthHandler
. Härledda OAuth-implementeringar somExchangeCodeAsync
åsidosätter behöver inte ta bortJsonDocument
ellerOAuthTokenResponse
. - UserInformationReceivedContext.User har ändrats från
JObject
tillJsonDocument
. - TwitterCreatingTicketContext.User har ändrats från
JObject
tillJsonElement
. - Den sista parametern för TwitterHandler.CreateTicketAsync(ClaimsIdentity,AuthenticationProperties,AccessToken,JObject) har ändrats från
JObject
tillJsonElement
. Ersättningsmetoden är TwitterHandler.CreateTicketAsync(ClaimsIdentity, AuthenticationProperties, AccessToken, JsonElement).
Kategori
ASP.NET Core
Berörda API:er
- Microsoft.AspNetCore.Authentication.Facebook
- Microsoft.AspNetCore.Authentication.Google
- Microsoft.AspNetCore.Authentication.MicrosoftAccount
- Microsoft.AspNetCore.Authentication.OAuth
- Microsoft.AspNetCore.Authentication.OpenIdConnect
- Microsoft.AspNetCore.Authentication.Twitter
Autentisering: OAuthHandler ExchangeCodeAsync-signaturen har ändrats
I ASP.NET Core 3.0 ändrades signaturen OAuthHandler.ExchangeCodeAsync
för från:
protected virtual System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.OAuth.OAuthTokenResponse> ExchangeCodeAsync(string code, string redirectUri) { throw null; }
Till:
protected virtual System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.OAuth.OAuthTokenResponse> ExchangeCodeAsync(Microsoft.AspNetCore.Authentication.OAuth.OAuthCodeExchangeContext context) { throw null; }
Version introducerad
3,0
Gammalt beteende
Strängarna code
och redirectUri
skickades som separata argument.
Nytt beteende
Code
och RedirectUri
är egenskaper på OAuthCodeExchangeContext
som kan anges via OAuthCodeExchangeContext
konstruktorn. Den nya OAuthCodeExchangeContext
typen är det enda argumentet som skickas till OAuthHandler.ExchangeCodeAsync
.
Orsak till ändringen
Den här ändringen gör att ytterligare parametrar kan tillhandahållas på ett icke-icke-bakåtkompatibelt sätt. Du behöver inte skapa nya ExchangeCodeAsync
överlagringar.
Rekommenderad åtgärd
Konstruera en OAuthCodeExchangeContext
med lämpliga code
värden och redirectUri
värden. En AuthenticationProperties instans måste anges. Den här enskilda OAuthCodeExchangeContext
instansen kan skickas till i stället för OAuthHandler.ExchangeCodeAsync
flera argument.
Kategori
ASP.NET Core
Berörda API:er
OAuthHandler<TOptions>.ExchangeCodeAsync(String, String)
Auktorisering: Överlagring av AddAuthorization har flyttats till en annan sammansättning
De kärnmetoder AddAuthorization
som användes för att finnas i Microsoft.AspNetCore.Authorization
har bytt namn till AddAuthorizationCore
. De gamla AddAuthorization
metoderna finns fortfarande, men finns i sammansättningen i Microsoft.AspNetCore.Authorization.Policy
stället. Appar som använder båda metoderna bör inte se någon inverkan. Observera att Microsoft.AspNetCore.Authorization.Policy
nu levereras i det delade ramverket i stället för ett fristående paket enligt beskrivningen i Delat ramverk: Sammansättningar som tagits bort från Microsoft.AspNetCore.App.
Version introducerad
3,0
Gammalt beteende
AddAuthorization
metoder fanns i Microsoft.AspNetCore.Authorization
.
Nytt beteende
AddAuthorization
metoder finns i Microsoft.AspNetCore.Authorization.Policy
. AddAuthorizationCore
är det nya namnet på de gamla metoderna.
Orsak till ändringen
AddAuthorization
är ett bättre metodnamn för att lägga till alla vanliga tjänster som behövs för auktorisering.
Rekommenderad åtgärd
Lägg antingen till en referens till Microsoft.AspNetCore.Authorization.Policy
eller använd AddAuthorizationCore
i stället.
Kategori
ASP.NET Core
Berörda API:er
Auktorisering: IAllowAnonymous har tagits bort från AuthorizationFilterContext.Filters
Från och med ASP.NET Core 3.0 lägger MVC inte till AllowAnonymousFilters för [AllowAnonymous] -attribut som identifierades på kontrollanter och åtgärdsmetoder. Den här ändringen åtgärdas lokalt för derivat av AuthorizeAttribute, men det är en icke-bakåtkompatibel ändring för IAsyncAuthorizationFilter och IAuthorizationFilter implementeringar. Sådana implementeringar omslutna i ett [TypeFilter] -attribut är ett populärt sätt som stöds för att uppnå starkt skrivskyddad, attributbaserad auktorisering när både konfiguration och beroendeinmatning krävs.
Version introducerad
3,0
Gammalt beteende
IAllowAnonymous visades i samlingen AuthorizationFilterContext.Filters . Testning av gränssnittets närvaro var en giltig metod för att åsidosätta eller inaktivera filtret på enskilda kontrollantmetoder.
Nytt beteende
IAllowAnonymous
visas inte längre i AuthorizationFilterContext.Filters
samlingen. IAsyncAuthorizationFilter
implementeringar som är beroende av det gamla beteendet orsakar vanligtvis tillfälliga HTTP 401-otillåtna eller HTTP 403-otillåtna svar.
Orsak till ändringen
En ny strategi för slutpunktsroutning introducerades i ASP.NET Core 3.0.
Rekommenderad åtgärd
Sök efter slutpunktsmetadata för IAllowAnonymous
. Till exempel:
var endpoint = context.HttpContext.GetEndpoint();
if (endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null)
{
}
Ett exempel på den här tekniken visas i den här Metoden HasAllowAnonymous.
Kategori
ASP.NET Core
Berörda API:er
Ingen
Auktorisering: IAuthorizationPolicyProvider-implementeringar kräver ny metod
I ASP.NET Core 3.0 lades en ny GetFallbackPolicyAsync
metod till i IAuthorizationPolicyProvider
. Den här återställningsprincipen används av mellanprogrammet för auktorisering när ingen princip har angetts.
Mer information finns i dotnet/aspnetcore#9759.
Version introducerad
3,0
Gammalt beteende
Implementeringar av IAuthorizationPolicyProvider
krävde GetFallbackPolicyAsync
ingen metod.
Nytt beteende
Implementeringar av IAuthorizationPolicyProvider
kräver en GetFallbackPolicyAsync
metod.
Orsak till ändringen
En ny metod behövdes för att den nya AuthorizationMiddleware
ska kunna användas när ingen princip har angetts.
Rekommenderad åtgärd
Lägg till metoden i GetFallbackPolicyAsync
implementeringarna av IAuthorizationPolicyProvider
.
Kategori
ASP.NET Core
Berörda API:er
Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider
Cachelagring: Egenskapen CompactOnMemoryPressure har tagits bort
Versionen ASP.NET Core 3.0 tog bort föråldrade API:er för MemoryCacheOptions.
Ändra beskrivning
Den här ändringen är en uppföljning till aspnet/Caching#221. Mer information finns i dotnet/extensions#1062.
Version introducerad
3,0
Gammalt beteende
MemoryCacheOptions.CompactOnMemoryPressure
egenskapen var tillgänglig.
Nytt beteende
Egenskapen MemoryCacheOptions.CompactOnMemoryPressure
har tagits bort.
Orsak till ändringen
Att komprimera cacheminnet automatiskt orsakade problem. För att undvika oväntat beteende bör cachen bara komprimeras när det behövs.
Rekommenderad åtgärd
Komprimera cachen genom att nedarbeta till MemoryCache
och anropa Compact
vid behov.
Kategori
ASP.NET Core
Berörda API:er
MemoryCacheOptions.CompactOnMemoryPressure
Cachelagring: Microsoft.Extensions.Caching.SqlServer använder nytt SqlClient-paket
Paketet Microsoft.Extensions.Caching.SqlServer
använder det nya Microsoft.Data.SqlClient
paketet i stället System.Data.SqlClient
för paketet. Den här ändringen kan orsaka mindre beteendemässiga icke-bakåtkompatibla ändringar. Mer information finns i Introduktion till nya Microsoft.Data.SqlClient.
Version introducerad
3,0
Gammalt beteende
Paketet Microsoft.Extensions.Caching.SqlServer
använde System.Data.SqlClient
paketet.
Nytt beteende
Microsoft.Extensions.Caching.SqlServer
använder nu paketet Microsoft.Data.SqlClient
.
Orsak till ändringen
Microsoft.Data.SqlClient
är ett nytt paket som är byggt av System.Data.SqlClient
. Det är där allt nytt funktionsarbete kommer att göras från och med nu.
Rekommenderad åtgärd
Kunder bör inte behöva oroa sig för den här icke-bakåtkompatibla ändringen om de inte använder typer som returneras av Microsoft.Extensions.Caching.SqlServer
paketet och gjuter dem till System.Data.SqlClient
typer. Om någon till exempel kastade en DbConnection
till den gamla SqlConnection-typen skulle de behöva ändra casten till den nya Microsoft.Data.SqlClient.SqlConnection
typen.
Kategori
ASP.NET Core
Berörda API:er
Ingen
Cachelagring: ResponseCaching"pubternal"-typer har ändrats till interna
I ASP.NET Core 3.0 har "pubternal"-typerna i ResponseCaching
ändrats till internal
.
Dessutom läggs standardimplementeringar av IResponseCachingPolicyProvider
och IResponseCachingKeyProvider
inte längre till i tjänster som en del av AddResponseCaching
metoden.
Ändra beskrivning
I ASP.NET Core deklareras "pubternal"-typer som public
men finns i ett namnområdessuffix med .Internal
. Även om dessa typer är offentliga har de ingen supportprincip och kan komma att ändras. Tyvärr har oavsiktlig användning av dessa typer varit vanligt, vilket resulterar i icke-bakåtkompatibla ändringar i dessa projekt och begränsar möjligheten att underhålla ramverket.
Version introducerad
3,0
Gammalt beteende
Dessa typer var offentligt synliga, men stöds inte.
Nytt beteende
Dessa typer är nu internal
.
Orsak till ändringen
Omfånget internal
återspeglar bättre principen som inte stöds.
Rekommenderad åtgärd
Kopiera typer som används av din app eller ditt bibliotek.
Kategori
ASP.NET Core
Berörda API:er
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)
Dataskydd: DataProtection.Blobs använder nya Azure Storage-API:er
Azure.Extensions.AspNetCore.DataProtection.Blobs
beror på Azure Storage-biblioteken. Biblioteken bytte namn på sina sammansättningar, paket och namnområden. Från och med ASP.NET Core 3.0 Azure.Extensions.AspNetCore.DataProtection.Blobs
använder du de nya Azure.Storage.
PREFIX-API:erna och paketen.
Om du vill ha frågor om Azure Storage-API:er använder du https://github.com/Azure/azure-storage-net. Information om det här problemet finns i dotnet/aspnetcore#19570.
Version introducerad
3,0
Gammalt beteende
Paketet refererade till NuGet-paketet WindowsAzure.Storage
.
Paketet refererar till NuGet-paketet Microsoft.Azure.Storage.Blob
.
Nytt beteende
Paketet refererar till NuGet-paketet Azure.Storage.Blob
.
Orsak till ändringen
Med den här ändringen kan Azure.Extensions.AspNetCore.DataProtection.Blobs
du migrera till de rekommenderade Azure Storage-paketen.
Rekommenderad åtgärd
Om du fortfarande behöver använda äldre Azure Storage-API:er med ASP.NET Core 3.0 lägger du till ett direkt beroende till paketet WindowsAzure.Storage eller Microsoft.Azure.Storage. Det här paketet kan installeras tillsammans med de nya Azure.Storage
API:erna.
I många fall innebär uppgraderingen endast att du ändrar using
instruktionerna så att de nya namnrymderna används:
- 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;
Kategori
ASP.NET Core
Berörda API:er
Ingen
Värd: AspNetCoreModule V1 har tagits bort från Windows Hosting Bundle
Från och med ASP.NET Core 3.0 innehåller Windows Hosting Bundle inte AspNetCoreModule (ANCM) V1.
ANCM V2 är bakåtkompatibelt med ANCM OutOfProcess och rekommenderas för användning med ASP.NET Core 3.0-appar.
Mer information finns i dotnet/aspnetcore#7095.
Version introducerad
3,0
Gammalt beteende
ANCM V1 ingår i Windows-värdpaketet.
Nytt beteende
ANCM V1 ingår inte i Windows-värdpaketet.
Orsak till ändringen
ANCM V2 är bakåtkompatibelt med ANCM OutOfProcess och rekommenderas för användning med ASP.NET Core 3.0-appar.
Rekommenderad åtgärd
Använd ANCM V2 med ASP.NET Core 3.0-appar.
Om ANCM V1 krävs kan det installeras med hjälp av ASP.NET Core 2.1 eller 2.2 Windows Hosting Bundle.
Den här ändringen bryter ASP.NET Core 3.0-appar som:
- Uttryckligen valt att använda ANCM V1 med
<AspNetCoreModuleName>AspNetCoreModule</AspNetCoreModuleName>
. - Ha en anpassad web.config-fil med
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
.
Kategori
ASP.NET Core
Berörda API:er
Ingen
Värd: Allmän värd begränsar startkonstruktorinmatning
De enda typer som den generiska värden stöder för Startup
klasskonstruktorinmatning är IHostEnvironment
, IWebHostEnvironment
och IConfiguration
. Appar som använder WebHost
påverkas inte.
Ändra beskrivning
Före ASP.NET Core 3.0 kan konstruktorinmatning användas för godtyckliga typer i Startup
klassens konstruktor. I ASP.NET Core 3.0 omplatformades webbstacken till det allmänna värdbiblioteket. Du kan se ändringen i Program.cs-filen för mallarna:
ASP.NET Core 2.x:
ASP.NET Core 3.0:
Host
använder en di-container (dependency injection) för att skapa appen. WebHost
använder två containrar: en för värden och en för appen. Därför Startup
stöder konstruktorn inte längre anpassad tjänstinmatning. Endast IHostEnvironment
, IWebHostEnvironment
, och IConfiguration
kan matas in. Den här ändringen förhindrar DI-problem, till exempel duplicerade skapande av en singleton-tjänst.
Version introducerad
3,0
Orsak till ändringen
Den här ändringen är en följd av att webbstacken har omformats till det allmänna värdbiblioteket.
Rekommenderad åtgärd
Mata in tjänster i metodsignaturen Startup.Configure
. Till exempel:
public void Configure(IApplicationBuilder app, IOptions<MyOptions> options)
Kategori
ASP.NET Core
Berörda API:er
Ingen
Värd: HTTPS-omdirigering aktiverad för IIS-appar utan processer
Version 13.0.19218.0 av ASP.NET Core Module (ANCM) för värd via IIS out-of-process möjliggör en befintlig HTTPS-omdirigeringsfunktion för ASP.NET Core 3.0- och 2.2-appar.
Mer information finns i dotnet/AspNetCore#15243.
Version introducerad
3,0
Gammalt beteende
Projektmallen ASP.NET Core 2.1 introducerade först stöd för HTTPS-mellanprogramsmetoder som UseHttpsRedirection och UseHsts. Att aktivera HTTPS-omdirigering krävde tillägg av konfigurationen, eftersom appar under utveckling inte använder standardporten 443. HTTP Strict Transport Security (HSTS) är endast aktivt om begäran redan använder HTTPS. Localhost hoppas över som standard.
Nytt beteende
I ASP.NET Core 3.0 förbättrades IIS HTTPS-scenariot. Med förbättringen kan en app identifiera serverns HTTPS-portar och få det att UseHttpsRedirection
fungera som standard. Den processbaserade komponenten utförde portidentifiering med IServerAddresses
funktionen, som endast påverkar ASP.NET Core 3.0-appar eftersom det pågående biblioteket är versionshanterat med ramverket. Komponenten out-of-process ändrades för att automatiskt lägga till ASPNETCORE_HTTPS_PORT
miljövariabeln. Den här ändringen påverkade både ASP.NET Core 2.2- och 3.0-appar eftersom out-of-process-komponenten delas globalt. ASP.NET Core 2.1-appar påverkas inte eftersom de använder en tidigare version av ANCM som standard.
Föregående beteende ändrades i ASP.NET Core 3.0.1 och 3.1.0 Preview 3 för att ändra beteendeändringarna i ASP.NET Core 2.x. Dessa ändringar påverkar bara IIS-appar som inte är i processen.
Som beskrivs ovan hade installationen av ASP.NET Core 3.0.0 bieffekten UseHttpsRedirection
av att även aktivera mellanprogrammet i ASP.NET Core 2.x-appar. En ändring gjordes i ANCM i ASP.NET Core 3.0.1 och 3.1.0 Preview 3 så att installation av dem inte längre har den här effekten på ASP.NET Core 2.x-appar. Miljövariabeln ASPNETCORE_HTTPS_PORT
som ANCM fyllde i i ASP.NET Core 3.0.0 ändrades till ASPNETCORE_ANCM_HTTPS_PORT
i ASP.NET Core 3.0.1 och 3.1.0 Preview 3. UseHttpsRedirection
uppdaterades också i dessa versioner för att förstå både de nya och gamla variablerna. ASP.NET Core 2.x uppdateras inte. Det innebär att den återgår till det tidigare beteendet att inaktiveras som standard.
Orsak till ändringen
Förbättrade funktioner i ASP.NET Core 3.0.
Rekommenderad åtgärd
Ingen åtgärd krävs om du vill att alla klienter ska använda HTTPS. Gör något av följande för att tillåta att vissa klienter använder HTTP:
Ta bort anropen till
UseHttpsRedirection
ochUseHsts
från projektetsStartup.Configure
metod och distribuera om appen.I filen web.config anger du
ASPNETCORE_HTTPS_PORT
miljövariabeln till en tom sträng. Den här ändringen kan ske direkt på servern utan att omdistribuera appen. Till exempel:<aspNetCore processPath="dotnet" arguments=".\WebApplication3.dll" stdoutLogEnabled="false" stdoutLogFile="\\?\%home%\LogFiles\stdout" > <environmentVariables> <environmentVariable name="ASPNETCORE_HTTPS_PORT" value="" /> </environmentVariables> </aspNetCore>
UseHttpsRedirection
kan fortfarande vara:
- Aktiveras manuellt i ASP.NET Core 2.x genom att ställa in
ASPNETCORE_HTTPS_PORT
miljövariabeln på lämpligt portnummer (443 i de flesta produktionsscenarier). - Inaktiverad i ASP.NET Core 3.x genom att
ASPNETCORE_ANCM_HTTPS_PORT
definiera med ett tomt strängvärde. Det här värdet anges på samma sätt som föregåendeASPNETCORE_HTTPS_PORT
exempel.
Datorer som kör ASP.NET Core 3.0.0-appar bör installera ASP.NET Core 3.0.1-körningen innan du installerar ASP.NET Core 3.1.0 Förhandsversion 3 ANCM. Detta säkerställer att fortsätter att UseHttpsRedirection
fungera som förväntat för ASP.NET Core 3.0-appar.
I Azure App Service distribuerar ANCM enligt ett separat schema från körningen på grund av dess globala karaktär. ANCM distribuerades till Azure med dessa ändringar efter att ASP.NET Core 3.0.1 och 3.1.0 distribuerats.
Kategori
ASP.NET Core
Berörda API:er
HttpsPolicyBuilderExtensions.UseHttpsRedirection(IApplicationBuilder)
Värd: IHostingEnvironment- och IApplicationLifetime-typer markerade föråldrade och ersatta
Nya typer har introducerats för att ersätta befintliga IHostingEnvironment
och IApplicationLifetime
typer.
Version introducerad
3,0
Gammalt beteende
Det fanns två olika IHostingEnvironment
typer från IApplicationLifetime
Microsoft.Extensions.Hosting
och Microsoft.AspNetCore.Hosting
.
Nytt beteende
De gamla typerna har markerats som föråldrade och ersatta med nya typer.
Orsak till ändringen
När Microsoft.Extensions.Hosting
introducerades i ASP.NET Core 2.1 kopierades vissa typer som IHostingEnvironment
och IApplicationLifetime
från Microsoft.AspNetCore.Hosting
. Vissa ASP.NET Core 3.0-ändringar gör att appar inkluderar både namnrymderna Microsoft.Extensions.Hosting
och Microsoft.AspNetCore.Hosting
. All användning av dessa dubbletter orsakar ett "tvetydigt referensfel" när båda namnrymderna refereras.
Rekommenderad åtgärd
Ersatte alla användningar av de gamla typerna med de nyligen introducerade typerna enligt nedan:
Föråldrade typer (varning):
- Microsoft.Extensions.Hosting.IHostingEnvironment
- Microsoft.AspNetCore.Hosting.IHostingEnvironment
- Microsoft.Extensions.Hosting.IApplicationLifetime
- Microsoft.AspNetCore.Hosting.IApplicationLifetime
- Microsoft.Extensions.Hosting.EnvironmentName
- Microsoft.AspNetCore.Hosting.EnvironmentName
Nya typer:
- Microsoft.Extensions.Hosting.IHostEnvironment
Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment
- Microsoft.Extensions.Hosting.IHostApplicationLifetime
- Microsoft.Extensions.Hosting.Environments
De nya IHostEnvironment
IsDevelopment
metoderna och IsProduction
tilläggsmetoderna Microsoft.Extensions.Hosting
finns i namnområdet. Namnområdet kan behöva läggas till i projektet.
Kategori
ASP.NET Core
Berörda API:er
- Microsoft.AspNetCore.Hosting.EnvironmentName
- Microsoft.AspNetCore.Hosting.IApplicationLifetime
- Microsoft.AspNetCore.Hosting.IHostingEnvironment
- Microsoft.Extensions.Hosting.EnvironmentName
- Microsoft.Extensions.Hosting.IApplicationLifetime
- Microsoft.Extensions.Hosting.IHostingEnvironment
Värd: ObjectPoolProvider har tagits bort från WebHostBuilder-beroenden
Som en del av att göra ASP.NET Core mer betala för spel, ObjectPoolProvider
togs bort från huvuduppsättningen av beroenden. Specifika komponenter som förlitar sig på ObjectPoolProvider
lägger nu till det själva.
Mer information finns i dotnet/aspnetcore#5944.
Version introducerad
3,0
Gammalt beteende
WebHostBuilder
tillhandahåller ObjectPoolProvider
som standard i DI-containern.
Nytt beteende
WebHostBuilder
tillhandahåller ObjectPoolProvider
inte längre som standard i DI-containern.
Orsak till ändringen
Den här ändringen gjordes för att göra ASP.NET Core mer betala för spel.
Rekommenderad åtgärd
Om komponenten kräver ObjectPoolProvider
måste den läggas till i dina beroenden IServiceCollection
via .
Kategori
ASP.NET Core
Berörda API:er
Ingen
HTTP: Utökningsbarheten defaultHttpContext har tagits bort
Som en del av ASP.NET Core 3.0-prestandaförbättringar togs utökningsbarheten DefaultHttpContext
bort. Klassen är nu sealed
. Mer information finns i dotnet/aspnetcore#6504.
Om enhetstesterna använder använder Mock<DefaultHttpContext>
du Mock<HttpContext>
eller new DefaultHttpContext()
i stället.
Mer information finns i dotnet/aspnetcore#6534.
Version introducerad
3,0
Gammalt beteende
Klasser kan härledas från DefaultHttpContext
.
Nytt beteende
Klasser kan inte härledas från DefaultHttpContext
.
Orsak till ändringen
Utökningsbarheten tillhandahölls ursprungligen för att tillåta poolning av HttpContext
, men det introducerade onödig komplexitet och hindrade andra optimeringar.
Rekommenderad åtgärd
Om du använder Mock<DefaultHttpContext>
i enhetstesterna börjar du använda Mock<HttpContext>
i stället.
Kategori
ASP.NET Core
Berörda API:er
Microsoft.AspNetCore.Http.DefaultHttpContext
HTTP: HeaderNames-konstanter har ändrats till statiska skrivskyddade
Från och med ASP.NET Core 3.0 Preview 5 ändrades fälten i Microsoft.Net.Http.Headers.HeaderNames från const
till static readonly
.
Mer information finns i dotnet/aspnetcore#9514.
Version introducerad
3,0
Gammalt beteende
Dessa fält brukade vara const
.
Nytt beteende
Dessa fält är nu static readonly
.
Orsak till ändringen
Ändringen:
- Förhindrar att värdena bäddas in över sammansättningsgränser, vilket möjliggör värdekorrigeringar efter behov.
- Möjliggör snabbare referensjämlikhetskontroller.
Rekommenderad åtgärd
Kompilera om mot 3.0. Källkod med hjälp av dessa fält på följande sätt kan inte längre göra det:
- Som ett attributargument
- Som en
case
i enswitch
instruktion - När du definierar en annan
const
Om du vill kringgå den icke-bakåtkompatibla ändringen växlar du till att använda självdefinierade rubriknamnskonstanter eller strängliteraler.
Kategori
ASP.NET Core
Berörda API:er
Microsoft.Net.Http.Headers.HeaderNames
HTTP: Infrastrukturändringar för svarstext
Infrastrukturen som stöder en HTTP-svarstext har ändrats. Om du använder HttpResponse
direkt bör du inte behöva göra några kodändringar. Läs vidare om du omsluter eller ersätter HttpResponse.Body
eller kommer åt HttpContext.Features
.
Version introducerad
3,0
Gammalt beteende
Det fanns tre API:er associerade med HTTP-svarstexten:
IHttpResponseFeature.Body
IHttpSendFileFeature.SendFileAsync
IHttpBufferingFeature.DisableResponseBuffering
Nytt beteende
Om du ersätter HttpResponse.Body
ersätter den hela IHttpResponseBodyFeature
med en omslutning runt din angivna ström med hjälp StreamResponseBodyFeature
av för att tillhandahålla standardimplementeringar för alla förväntade API:er. Om du ställer in den ursprungliga strömmen återställs den här ändringen.
Orsak till ändringen
Motivationen är att kombinera API:er för svarstext till ett enda nytt funktionsgränssnitt.
Rekommenderad åtgärd
Använd IHttpResponseBodyFeature
där du tidigare använde IHttpResponseFeature.Body
, IHttpSendFileFeature
, eller IHttpBufferingFeature
.
Kategori
ASP.NET Core
Berörda API:er
- Microsoft.AspNetCore.Http.Features.IHttpBufferingFeature
- Microsoft.AspNetCore.Http.Features.IHttpResponseFeature.Body
- Microsoft.AspNetCore.Http.Features.IHttpSendFileFeature
HTTP: Vissa standardvärden för cookien SameSite har ändrats till Ingen
SameSite
är ett alternativ för cookies som kan hjälpa till att minimera vissa CSRF-attacker (Cross-Site Request Forgery). När det här alternativet ursprungligen introducerades användes inkonsekventa standardvärden för olika ASP.NET Core-API:er. Inkonsekvensen har lett till förvirrande resultat. Från och med ASP.NET Core 3.0 är dessa standardvärden bättre justerade. Du måste välja den här funktionen per komponent.
Version introducerad
3,0
Gammalt beteende
Liknande ASP.NET Core-API:er använde olika standardvärden SameSiteMode . Ett exempel på inkonsekvensen visas i HttpResponse.Cookies.Append(String, String)
och HttpResponse.Cookies.Append(String, String, CookieOptions)
, som standardvärdet SameSiteMode.None
och SameSiteMode.Lax
, respektive.
Nytt beteende
Alla berörda API:er är som standard SameSiteMode.None
.
Orsak till ändringen
Standardvärdet ändrades för att göra SameSite
en opt-in-funktion.
Rekommenderad åtgärd
Varje komponent som genererar cookies måste avgöra om SameSite
det är lämpligt för dess scenarier. Granska din användning av de berörda API:erna och konfigurera om SameSite
efter behov.
Kategori
ASP.NET Core
Berörda API:er
HTTP: Synkron I/O inaktiverad på alla servrar
Från och med ASP.NET Core 3.0 inaktiveras synkrona serveråtgärder som standard.
Ändra beskrivning
AllowSynchronousIO
är ett alternativ på varje server som aktiverar eller inaktiverar synkrona I/O-API:er som HttpRequest.Body.Read
, HttpResponse.Body.Write
och Stream.Flush
. Dessa API:er har länge varit en källa till trådsvältning och applåsningar. Från och med ASP.NET Core 3.0 Preview 3 inaktiveras dessa synkrona åtgärder som standard.
Berörda servrar:
- Kestrel
- HttpSys
- IIS pågår
- TestServer
Förvänta dig fel som liknar:
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.
Varje server har ett AllowSynchronousIO
alternativ som styr det här beteendet och standardvärdet för alla är nu false
.
Beteendet kan också åsidosättas per begäran som en tillfällig åtgärd. Till exempel:
var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
}
Om du har problem med att en TextWriter
eller annan ström anropar ett synkront API i anropar du det nya DisposeAsync
API:et i Dispose
stället.
Mer information finns i dotnet/aspnetcore#7644.
Version introducerad
3,0
Gammalt beteende
HttpRequest.Body.Read
, HttpResponse.Body.Write
och Stream.Flush
tilläts som standard.
Nytt beteende
Dessa synkrona API:er tillåts inte som standard:
Förvänta dig fel som liknar:
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.
Orsak till ändringen
Dessa synkrona API:er har länge varit en källa till trådsvältning och applåsningar. Från och med ASP.NET Core 3.0 Preview 3 inaktiveras synkrona åtgärder som standard.
Rekommenderad åtgärd
Använd de asynkrona versionerna av metoderna. Beteendet kan också åsidosättas per begäran som en tillfällig åtgärd.
var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
}
Kategori
ASP.NET Core
Berörda API:er
Identitet: Överlagring av AddDefaultUI-metod har tagits bort
Från och med ASP.NET Core 3.0 finns inte längre överlagring av metoden IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder,UIFramework).
Version introducerad
3,0
Orsak till ändringen
Den här ändringen var ett resultat av införandet av funktionen för statiska webbtillgångar.
Rekommenderad åtgärd
Anropa IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder) i stället för den överlagring som tar två argument. Om du använder Bootstrap 3 lägger du också till följande rad i ett <PropertyGroup>
element i projektfilen:
<IdentityUIFrameworkVersion>Bootstrap3</IdentityUIFrameworkVersion>
Kategori
ASP.NET Core
Berörda API:er
IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder,UIFramework)
Identitet: Standardversionen av användargränssnittet för Bootstrap har ändrats
Från och med ASP.NET Core 3.0 använder identitetsgränssnittet standardversion 4 av Bootstrap.
Version introducerad
3,0
Gammalt beteende
Metodanropet services.AddDefaultIdentity<IdentityUser>().AddDefaultUI();
var detsamma som services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap3);
Nytt beteende
Metodanropet services.AddDefaultIdentity<IdentityUser>().AddDefaultUI();
är detsamma som services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap4);
Orsak till ändringen
Bootstrap 4 släpptes under ASP.NET Core 3.0-tidsram.
Rekommenderad åtgärd
Du påverkas av den här ändringen om du använder standardgränssnittet för identitet och har lagt till det i Startup.ConfigureServices
som du ser i följande exempel:
services.AddDefaultIdentity<IdentityUser>().AddDefaultUI();
Välj en av följande åtgärder:
Migrera din app för att använda Bootstrap 4 med hjälp av deras migreringsguide.
Uppdatera
Startup.ConfigureServices
för att framtvinga användning av Bootstrap 3. Till exempel:services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap3);
Kategori
ASP.NET Core
Berörda API:er
Ingen
Identitet: SignInAsync genererar undantag för oautentiserad identitet
Som standard SignInAsync
genererar ett undantag för huvudnamn/identiteter där IsAuthenticated
är false
.
Version introducerad
3,0
Gammalt beteende
SignInAsync
accepterar alla huvudnamn/identiteter, inklusive identiteter där IsAuthenticated
är false
.
Nytt beteende
Som standard SignInAsync
genererar ett undantag för huvudnamn/identiteter där IsAuthenticated
är false
. Det finns en ny flagga för att förhindra det här beteendet, men standardbeteendet har ändrats.
Orsak till ändringen
Det gamla beteendet var problematiskt eftersom dessa huvudnamn som standard avvisades av [Authorize]
/ RequireAuthenticatedUser()
.
Rekommenderad åtgärd
I ASP.NET Core 3.0 Preview 6 finns det en RequireAuthenticatedSignIn
flagga på AuthenticationOptions
som standard true
. Ange den här flaggan till false
för att återställa det gamla beteendet.
Kategori
ASP.NET Core
Berörda API:er
Ingen
Identitet: SignInManager-konstruktorn accepterar ny parameter
Från och med ASP.NET Core 3.0 lades en ny IUserConfirmation<TUser>
parameter till i SignInManager
konstruktorn. Mer information finns i dotnet/aspnetcore#8356.
Version introducerad
3,0
Orsak till ändringen
Motiveringen till ändringen var att lägga till stöd för nya e-post-/bekräftelseflöden i identiteten.
Rekommenderad åtgärd
Om du skapar en SignInManager
manuellt anger du en implementering av IUserConfirmation
eller hämtar en från beroendeinmatningen som ska tillhandahållas.
Kategori
ASP.NET Core
Berörda API:er
Identitet: Användargränssnittet använder funktionen för statiska webbtillgångar
ASP.NET Core 3.0 introducerade en funktion för statiska webbtillgångar och Identity UI har antagit den.
Ändra beskrivning
Som ett resultat av att identitetsgränssnittet implementerar funktionen för statiska webbtillgångar:
- Du kan välja ramverk med hjälp
IdentityUIFrameworkVersion
av egenskapen i projektfilen. - Bootstrap 4 är standardgränssnittsramverket för identitetsgränssnittet. Bootstrap 3 har nått slutet av livet och du bör överväga att migrera till en version som stöds.
Version introducerad
3,0
Gammalt beteende
Standardgränssnittsramverket för identitetsgränssnittet var Bootstrap 3. UI-ramverket kan konfigureras med hjälp av en parameter till metodanropet AddDefaultUI
i Startup.ConfigureServices
.
Nytt beteende
Standardgränssnittsramverket för identitetsgränssnittet är Bootstrap 4. UI-ramverket måste konfigureras i projektfilen i stället för i metodanropet AddDefaultUI
.
Orsak till ändringen
Införandet av funktionen för statiska webbtillgångar kräver att UI Framework-konfigurationen flyttas till MSBuild. Beslutet om vilket ramverk som ska bäddas in är ett beslut om byggtid, inte ett körningsbeslut.
Rekommenderad åtgärd
Granska webbplatsgränssnittet för att se till att de nya Bootstrap 4-komponenterna är kompatibla. Om det behövs använder du IdentityUIFrameworkVersion
egenskapen MSBuild för att återgå till Bootstrap 3. Lägg till egenskapen i ett <PropertyGroup>
element i projektfilen:
<IdentityUIFrameworkVersion>Bootstrap3</IdentityUIFrameworkVersion>
Kategori
ASP.NET Core
Berörda API:er
IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder, UIFramework)
Kestrel: Anslutningskort har tagits bort
Som en del av övergången till att flytta "pubternal" API:er till public
, togs begreppet en IConnectionAdapter
bort från Kestrel. Anslutningskort ersätts med mellanprogram för anslutning (liknar HTTP-mellanprogram i ASP.NET Core-pipelinen, men för anslutningar på lägre nivå). HTTPS och anslutningsloggning har flyttats från anslutningskort till anslutningsmellanprogram. Dessa tilläggsmetoder bör fortsätta att fungera sömlöst, men implementeringsinformationen har ändrats.
Mer information finns i dotnet/aspnetcore#11412. Diskussion finns i dotnet/aspnetcore#11475.
Version introducerad
3,0
Gammalt beteende
Kestrel-utökningskomponenter skapades med hjälp av IConnectionAdapter
.
Nytt beteende
Kestrel-utökningskomponenter skapas som mellanprogram.
Orsak till ändringen
Den här ändringen är avsedd att ge en mer flexibel utökningsarkitektur.
Rekommenderad åtgärd
Konvertera alla implementeringar av IConnectionAdapter
för att använda det nya mellanprogramsmönstret som du ser här.
Kategori
ASP.NET Core
Berörda API:er
Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal.IConnectionAdapter
Kestrel: Tom HTTPS-sammansättning har tagits bort
Sammansättningen Microsoft.AspNetCore.Server.Kestrel.Https har tagits bort.
Version introducerad
3,0
Orsak till ändringen
I ASP.NET Core 2.1 flyttades innehållet Microsoft.AspNetCore.Server.Kestrel.Https
i till Microsoft.AspNetCore.Server.Kestrel.Core. Den här ändringen gjordes på ett icke-icke-banbrytande sätt med hjälp av [TypeForwardedTo]
attribut.
Rekommenderad åtgärd
- Bibliotek som refererar
Microsoft.AspNetCore.Server.Kestrel.Https
till 2.0 bör uppdatera alla ASP.NET Core-beroenden till 2.1 eller senare. Annars kan de brytas när de läses in i en ASP.NET Core 3.0-app. - Appar och bibliotek som riktar sig till ASP.NET Core 2.1 och senare bör ta bort alla direkta referenser till
Microsoft.AspNetCore.Server.Kestrel.Https
NuGet-paketet.
Kategori
ASP.NET Core
Berörda API:er
Ingen
Kestrel: Begär att trailerhuvuden flyttas till ny samling
I tidigare versioner lade Kestrel till HTTP/1.1 segmenterade trailerhuvuden i samlingen med begärandehuvuden när begärandetexten lästes till slutet. Det här beteendet orsakade oro för tvetydighet mellan huvuden och trailers. Beslutet togs att flytta släpvagnarna till en ny kollektion.
HTTP/2-begärandetrailrar var inte tillgängliga i ASP.NET Core 2.2 men är nu också tillgängliga i den här nya samlingen i ASP.NET Core 3.0.
Nya metoder för förfrågningstillägg har lagts till för åtkomst till dessa släpvagnar.
HTTP/1.1-trailers är tillgängliga när hela begärandetexten har lästs.
HTTP/2-trailers är tillgängliga när de tas emot från klienten. Klienten skickar inte trailers förrän hela begärandetexten har buffrats av servern. Du kan behöva läsa begärandetexten för att frigöra buffertutrymme. Släpvagnar är alltid tillgängliga om du läser begärandetexten till slutet. Släpvagnarna markerar kroppens ände.
Version introducerad
3,0
Gammalt beteende
Begärandehuvuden för trailer läggs till i HttpRequest.Headers
samlingen.
Nytt beteende
Begärandehuvuden HttpRequest.Headers
för trailer finns inte i samlingen. Använd följande tilläggsmetoder för HttpRequest
att komma åt dem:
GetDeclaredTrailers()
- Hämtar begäran "Trailer"-rubriken som listar vilka trailers som ska förväntas efter brödtexten.SupportsTrailers()
– Anger om begäran har stöd för att ta emot trailerhuvuden.CheckTrailersAvailable()
– Avgör om begäran stöder släpvagnar och om de är tillgängliga för läsning.GetTrailer(string trailerName)
– Hämtar den begärda avslutande rubriken från svaret.
Orsak till ändringen
Trailers är en viktig funktion i scenarier som gRPC. Att slå samman trailers för att begära rubriker var förvirrande för användarna.
Rekommenderad åtgärd
Använd de släpvagnsrelaterade tilläggsmetoderna på HttpRequest
för att få åtkomst till släpvagnar.
Kategori
ASP.NET Core
Berörda API:er
Kestrel: Transportabstraktioner har tagits bort och offentliggjorts
Som en del av att flytta från "pubternal" API:er exponeras Kestrel-API:erna för transportskiktet som ett offentligt gränssnitt i Microsoft.AspNetCore.Connections.Abstractions
biblioteket.
Version introducerad
3,0
Gammalt beteende
- Transportrelaterade abstraktioner fanns tillgängliga i biblioteket
Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions
. - Egenskapen
ListenOptions.NoDelay
var tillgänglig.
Nytt beteende
- Gränssnittet
IConnectionListener
introducerades iMicrosoft.AspNetCore.Connections.Abstractions
biblioteket för att exponera de mest använda funktionerna från...Transport.Abstractions
biblioteket. NoDelay
Är nu tillgänglig i transportalternativ (LibuvTransportOptions
ochSocketTransportOptions
).SchedulingMode
är inte längre tillgängligt.
Orsak till ändringen
ASP.NET Core 3.0 har flyttats från "pubternal" API:er.
Rekommenderad åtgärd
Kategori
ASP.NET Core
Berörda API:er
Ingen
Lokalisering: ResourceManagerWithCultureStringLocalizer och WithCulture markerade som föråldrade
Klassen ResourceManagerWithCultureStringLocalizer och WithCulture-gränssnittsmedlemmen är ofta förvirringskällor för lokaliseringsanvändare, särskilt när de skapar en egen IStringLocalizer
implementering. Dessa objekt ger användaren intrycket att en IStringLocalizer
instans är "per språk, per resurs". I verkligheten bör instanserna bara vara "per resurs". Det språk som söks efter bestäms av CultureInfo.CurrentUICulture
vid körningstillfället. För att eliminera förvirringskällan har API:erna markerats som föråldrade i ASP.NET Core 3.0. API:erna tas bort i en framtida version.
Sammanhang finns i dotnet/aspnetcore#3324. Mer information finns i dotnet/aspnetcore#7756.
Version introducerad
3,0
Gammalt beteende
Metoderna har inte markerats som Obsolete
.
Nytt beteende
Metoderna är markerade Obsolete
.
Orsak till ändringen
API:erna representerade ett användningsfall som inte rekommenderas. Det rådde förvirring kring utformningen av lokaliseringen.
Rekommenderad åtgärd
Rekommendationen är att använda ResourceManagerStringLocalizer
i stället. Låt kulturen anges av CurrentCulture
. Om det inte är ett alternativ skapar och använder du en kopia av ResourceManagerWithCultureStringLocalizer.
Kategori
ASP.NET Core
Berörda API:er
Microsoft.Extensions.Localization.ResourceManagerWithCultureStringLocalizer
Microsoft.Extensions.Localization.ResourceManagerStringLocalizer.WithCulture
Loggning: DebugLogger-klassen har gjorts intern
Innan ASP.NET Core 3.0 DebugLogger
var public
åtkomstmodifieraren . I ASP.NET Core 3.0 ändrades åtkomstmodifieraren till internal
.
Version introducerad
3,0
Orsak till ändringen
Ändringen görs för att:
- Framtvinga konsekvens med andra loggningsimplementeringar, till exempel
ConsoleLogger
. - Minska API-ytan.
Rekommenderad åtgärd
AddDebug ILoggingBuilder
Använd tilläggsmetoden för att aktivera felsökningsloggning. DebugLoggerProvider är också fortfarande public
i händelse av att tjänsten måste registreras manuellt.
Kategori
ASP.NET Core
Berörda API:er
Microsoft.Extensions.Logging.Debug.DebugLogger
MVC: Async-suffix trimmat från kontrollantens åtgärdsnamn
Som en del av hanteringen av dotnet/aspnetcore#4849 trimmar ASP.NET Core MVC suffixet Async
från åtgärdsnamn som standard. Från och med ASP.NET Core 3.0 påverkar den här ändringen både routning och länkgenerering.
Version introducerad
3,0
Gammalt beteende
Överväg följande ASP.NET Core MVC-styrenhet:
public class ProductController : Controller
{
public async IActionResult ListAsync()
{
var model = await DbContext.Products.ToListAsync();
return View(model);
}
}
Åtgärden kan dirigeras via Product/ListAsync
. Länkgenerering kräver att du anger suffixet Async
. Till exempel:
<a asp-controller="Product" asp-action="ListAsync">List</a>
Nytt beteende
I ASP.NET Core 3.0 kan åtgärden dirigeras via Product/List
. Länkgenereringskoden bör utelämna suffixet Async
. Till exempel:
<a asp-controller="Product" asp-action="List">List</a>
Den här ändringen påverkar inte namn som anges med hjälp av attributet [ActionName]
. Det nya beteendet kan inaktiveras genom att ange MvcOptions.SuppressAsyncSuffixInActionNames
i false
Startup.ConfigureServices
:
services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});
Orsak till ändringen
Enligt konventionen är asynkrona .NET-metoder suffix med Async
. Men när en metod definierar en MVC-åtgärd är det inte önskvärt att använda suffixet Async
.
Rekommenderad åtgärd
Om din app är beroende av MVC-åtgärder som bevarar namnets Async
suffix väljer du någon av följande åtgärder:
- Använd attributet
[ActionName]
för att bevara det ursprungliga namnet. - Inaktivera namnbytet helt genom att ange
MvcOptions.SuppressAsyncSuffixInActionNames
iStartup.ConfigureServices
false
:
services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});
Kategori
ASP.NET Core
Berörda API:er
Ingen
MVC: JsonResult har flyttats till Microsoft.AspNetCore.Mvc.Core
JsonResult
har flyttats till Microsoft.AspNetCore.Mvc.Core
sammansättningen. Den här typen brukade definieras i Microsoft.AspNetCore.Mvc.Formatters.Json. Ett attribut på sammansättningsnivå [TypeForwardedTo] lades till för att Microsoft.AspNetCore.Mvc.Formatters.Json
åtgärda problemet för de flesta användare. Appar som använder bibliotek från tredje part kan stöta på problem.
Version introducerad
3.0 Förhandsversion 6
Gammalt beteende
En app som använder ett 2,2-baserat bibliotek har skapats.
Nytt beteende
En app som använder ett 2,2-baserat bibliotek misslyckas med kompilering. Ett fel som innehåller en variant av följande text anges:
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'
Ett exempel på ett sådant problem finns i dotnet/aspnetcore#7220.
Orsak till ändringen
Ändringar på plattformsnivå i sammansättningen av ASP.NET Core enligt beskrivningen i aspnet/Announcements#325.
Rekommenderad åtgärd
Bibliotek som kompilerats mot 2.2-versionen av Microsoft.AspNetCore.Mvc.Formatters.Json
kan behöva kompileras om för att lösa problemet för alla konsumenter. Kontakta biblioteksförfattaren om det påverkas. Begär omkompilering av biblioteket för att rikta in sig på ASP.NET Core 3.0.
Kategori
ASP.NET Core
Berörda API:er
Microsoft.AspNetCore.Mvc.JsonResult
MVC: Förkompileringsverktyget är inaktuellt
I ASP.NET Core 1.1 Microsoft.AspNetCore.Mvc.Razor.ViewCompilation
introducerades paketet (MVC-förkompileringsverktyget) för att lägga till stöd för publiceringstidskompilering av Razor-filer (.cshtml-filer ). I ASP.NET Core 2.1 introducerades Razor SDK för att utöka funktionerna i förkompileringsverktyget. Razor SDK har lagt till stöd för kompilering och publiceringstid av Razor-filer. SDK:t verifierar korrektheten i .cshtml-filer vid byggtiden och förbättrar starttiden för appen. Razor SDK är aktiverat som standard och ingen gest krävs för att börja använda det.
I ASP.NET Core 3.0 togs MVC-förkompileringsverktyget ASP.NET Core 1.1-eran bort. Tidigare paketversioner fortsätter att ta emot viktiga bugg- och säkerhetskorrigeringar i korrigeringsversionen.
Version introducerad
3,0
Gammalt beteende
Paketet Microsoft.AspNetCore.Mvc.Razor.ViewCompilation
användes för att förkompilera MVC Razor-vyer.
Nytt beteende
Razor SDK har inbyggt stöd för den här funktionen. Paketet Microsoft.AspNetCore.Mvc.Razor.ViewCompilation
uppdateras inte längre.
Orsak till ändringen
Razor SDK ger fler funktioner och verifierar korrektheten i .cshtml-filer vid byggtillfället. SDK:et förbättrar även appens starttid.
Rekommenderad åtgärd
För användare av ASP.NET Core 2.1 eller senare uppdaterar du för att använda det interna stödet för förkompilering i Razor SDK. Om buggar eller saknade funktioner förhindrar migrering till Razor SDK öppnar du ett problem på dotnet/aspnetcore.
Kategori
ASP.NET Core
Berörda API:er
Ingen
MVC: "Pubternal"-typer har ändrats till interna
I ASP.NET Core 3.0 uppdaterades alla "pubternal"-typer i MVC till antingen public
i ett namnområde som stöds eller internal
efter behov.
Ändra beskrivning
I ASP.NET Core deklareras "pubternal"-typer som public
men finns i ett .Internal
namnområde med -suffix. Även om dessa typer är public
har de ingen supportprincip och kan komma att ändras. Tyvärr har oavsiktlig användning av dessa typer varit vanligt, vilket resulterar i icke-bakåtkompatibla ändringar i dessa projekt och begränsar möjligheten att underhålla ramverket.
Version introducerad
3,0
Gammalt beteende
Vissa typer i MVC fanns public
bara i ett .Internal
namnområde. De här typerna hade ingen supportprincip och kan komma att ändras.
Nytt beteende
Alla sådana typer uppdateras antingen för att vara public
i ett namnområde som stöds eller markeras som internal
.
Orsak till ändringen
Oavsiktlig användning av "pubternal"-typerna har varit vanligt, vilket har resulterat i icke-bakåtkompatibla ändringar i dessa projekt och begränsar möjligheten att underhålla ramverket.
Rekommenderad åtgärd
Om du använder typer som har blivit verkligt public
och har flyttats till ett nytt namnområde som stöds uppdaterar du dina referenser så att de matchar de nya namnrymderna.
Om du använder typer som har markerats som internal
måste du hitta ett alternativ. De tidigare "pubternal"-typerna stöddes aldrig för offentligt bruk. Om det finns specifika typer i dessa namnområden som är viktiga för dina appar kan du skicka ett problem till dotnet/aspnetcore. Överväganden kan göras för att göra de begärda typerna public
.
Kategori
ASP.NET Core
Berörda API:er
Den här ändringen innehåller typer i följande namnområden:
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: Kompatibilitetsshim för webb-API har tagits bort
Från och med ASP.NET Core 3.0 Microsoft.AspNetCore.Mvc.WebApiCompatShim
är paketet inte längre tillgängligt.
Ändra beskrivning
Microsoft.AspNetCore.Mvc.WebApiCompatShim
Paketet (WebApiCompatShim) ger partiell kompatibilitet i ASP.NET Core med ASP.NET 4.x Web API 2 för att förenkla migreringen av befintliga webb-API-implementeringar till ASP.NET Core. Appar som använder WebApiCompatShim drar dock inte nytta av API-relaterade funktioner som levereras i de senaste ASP.NET Core-versionerna. Sådana funktioner omfattar förbättrad generering av Open API-specifikation, standardiserad felhantering och generering av klientkod. WebApiCompatShim togs bort för att bättre fokusera API-insatserna i 3.0. Befintliga appar som använder WebApiCompatShim ska migreras till den nyare [ApiController]
modellen.
Version introducerad
3,0
Orsak till ändringen
Webb-API-kompatibilitetsshim var ett migreringsverktyg. Det begränsar användaråtkomsten till nya funktioner som läggs till i ASP.NET Core.
Rekommenderad åtgärd
Ta bort användningen av denna shim och migrera direkt till liknande funktioner i själva ASP.NET Core.
Kategori
ASP.NET Core
Berörda API:er
Microsoft.AspNetCore.Mvc.WebApiCompatShim
Razor: RazorTemplateEngine API har tagits bort
API:et RazorTemplateEngine
har tagits bort och ersatts med Microsoft.AspNetCore.Razor.Language.RazorProjectEngine
.
Mer information finns i GitHub-problem med dotnet/aspnetcore#25215.
Version introducerad
3,0
Gammalt beteende
En mallmotor kan skapas och användas för att parsa och generera kod för Razor-filer.
Nytt beteende
RazorProjectEngine
kan skapas och tillhandahålla samma typ av information som RazorTemplateEngine
för att parsa och generera kod för Razor-filer. RazorProjectEngine
ger också extra konfigurationsnivåer.
Orsak till ändringen
RazorTemplateEngine
var alltför nära kopplat till de befintliga implementeringarna. Den här snäva kopplingen ledde till fler frågor när du försökte konfigurera en Razor-parsnings-/generationspipeline korrekt.
Rekommenderad åtgärd
Använd RazorProjectEngine
i stället för RazorTemplateEngine
. Tänk på följande exempel.
Skapa och konfigurera RazorProjectEngine
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
});
Generera kod för en Razor-fil
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();
Kategori
ASP.NET Core
Berörda API:er
RazorTemplateEngine
RazorTemplateEngineOptions
Razor: Runtime-kompilering har flyttats till ett paket
Stöd för körningskompilering av Razor-vyer och Razor Pages har flyttats till ett separat paket.
Version introducerad
3,0
Gammalt beteende
Runtime-kompilering är tillgängligt utan att behöva ytterligare paket.
Nytt beteende
Funktionen har flyttats till paketet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation .
Följande API:er var tidigare tillgängliga för Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions
att stödja körningskompilering. API:erna är nu tillgängliga via Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.MvcRazorRuntimeCompilationOptions
.
RazorViewEngineOptions.FileProviders
är nuMvcRazorRuntimeCompilationOptions.FileProviders
RazorViewEngineOptions.AdditionalCompilationReferences
är nuMvcRazorRuntimeCompilationOptions.AdditionalReferencePaths
Dessutom Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions.AllowRecompilingViewsOnFileChange
har tagits bort. Omkompilering av filändringar aktiveras som standard genom att Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
referera till paketet.
Orsak till ändringen
Den här ändringen var nödvändig för att ta bort det delade ASP.NET Core-ramverksberoendet för Roslyn.
Rekommenderad åtgärd
Appar som kräver körningskompilering eller omkompilering av Razor-filer bör utföra följande steg:
Lägg till en referens till
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
paketet.Uppdatera projektets
Startup.ConfigureServices
metod så att den innehåller ett anrop tillAddRazorRuntimeCompilation
. Till exempel:services.AddMvc() .AddRazorRuntimeCompilation();
Kategori
ASP.NET Core
Berörda API:er
Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions
Sessionstillstånd: Föråldrade API:er har tagits bort
Föråldrade API:er för att konfigurera sessionscookies har tagits bort. Mer information finns i aspnet/Announcements#257.
Version introducerad
3,0
Orsak till ändringen
Den här ändringen tillämpar konsekvens mellan API:er för att konfigurera funktioner som använder cookies.
Rekommenderad åtgärd
Migrera användningen av de borttagna API:erna till deras nyare ersättningar. Överväg följande exempel i 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;
});
}
Kategori
ASP.NET Core
Berörda API:er
- 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
Delat ramverk: Sammansättningar som tagits bort från Microsoft.AspNetCore.App
Från och med ASP.NET Core 3.0 innehåller det delade ASP.NET Core-ramverket (Microsoft.AspNetCore.App
) endast sammansättningar från första part som är fullt utvecklade, stöds och kan användas av Microsoft.
Ändra beskrivning
Tänk på förändringen som omdefiniering av gränser för ASP.NET Core"-plattformen. Det delade ramverket kan skapas av vem som helst via GitHub och fortsätter att erbjuda de befintliga fördelarna med delade .NET Core-ramverk till dina appar. Vissa fördelar är mindre distributionsstorlek, centraliserad korrigering och snabbare starttid.
Som en del av ändringen introduceras några viktiga icke-bakåtkompatibla ändringar i Microsoft.AspNetCore.App
.
Version introducerad
3,0
Gammalt beteende
Projekt som refereras Microsoft.AspNetCore.App
via ett <PackageReference>
element i projektfilen.
Dessutom Microsoft.AspNetCore.App
innehöll följande underkomponenter:
- Json.NET (
Newtonsoft.Json
) - Entity Framework Core (sammansättningar med prefixet
Microsoft.EntityFrameworkCore.
) - Roslyn (
Microsoft.CodeAnalysis
)
Nytt beteende
En referens till Microsoft.AspNetCore.App
kräver inte längre ett <PackageReference>
element i projektfilen. .NET Core SDK stöder ett nytt element med namnet <FrameworkReference>
, som ersätter användningen av <PackageReference>
.
Mer information finns i dotnet/aspnetcore#3612.
Entity Framework Core levereras som NuGet-paket. Den här ändringen justerar leveransmodellen med alla andra dataåtkomstbibliotek på .NET. Det ger Entity Framework Core den enklaste vägen för att fortsätta att förnya samtidigt som du stöder de olika .NET-plattformarna. Flytten av Entity Framework Core från det delade ramverket påverkar inte dess status som ett Microsoft-utvecklat, stödt och användbart bibliotek. .NET Core-supportprincipen fortsätter att täcka den.
Json.NET och Entity Framework Core fortsätter att arbeta med ASP.NET Core. De kommer dock inte att ingå i det delade ramverket.
Mer information finns i Framtiden för JSON i .NET Core 3.0. Se även den fullständiga listan över binärfiler som tagits bort från det delade ramverket.
Orsak till ändringen
Den här ändringen förenklar förbrukningen av Microsoft.AspNetCore.App
och minskar dupliceringen mellan NuGet-paket och delade ramverk.
Mer information om motivationen för den här ändringen finns i det här blogginlägget.
Rekommenderad åtgärd
Från och med ASP.NET Core 3.0 är det inte längre nödvändigt för projekt att använda sammansättningar i Microsoft.AspNetCore.App
som NuGet-paket. För att förenkla mål och användning av det delade ASP.NET Core-ramverket levereras många NuGet-paket eftersom ASP.NET Core 1.0 inte längre produceras. DE API:er som paketen tillhandahåller är fortfarande tillgängliga för appar med hjälp av till <FrameworkReference>
Microsoft.AspNetCore.App
. Vanliga API-exempel är Kestrel, MVC och Razor.
Den här ändringen gäller inte för alla binärfiler som refereras via Microsoft.AspNetCore.App
i ASP.NET Core 2.x. Några viktiga undantag är:
Microsoft.Extensions
bibliotek som fortsätter att rikta in sig på .NET Standard är tillgängliga som NuGet-paket (se https://github.com/dotnet/extensions).- API:er som produceras av ASP.NET Core-teamet som inte ingår
Microsoft.AspNetCore.App
i . Följande komponenter är till exempel tillgängliga som NuGet-paket:- Entity Framework Core
- API:er som tillhandahåller integrering från tredje part
- Experimentella funktioner
- API:er med beroenden som inte kunde uppfylla kraven för att vara i det delade ramverket
- Tillägg till MVC som har stöd för Json.NET. Ett API tillhandahålls som ett NuGet-paket för att stödja med hjälp av Json.NET och MVC. Mer information finns i migreringsguiden för ASP.NET Core.
- SignalR .NET-klienten fortsätter att stödja .NET Standard och levereras som ett NuGet-paket. Den är avsedd för användning på många .NET-körningar, till exempel Xamarin och UWP.
Mer information finns i Sluta producera paket för delade ramverkssammansättningar i 3.0. Mer information finns i dotnet/aspnetcore#3757.
Kategori
ASP.NET Core
Berörda API:er
Delat ramverk: Microsoft.AspNetCore.All har tagits bort
Från och med ASP.NET Core 3.0 Microsoft.AspNetCore.All
skapas inte längre metapaketet och det matchande Microsoft.AspNetCore.All
delade ramverket. Det här paketet är tillgängligt i ASP.NET Core 2.2 och fortsätter att ta emot underhållsuppdateringar i ASP.NET Core 2.1.
Version introducerad
3,0
Gammalt beteende
Appar kan använda Microsoft.AspNetCore.All
metapaketet för att rikta in sig på det delade ramverket Microsoft.AspNetCore.All
på .NET Core.
Nytt beteende
.NET Core 3.0 innehåller Microsoft.AspNetCore.All
inget delat ramverk.
Orsak till ändringen
Metapaketet Microsoft.AspNetCore.All
innehöll ett stort antal externa beroenden.
Rekommenderad åtgärd
Migrera ditt projekt för att använda ramverket Microsoft.AspNetCore.App
. Komponenter som tidigare var tillgängliga i Microsoft.AspNetCore.All
är fortfarande tillgängliga på NuGet. Dessa komponenter distribueras nu med din app i stället för att ingå i det delade ramverket.
Kategori
ASP.NET Core
Berörda API:er
Ingen
SignalR: HandshakeProtocol.SuccessHandshakeData ersatt
Fältet HandshakeProtocol.SuccessHandshakeData togs bort och ersattes med en hjälpmetod som genererar ett lyckat handskakningssvar med en specifik IHubProtocol
.
Version introducerad
3,0
Gammalt beteende
HandshakeProtocol.SuccessHandshakeData
var ett public static ReadOnlyMemory<byte>
fält.
Nytt beteende
HandshakeProtocol.SuccessHandshakeData
har ersatts av en static
GetSuccessfulHandshake(IHubProtocol protocol)
metod som returnerar en ReadOnlyMemory<byte>
baserad på det angivna protokollet.
Orsak till ändringen
Ytterligare fält lades till i handskakningssvaret som inte är konstanta och ändras beroende på det valda protokollet.
Rekommenderad åtgärd
Inga. Den här typen är inte avsedd för användning från användarkod. Det är public
, så det kan delas mellan SignalR-servern och klienten. Det kan också användas av kundens SignalR-klienter som skrivits i .NET. Användare av SignalR bör inte påverkas av den här ändringen.
Kategori
ASP.NET Core
Berörda API:er
HandshakeProtocol.SuccessHandshakeData
SignalR: Metoderna HubConnection ResetSendPing och ResetTimeout har tagits bort
Metoderna ResetSendPing
och ResetTimeout
togs bort från SignalR-API HubConnection
:et. Dessa metoder var ursprungligen endast avsedda för internt bruk men offentliggjordes i ASP.NET Core 2.2. De här metoderna är inte tillgängliga från och med ASP.NET Core 3.0 Preview 4-versionen. Mer information finns i dotnet/aspnetcore#8543.
Version introducerad
3,0
Gammalt beteende
API:er var tillgängliga.
Nytt beteende
API:er tas bort.
Orsak till ändringen
Dessa metoder var ursprungligen endast avsedda för internt bruk men offentliggjordes i ASP.NET Core 2.2.
Rekommenderad åtgärd
Använd inte dessa metoder.
Kategori
ASP.NET Core
Berörda API:er
SignalR: HubConnectionContext-konstruktorer har ändrats
SignalR:s konstruktorer ändrades för att acceptera en alternativtyp, snarare än flera parametrar, till framtidssäkra HubConnectionContext
tilläggsalternativ. Den här ändringen ersätter två konstruktorer med en enda konstruktor som accepterar en alternativtyp.
Version introducerad
3,0
Gammalt beteende
HubConnectionContext
har två konstruktorer:
public HubConnectionContext(ConnectionContext connectionContext, TimeSpan keepAliveInterval, ILoggerFactory loggerFactory);
public HubConnectionContext(ConnectionContext connectionContext, TimeSpan keepAliveInterval, ILoggerFactory loggerFactory, TimeSpan clientTimeoutInterval);
Nytt beteende
De två konstruktorerna togs bort och ersattes med en konstruktor:
public HubConnectionContext(ConnectionContext connectionContext, HubConnectionContextOptions contextOptions, ILoggerFactory loggerFactory)
Orsak till ändringen
Den nya konstruktorn använder ett nytt alternativobjekt. Därför kan funktionerna HubConnectionContext
i utökas i framtiden utan att göra fler konstruktorer och icke-bakåtkompatibla ändringar.
Rekommenderad åtgärd
I stället för att använda följande konstruktor:
HubConnectionContext connectionContext = new HubConnectionContext(
connectionContext,
keepAliveInterval: TimeSpan.FromSeconds(15),
loggerFactory,
clientTimeoutInterval: TimeSpan.FromSeconds(15));
Använd följande konstruktor:
HubConnectionContextOptions contextOptions = new HubConnectionContextOptions()
{
KeepAliveInterval = TimeSpan.FromSeconds(15),
ClientTimeoutInterval = TimeSpan.FromSeconds(15)
};
HubConnectionContext connectionContext = new HubConnectionContext(connectionContext, contextOptions, loggerFactory);
Kategori
ASP.NET Core
Berörda API:er
- HubConnectionContext(ConnectionContext, TimeSpan, ILoggerFactory)
- HubConnectionContext(ConnectionContext, TimeSpan, ILoggerFactory, TimeSpan)
SignalR: JavaScript-klientpaketets namn har ändrats
I ASP.NET Core 3.0 Preview 7 ändrades SignalR JavaScript-klientpaketnamnet från @aspnet/signalr
till @microsoft/signalr
. Namnändringen återspeglar det faktum att SignalR är användbart i mer än bara ASP.NET Core-appar, tack vare Azure SignalR Service.
Om du vill reagera på den här ändringen ändrar du referenser i dina package.json-filer , require
-instruktioner och ECMAScript-instruktioner import
. Inget API ändras som en del av detta namnbyte.
Mer information finns i dotnet/aspnetcore#11637.
Version introducerad
3,0
Gammalt beteende
Klientpaketet hette @aspnet/signalr
.
Nytt beteende
Klientpaketet heter @microsoft/signalr
.
Orsak till ändringen
Namnändringen klargör att SignalR är användbart utöver ASP.NET Core-appar, tack vare Azure SignalR Service.
Rekommenderad åtgärd
Växla till det nya paketet @microsoft/signalr
.
Kategori
ASP.NET Core
Berörda API:er
Ingen
SignalR: UseSignalR- och UseConnections-metoder markerade som föråldrade
Metoderna UseConnections
och UseSignalR
klasserna ConnectionsRouteBuilder
och HubRouteBuilder
markeras som föråldrade i ASP.NET Core 3.0.
Version introducerad
3,0
Gammalt beteende
SignalR Hub-routning har konfigurerats med eller UseSignalR
UseConnections
.
Nytt beteende
Det gamla sättet att konfigurera routning har föråldrats och ersatts med slutpunktsroutning.
Orsak till ändringen
Mellanprogram flyttas till det nya slutpunktsdirigeringssystemet. Det gamla sättet att lägga till mellanprogram är föråldrat.
Rekommenderad åtgärd
Ersätt UseSignalR
med UseEndpoints
:
Gammal kod:
app.UseSignalR(routes =>
{
routes.MapHub<SomeHub>("/path");
});
Ny kod:
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<SomeHub>("/path");
});
Kategori
ASP.NET Core
Berörda API:er
- 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
SPA: SpaServices och NodeServices har markerats som föråldrade
Innehållet i följande NuGet-paket har varit onödigt sedan ASP.NET Core 2.1. Därför markeras följande paket som föråldrade:
Av samma anledning markeras följande npm-moduler som inaktuella:
De föregående paketen och npm-modulerna tas senare bort i .NET 5.
Version introducerad
3,0
Gammalt beteende
De inaktuella paketen och npm-modulerna var avsedda att integrera ASP.NET Core med olika spa-ramverk (Single Page App). Sådana ramverk omfattar Angular, React och React med Redux.
Nytt beteende
Det finns en ny integrationsmekanism i NuGet-paketet Microsoft.AspNetCore.SpaServices.Extensions . Paketet är fortfarande grunden för Angular- och React-projektmallarna sedan ASP.NET Core 2.1.
Orsak till ändringen
ASP.NET Core stöder integrering med olika spa-ramverk (Single Page App), inklusive Angular, React och React med Redux. Till en början genomfördes integrering med dessa ramverk med ASP.NET Core-specifika komponenter som hanterade scenarier som förrendering på serversidan och integrering med Webpack. Med tiden förändrades branschstandarderna. Var och en av SPA-ramverken släppte sina egna standardkommandoradsgränssnitt. Till exempel Angular CLI och create-react-app.
När ASP.NET Core 2.1 släpptes i maj 2018 svarade teamet på ändringen av standarder. Ett nyare och enklare sätt att integrera med SPA-ramverkens egna verktygskedjor tillhandahölls. Den nya integreringsmekanismen finns i paketet Microsoft.AspNetCore.SpaServices.Extensions
och ligger fortfarande till grund för Angular- och React-projektmallarna sedan ASP.NET Core 2.1.
För att klargöra att de äldre ASP.NET Core-specifika komponenterna är irrelevanta och inte rekommenderas:
- Integreringsmekanismen före 2.1 är markerad som föråldrad.
- De stödda npm-paketen markeras som inaktuella.
Rekommenderad åtgärd
Om du använder de här paketen uppdaterar du dina appar så att de använder funktionerna:
- I paketet
Microsoft.AspNetCore.SpaServices.Extensions
. - Tillhandahålls av SPA-ramverken som du använder
Information om hur du aktiverar funktioner som prerendering på serversidan och frekvent modulinläsning finns i dokumentationen för motsvarande SPA-ramverk. Funktionerna i Microsoft.AspNetCore.SpaServices.Extensions
är inte föråldrade och kommer att fortsätta att stödjas.
Kategori
ASP.NET Core
Berörda API:er
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
SPA: SpaServices och NodeServices återgår inte längre till konsolloggaren
Microsoft.AspNetCore.SpaServices och Microsoft.AspNetCore.NodeServices visar inte konsolloggar om inte loggningen har konfigurerats.
Version introducerad
3,0
Gammalt beteende
Microsoft.AspNetCore.SpaServices
och Microsoft.AspNetCore.NodeServices
används för att automatiskt skapa en konsolloggare när loggningen inte har konfigurerats.
Nytt beteende
Microsoft.AspNetCore.SpaServices
och Microsoft.AspNetCore.NodeServices
visar inte konsolloggar om inte loggningen har konfigurerats.
Orsak till ändringen
Det finns ett behov av att anpassa sig till hur andra ASP.NET Core-paket implementerar loggning.
Rekommenderad åtgärd
Om det gamla beteendet krävs lägger du till services.AddLogging(builder => builder.AddConsole())
i din Setup.ConfigureServices
metod för att konfigurera konsolloggning.
Kategori
ASP.NET Core
Berörda API:er
Ingen
Målramverk: .NET Framework-stöd har tagits bort
Från och med ASP.NET Core 3.0 är .NET Framework ett målramverk som inte stöds.
Ändra beskrivning
.NET Framework 4.8 är den sista huvudversionen av .NET Framework. Nya ASP.NET Core-appar bör byggas på .NET Core. Från och med .NET Core 3.0-versionen kan du se ASP.NET Core 3.0 som en del av .NET Core.
Kunder som använder ASP.NET Core med .NET Framework kan fortsätta på ett sätt som stöds fullt ut med hjälp av 2.1 LTS-versionen. Support och service för 2.1 fortsätter till åtminstone den 21 augusti 2021. Det här datumet är tre år efter deklarationen av LTS-versionen enligt .NET-supportpolicyn. Stödet för ASP.NET Core 2.1-paket på .NET Framework utökas på obestämd tid, ungefär som serviceprincipen för andra paketbaserade ASP.NET ramverk.
Mer information om portning från .NET Framework till .NET Core finns i Portning till .NET Core.
Microsoft.Extensions
paket (till exempel loggning, beroendeinmatning och konfiguration) och Entity Framework Core påverkas inte. De fortsätter att stödja .NET Standard.
Mer information om motivationen för den här ändringen finns i det ursprungliga blogginlägget.
Version introducerad
3,0
Gammalt beteende
ASP.NET Core-appar kan köras på .NET Core eller .NET Framework.
Nytt beteende
ASP.NET Core-appar kan bara köras på .NET Core.
Rekommenderad åtgärd
Välj en av följande åtgärder:
- Håll appen på ASP.NET Core 2.1.
- Migrera din app och dina beroenden till .NET Core.
Kategori
ASP.NET Core
Berörda API:er
Ingen
Core .NET-bibliotek
- API:er som rapportversionen nu rapporterar produkt och inte filversion
- Anpassade EncoderFallbackBuffer-instanser kan inte rekursivt falla tillbaka
- Ändring av flyttalsformatering och parsningsbeteende
- Flyttalsparsningsåtgärder misslyckas inte längre eller utlöser en OverflowException
- InvalidAsynchronousStateException har flyttats till en annan sammansättning
- Ersätta illa utformade UTF-8 byte-sekvenser följer Unicode-riktlinjerna
- TypeDescriptionProviderAttribute har flyttats till en annan sammansättning
- ZipArchiveEntry hanterar inte längre arkiv med inkonsekventa inmatningsstorlekar
- FieldInfo.SetValue genererar undantag för statiska fält med endast init
- Att skicka GroupCollection till tilläggsmetoder som tar IEnumerable<T> kräver tvetydighet
API:er som rapportversionen nu rapporterar produkt och inte filversion
Många av de API:er som returnerar versioner i .NET Core returnerar nu produktversionen i stället för filversionen.
Ändra beskrivning
I .NET Core 2.2 och tidigare versioner återspeglar metoder som Environment.Version, RuntimeInformation.FrameworkDescriptionoch dialogrutan filegenskaper för .NET Core-sammansättningar filversionen. Från och med .NET Core 3.0 återspeglar de produktversionen.
Följande bild illustrerar skillnaden i versionsinformation för System.Runtime.dll sammansättning för .NET Core 2.2 (till vänster) och .NET Core 3.0 (till höger) som visas i dialogrutan Filegenskaper för Utforskaren i Windows.
Version introducerad
3,0
Rekommenderad åtgärd
Inga. Den här ändringen bör göra versionsidentifiering intuitiv i stället för obtuse.
Kategori
Core .NET-bibliotek
Berörda API:er
Anpassade EncoderFallbackBuffer-instanser kan inte rekursivt falla tillbaka
Anpassade EncoderFallbackBuffer instanser kan inte falla tillbaka rekursivt. Implementeringen av EncoderFallbackBuffer.GetNextChar() måste resultera i en teckensekvens som kan konverteras till målkodningen. Annars inträffar ett undantag.
Ändra beskrivning
Under en transkodningsåtgärd mellan tecken och byte identifierar körningen felaktiga eller icke-konvertible UTF-16-sekvenser och tillhandahåller dessa tecken till EncoderFallbackBuffer.Fallback metoden. Metoden Fallback
avgör vilka tecken som ska ersättas med de ursprungliga icke-konvertible data och dessa tecken töms genom att anropa EncoderFallbackBuffer.GetNextChar i en loop.
Körningen försöker sedan omkoda dessa ersättningstecken till målkodningen. Om den här åtgärden lyckas fortsätter körningen att omkodas från den plats där den slutade i den ursprungliga indatasträngen.
Tidigare kan anpassade implementeringar av EncoderFallbackBuffer.GetNextChar() returnera teckensekvenser som inte kan konverteras till målkodningen. Om de ersatta tecknen inte kan omkodas till målkodningen anropar körningen EncoderFallbackBuffer.Fallback metoden igen med ersättningstecken och förväntar sig EncoderFallbackBuffer.GetNextChar() att metoden returnerar en ny ersättningssekvens. Den här processen fortsätter tills körningen slutligen ser en välformulerad, konvertibel ersättning eller tills ett maximalt antal rekursioner har uppnåtts.
Från och med .NET Core 3.0 måste anpassade implementeringar av EncoderFallbackBuffer.GetNextChar() returnera teckensekvenser som kan konverteras till målkodningen. Om de ersatta tecknen inte kan omkodas till målkodningen genereras en ArgumentException . Körningen gör inte längre rekursiva anrop till instansen EncoderFallbackBuffer .
Det här beteendet gäller endast när alla tre av följande villkor uppfylls:
- Körningen identifierar en felaktig UTF-16-sekvens eller en UTF-16-sekvens som inte kan konverteras till målkodningen.
- En anpassad EncoderFallback har angetts.
- De anpassade EncoderFallback försöken att ersätta en ny felaktig eller icke-konverterbar UTF-16-sekvens.
Version introducerad
3,0
Rekommenderad åtgärd
De flesta utvecklare behöver inte vidta några åtgärder.
Om ett program använder en anpassad EncoderFallback och EncoderFallbackBuffer klass kontrollerar du att implementeringen av EncoderFallbackBuffer.Fallback fyller reservbufferten med välformulerade UTF-16-data som är direkt konvertibla till målkodningen när Fallback metoden först anropas av körningen.
Kategori
Core .NET-bibliotek
Berörda API:er
Flyttalsformatering och parsningsbeteende har ändrats
Flyttalsparsning och formateringsbeteende (efter typer) Double Single är nu IEEE-kompatibla. Detta säkerställer att beteendet för flyttalstyper i .NET matchar andra IEEE-kompatibla språk. Ska till exempel double.Parse("SomeLiteral")
alltid matcha vad C# producerar för double x = SomeLiteral
.
Ändra beskrivning
I .NET Core 2.2 och tidigare versioner formaterar du med Double.ToString och Single.ToString, och parsar med Double.Parse, Double.TryParse, Single.Parseoch Single.TryParse är inte IEEE-kompatibla. Därför är det omöjligt att garantera att ett värde tur och retur med någon standard- eller anpassad formatsträng som stöds. För vissa indata kan försöket att parsa ett formaterat värde misslyckas, och för andra är det parsade värdet inte lika med det ursprungliga värdet.
Från och med .NET Core 3.0 är flyttalsparsning och formateringsåtgärder IEEE 754-kompatibla.
I följande tabell visas två kodfragment och hur utdata ändras mellan .NET Core 2.2 och .NET Core 3.1.
Kodstycke | Utdata på .NET Core 2.2 | Utdata på .NET Core 3.1 |
---|---|---|
Console.WriteLine((-0.0).ToString()); |
0 | 0– |
var value = -3.123456789123456789; Console.WriteLine(value == double.Parse(value.ToString())); |
False |
True |
Mer information finns i förbättringarna av flyttalsparsning och formatering i blogginlägget .NET Core 3.0 .
Version introducerad
3,0
Rekommenderad åtgärd
Avsnittet Potentiell påverkan på befintlig kod i förbättringarna av flyttalsparsning och formatering i blogginlägget .NET Core 3.0 föreslår vissa ändringar som du kan göra i koden om du vill behålla det tidigare beteendet.
- För vissa skillnader i formatering kan du få ett beteende som motsvarar det tidigare beteendet genom att ange en annan formatsträng.
- För skillnader i parsning finns det ingen mekanism för att återgå till det tidigare beteendet.
Kategori
Core .NET-bibliotek
Berörda API:er
Flyttalsparsningsåtgärder misslyckas inte längre eller utlöser en OverflowException
De flyttalsparsningsmetoderna genererar inte längre en OverflowException eller returnerar false
när de parsar en sträng vars numeriska värde ligger utanför intervallet Single för eller Double flyttalstypen.
Ändra beskrivning
I .NET Core 2.2 och tidigare versioner Double.Parse genererar metoderna och Single.Parse en OverflowException för värden som ligger utanför intervallet för respektive typ. Metoderna Double.TryParse och Single.TryParse returnerar false
för strängrepresentationer av numeriska värden som inte ligger inom intervallet.
Från och med .NET Core 3.0 Double.Parsemisslyckas inte längre metoderna , Double.TryParse, Single.Parseoch Single.TryParse när du parsar numeriska strängar som inte är inom intervallet. Double I stället returnerar Double.PositiveInfinity parsningsmetoderna för värden som överskrider Double.MaxValue, och de returnerar Double.NegativeInfinity för värden som är mindre än Double.MinValue. På samma sätt returnerar parsningsmetoderna Single för värden som överskrider Single.MaxValue, och de returnerar Single.NegativeInfinity för värden som är mindre än Single.MinValue.Single.PositiveInfinity
Den här ändringen gjordes för förbättrad IEEE 754:2008-efterlevnad.
Version introducerad
3,0
Rekommenderad åtgärd
Den här ändringen kan påverka koden på något av två sätt:
Din kod är beroende av hanteraren för OverflowException att köra när ett spill uppstår. I det här fallet bör du ta bort -instruktionen
catch
och placera nödvändig kod i enIf
-instruktion som testar om Double.IsInfinity eller Single.IsInfinity ärtrue
.Koden förutsätter att flyttalsvärdena inte
Infinity
är . I det här fallet bör du lägga till nödvändig kod för att söka efter flyttalsvärdenPositiveInfinity
för ochNegativeInfinity
.
Kategori
Core .NET-bibliotek
Berörda API:er
InvalidAsynchronousStateException har flyttats till en annan sammansättning
Klassen InvalidAsynchronousStateException har flyttats.
Ändra beskrivning
I .NET Core 2.2 och tidigare versioner InvalidAsynchronousStateException finns klassen i sammansättningen System.ComponentModel.TypeConverter .
Från och med .NET Core 3.0 finns den i sammansättningen System.ComponentModel.Primitives .
Version introducerad
3,0
Rekommenderad åtgärd
Den här ändringen påverkar endast program som använder reflektion för att läsa in InvalidAsynchronousStateException genom att anropa en metod, till exempel Assembly.GetType eller en överlagring av Activator.CreateInstance som förutsätter att typen finns i en viss sammansättning. I så fall uppdaterar du sammansättningen som refereras i metodanropet så att den återspeglar typens nya sammansättningsplats.
Kategori
Core .NET-bibliotek
Berörda API:er
Inga.
Ersätta illa utformade UTF-8 byte-sekvenser följer Unicode-riktlinjerna
UTF8Encoding När klassen stöter på en illa utformad UTF-8 byte-sekvens under en byte-till-tecken-transkodningsåtgärd ersätter den sekvensen med tecknet U+FFFD REPLACEMENT CHARACTER i utdatasträngen. .NET Core 3.0 skiljer sig från tidigare versioner av .NET Core och .NET Framework genom att följa unicode-metoden för att utföra den här ersättningen under omkodningsåtgärden.
Detta är en del av ett större arbete för att förbättra UTF-8-hanteringen i hela .NET, inklusive av de nya System.Text.Unicode.Utf8 och System.Text.Rune typerna. Typen UTF8Encoding fick förbättrad felhanteringsmekanik så att den ger utdata som överensstämmer med de nyligen introducerade typerna.
Ändra beskrivning
Från och med .NET Core 3.0, när byte överkodas till tecken, UTF8Encoding utför klassen teckenersättning baserat på Metodtips för Unicode. Ersättningsmekanismen som används beskrivs av Unicode Standard, version 12.0, s. 3.9 (PDF) i rubriken U+FFFD Substitution of Maximal Subparts.
Det här beteendet gäller endast när indatabytesekvensen innehåller oformaterad UTF-8-data. Om instansen UTF8Encoding har konstruerats med throwOnInvalidBytes: true
fortsätter instansen UTF8Encoding
dessutom att generera ogiltiga indata i stället för att utföra U+FFFD-ersättning. Mer information om konstruktorn finns i UTF8Encoding
UTF8Encoding(Boolean, Boolean).
I följande tabell visas effekten av den här ändringen med ogiltiga indata på 3 byte:
Felaktig 3-bytesinmatning | Utdata före .NET Core 3.0 | Utdata som börjar med .NET Core 3.0 |
---|---|---|
[ ED A0 90 ] |
[ FFFD FFFD ] (utdata med 2 tecken) |
[ FFFD FFFD FFFD ] (utdata med 3 tecken) |
3-teckensutdata är de önskade utdata, enligt tabell 3-9 i den tidigare länkade Unicode Standard PDF.
Version introducerad
3,0
Rekommenderad åtgärd
Ingen åtgärd krävs från utvecklarens sida.
Kategori
Core .NET-bibliotek
Berörda API:er
TypeDescriptionProviderAttribute har flyttats till en annan sammansättning
Klassen TypeDescriptionProviderAttribute har flyttats.
Ändra beskrivning
I .NET Core 2.2 och tidigare versioner TypeDescriptionProviderAttribute finns klassen i sammansättningen System.ComponentModel.TypeConverter .
Från och med .NET Core 3.0 finns den i sammansättningen System.ObjectModel .
Version introducerad
3,0
Rekommenderad åtgärd
Den här ändringen påverkar endast program som använder reflektion för att läsa in TypeDescriptionProviderAttribute typen genom att anropa en metod, till exempel Assembly.GetType eller en överlagring av Activator.CreateInstance som förutsätter att typen finns i en viss sammansättning. I så fall bör sammansättningen som refereras i metodanropet uppdateras för att återspegla typens nya sammansättningsplats.
Kategori
Windows Forms
Berörda API:er
Inga.
ZipArchiveEntry hanterar inte längre arkiv med inkonsekventa inmatningsstorlekar
Zip-arkiv visar både komprimerad storlek och okomprimerad storlek i den centrala katalogen och det lokala huvudet. Själva inmatningsdata anger också dess storlek. I .NET Core 2.2 och tidigare versioner kontrollerades aldrig dessa värden för konsekvens. Från och med .NET Core 3.0 är de nu det.
Ändra beskrivning
I .NET Core 2.2 och tidigare versioner ZipArchiveEntry.Open() lyckas även om det lokala huvudet inte håller med det centrala huvudet i zip-filen. Data dekomprimeras tills slutet av den komprimerade dataströmmen har nåtts, även om dess längd överskrider den okomprimerade filstorleken som anges i den centrala katalogen/det lokala huvudet.
Från och med .NET Core 3.0 ZipArchiveEntry.Open() kontrollerar metoden att det lokala huvudet och det centrala huvudet är överens om komprimerade och okomprimerade storlekar på en post. Om de inte gör det genererar metoden en InvalidDataException om-arkivets lokala huvud- och/eller databeskrivningsliststorlekar som inte överensstämmer med zip-filens centrala katalog. När du läser en post trunkeras dekomprimerade data till den okomprimerade filstorlek som anges i rubriken.
Den här ändringen gjordes för att säkerställa att en ZipArchiveEntry korrekt representerar storleken på dess data och att endast den mängden data läss.
Version introducerad
3,0
Rekommenderad åtgärd
Packa om alla zip-arkiv som uppvisar dessa problem.
Kategori
Core .NET-bibliotek
Berörda API:er
- ZipArchiveEntry.Open()
- ZipFileExtensions.ExtractToDirectory
- ZipFileExtensions.ExtractToFile
- ZipFile.ExtractToDirectory
FieldInfo.SetValue genererar undantag för statiska fält med endast init
Från och med .NET Core 3.0 utlöses ett undantag när du försöker ange ett värde för ett statiskt InitOnly fält genom att anropa System.Reflection.FieldInfo.SetValue.
Ändra beskrivning
I .NET Framework och versioner av .NET Core före 3.0 kan du ange värdet för ett statiskt fält som är konstant när det har initierats (skrivskyddat i C#) genom att anropa System.Reflection.FieldInfo.SetValue. Att ange ett sådant fält på det här sättet resulterade dock i oförutsägbart beteende baserat på målramverket och optimeringsinställningarna.
När du anropar SetValue ett statiskt InitOnly fält i .NET Core 3.0 och senare versioner genereras ett System.FieldAccessException undantag.
Dricks
Ett InitOnly fält är ett fält som bara kan anges när det deklareras eller i konstruktorn för den innehållande klassen. Med andra ord är den konstant när den har initierats.
Version introducerad
3,0
Rekommenderad åtgärd
Initiera statiska InitOnly fält i en statisk konstruktor. Detta gäller både dynamiska och icke-dynamiska typer.
Du kan också ta bort FieldAttributes.InitOnly attributet från fältet och sedan anropa FieldInfo.SetValue.
Kategori
Core .NET-bibliotek
Berörda API:er
- FieldInfo.SetValue(Object, Object)
- FieldInfo.SetValue(Object, Object, BindingFlags, Binder, CultureInfo)
Att skicka GroupCollection till tilläggsmetoder som tar IEnumerable<T> kräver tvetydighet
När du anropar en tilläggsmetod som använder IEnumerable<T>
en GroupCollectionmåste du skilja typen från med hjälp av en gjuten fil.
Ändra beskrivning
Från och med .NET Core 3.0 System.Text.RegularExpressions.GroupCollection implementeras IEnumerable<KeyValuePair<String,Group>>
utöver de andra typerna som implementeras, inklusive IEnumerable<Group>
. Detta resulterar i tvetydighet när du anropar en tilläggsmetod som tar en IEnumerable<T>. Om du till exempel Enumerable.Countanropar en sådan tilläggsmetod på en GroupCollection instans visas följande kompilatorfel:
CS1061: "GroupCollection" innehåller inte någon definition för "Count" och ingen tillgänglig tilläggsmetod "Count" som accepterar ett första argument av typen "GroupCollection" kunde hittas (saknar du ett användningsdirektiv eller en sammansättningsreferens?)
I tidigare versioner av .NET fanns det ingen tvetydighet och inget kompilatorfel.
Version introducerad
3,0
Orsak till ändringen
Detta var en oavsiktlig icke-bakåtkompatibel förändring. Eftersom det har varit så här under en tid planerar vi inte att återställa det. Dessutom skulle en sådan förändring i sig vara banbrytande.
Rekommenderad åtgärd
Till GroupCollection exempel, tvetydiga anrop till tilläggsmetoder som accepterar en IEnumerable<T>
med en cast.
// Without a cast - causes CS1061.
match.Groups.Count(_ => true)
// With a disambiguating cast.
((IEnumerable<Group>)m.Groups).Count(_ => true);
Kategori
Core .NET-bibliotek
Berörda API:er
Alla tilläggsmetoder som accepterar en IEnumerable<T> påverkas. Till exempel:
- 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
- De flesta av
System.Linq.Enumerable
metoderna, till exempel System.Linq.Enumerable.Count - System.Linq.ParallelEnumerable.AsParallel
- System.Linq.Queryable.AsQueryable
Kryptografi
- BEGIN TRUSTED CERTIFICATE syntax stöds inte längre i Linux
- EnvelopedCms är standard för AES-256-kryptering
- Minsta storlek för RSAOpenSsl-nyckelgenerering har ökat
- .NET Core 3.0 föredrar OpenSSL 1.1.x till OpenSSL 1.0.x
- CryptoStream.Dispose omvandlar endast det sista blocket när du skriver
Syntaxen "BEGIN TRUSTED CERTIFICATE" stöds inte längre för rotcertifikat i Linux
Rotcertifikat i Linux och andra Unix-liknande system (men inte macOS) kan visas i två former: PEM-standardrubriken BEGIN CERTIFICATE
och den OpenSSL-specifika BEGIN TRUSTED CERTIFICATE
PEM-rubriken. Den senare syntaxen möjliggör ytterligare konfiguration som har orsakat kompatibilitetsproblem med .NET Core-klassen System.Security.Cryptography.X509Certificates.X509Chain . BEGIN TRUSTED CERTIFICATE
rotcertifikatinnehåll läses inte längre in av kedjemotorn som startar i .NET Core 3.0.
Ändra beskrivning
Tidigare användes både syntaxerna BEGIN CERTIFICATE
och BEGIN TRUSTED CERTIFICATE
för att fylla i rotförtroendelistan. Om syntaxen BEGIN TRUSTED CERTIFICATE
användes och ytterligare alternativ angavs i filen X509Chain kan ha rapporterat att kedjeförtroendet uttryckligen inte tilläts (X509ChainStatusFlags.ExplicitDistrust). Men om certifikatet också angavs med syntaxen BEGIN CERTIFICATE
i en tidigare inläst fil tilläts kedjeförtroendet.
Från och med .NET Core 3.0 BEGIN TRUSTED CERTIFICATE
läss inte längre innehållet. Om certifikatet inte också anges via en standardsyntax BEGIN CERTIFICATE
rapporterar de X509Chain att roten inte är betrodd (X509ChainStatusFlags.UntrustedRoot).
Version introducerad
3,0
Rekommenderad åtgärd
De flesta program påverkas inte av den här ändringen, men program som inte kan se båda rotcertifikatkällorna på grund av behörighetsproblem kan uppleva oväntade UntrustedRoot
fel efter uppgraderingen.
Många Linux-distributioner (eller distributioner) skriver rotcertifikat till två platser: en katalog med ett certifikat per fil och en sammanlänkning med en fil. I vissa distributioner använder BEGIN TRUSTED CERTIFICATE
katalogen one-certificate-per-file syntaxen medan filsammanfogningen använder standardsyntaxen BEGIN CERTIFICATE
. Se till att alla anpassade rotcertifikat läggs till som BEGIN CERTIFICATE
på minst en av dessa platser och att båda platserna kan läsas av ditt program.
Den typiska katalogen är /etc/ssl/certs/ och den typiska sammanfogade filen är /etc/ssl/cert.pem. Använd kommandot openssl version -d
för att fastställa den plattformsspecifika roten, som kan skilja sig från /etc/ssl/. På Ubuntu 18.04 är katalogen till exempel /usr/lib/ssl/certs/ och filen är /usr/lib/ssl/cert.pem. Men /usr/lib/ssl/certs/ är en symlink till /etc/ssl/certs/ och /usr/lib/ssl/cert.pem finns inte.
$ 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
Kategori
Kryptografi
Berörda API:er
EnvelopedCms är standard för AES-256-kryptering
Standardalgoritmen för symmetrisk kryptering som används av EnvelopedCms
har ändrats från TripleDES till AES-256.
Ändra beskrivning
I tidigare versioner, när EnvelopedCms används för att kryptera data utan att ange en symmetrisk krypteringsalgoritm via en konstruktoröverlagring, krypteras data med TripleDES/3DES/3DEA/DES3-EDE-algoritmen.
Från och med .NET Core 3.0 (via version 4.6.0 av NuGet-paketet System.Security.Cryptography.Pkcs ) har standardalgoritmen ändrats till AES-256 för algoritmmodernisering och för att förbättra säkerheten för standardalternativ. Om ett meddelandemottagarecertifikat har en (icke-EC) Diffie-Hellman offentlig nyckel kan krypteringsåtgärden misslyckas med en CryptographicException på grund av begränsningar i den underliggande plattformen.
I följande exempelkod krypteras data med TripleDES om de körs på .NET Core 2.2 eller tidigare. Om den körs på .NET Core 3.0 eller senare krypteras den med AES-256.
EnvelopedCms cms = new EnvelopedCms(content);
cms.Encrypt(recipient);
return cms.Encode();
Version introducerad
3,0
Rekommenderad åtgärd
Om du påverkas negativt av ändringen kan du återställa TripleDES-kryptering genom att uttryckligen ange krypteringsalgoritmidentifieraren i en EnvelopedCms konstruktor som innehåller en parameter av typen AlgorithmIdentifier, till exempel:
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();
Kategori
Kryptografi
Berörda API:er
Minsta storlek för RSAOpenSsl-nyckelgenerering har ökat
Den minsta storleken för att generera nya RSA-nycklar i Linux har ökat från 384-bitars till 512-bitars.
Ändra beskrivning
Från och med .NET Core 3.0 har den minsta juridiska nyckelstorleken LegalKeySizes
som rapporterats av egenskapen på RSA-instanser från RSA.Create, RSAOpenSsloch RSACryptoServiceProvider i Linux ökat från 384 till 512.
I .NET Core 2.2 och tidigare versioner lyckas därför ett metodanrop, till exempel RSA.Create(384)
. I .NET Core 3.0 och senare versioner genererar metodanropet RSA.Create(384)
ett undantag som anger att storleken är för liten.
Den här ändringen gjordes eftersom OpenSSL, som utför kryptografiska åtgärder i Linux, höjde sitt minimum mellan versionerna 1.0.2 och 1.1.0. .NET Core 3.0 föredrar OpenSSL 1.1.x till 1.0.x, och den minsta rapporterade versionen höjdes för att återspegla den nya högre beroendebegränsningen.
Version introducerad
3,0
Rekommenderad åtgärd
Om du anropar någon av de berörda API:erna kontrollerar du att storleken på alla genererade nycklar inte är mindre än providerns minimum.
Kommentar
384-bitars RSA anses redan vara osäkert (liksom 512-bitars RSA). Moderna rekommendationer, till exempel NIST Special Publication 800-57 Del 1 Revision 4, föreslår 2048-bitars som minsta storlek för nyligen genererade nycklar.
Kategori
Kryptografi
Berörda API:er
.NET Core 3.0 föredrar OpenSSL 1.1.x till OpenSSL 1.0.x
.NET Core för Linux, som fungerar i flera Linux-distributioner, kan stödja både OpenSSL 1.0.x och OpenSSL 1.1.x. .NET Core 2.1 och .NET Core 2.2 letar efter 1.0.x först och faller sedan tillbaka till 1.1.x; .NET Core 3.0 letar efter 1.1.x först. Den här ändringen gjordes för att lägga till stöd för nya kryptografiska standarder.
Den här ändringen kan påverka bibliotek eller program som utför plattformsinterop med OpenSSL-specifika interop-typer i .NET Core.
Ändra beskrivning
I .NET Core 2.2 och tidigare versioner föredrar körningen att läsa in OpenSSL 1.0.x över 1.1.x. Det innebär att typerna IntPtr och SafeHandle för interop med OpenSSL används med libcrypto.so.1.0.0 /libcrypto.so.1.0 /libcrypto.so.10 efter önskemål.
Från och med .NET Core 3.0, runtime föredrar att läsa in OpenSSL 1.1.x över OpenSSL 1.0.x, så IntPtr de och SafeHandle typerna för interop med OpenSSL används med libcrypto.so.1.1 / libcrypto.so.11 / libcrypto.so.1.1.0 / libcrypto.so.1.1.1 efter önskemål. Därför kan bibliotek och program som samverkar direkt med OpenSSL ha inkompatibla pekare med .NET Core-exponerade värden vid uppgradering från .NET Core 2.1 eller .NET Core 2.2.
Version introducerad
3,0
Rekommenderad åtgärd
Bibliotek och program som utför direkta åtgärder med OpenSSL måste vara noga med att se till att de använder samma version av OpenSSL som .NET Core-körningen.
Alla bibliotek eller program som använder IntPtr eller SafeHandle värden från .NET Core kryptografiska typer direkt med OpenSSL bör jämföra versionen av biblioteket som de använder med den nya SafeEvpPKeyHandle.OpenSslVersion egenskapen för att säkerställa att pekarna är kompatibla.
Kategori
Kryptografi
Berörda API:er
- 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 omvandlar endast det sista blocket när du skriver
Metoden CryptoStream.Dispose , som används för att slutföra CryptoStream
åtgärder, försöker inte längre transformera det sista blocket vid läsning.
Ändra beskrivning
Om en användare i tidigare .NET-versioner utförde en ofullständig läsning när han Dispose eller hon använde CryptoStream i Read läget kan metoden utlösa ett undantag (till exempel när du använder AES med utfyllnad). Undantaget utlöstes eftersom det sista blocket försökte omvandlas men data var ofullständiga.
I .NET Core 3.0 och senare versioner Dispose försöker inte längre transformera det sista blocket vid läsning, vilket möjliggör ofullständiga läsningar.
Orsak till ändringen
Den här ändringen möjliggör ofullständiga läsningar från kryptoströmmen när en nätverksåtgärd avbryts, utan att du behöver fånga upp ett undantag.
Version introducerad
3,0
Rekommenderad åtgärd
De flesta appar bör inte påverkas av den här ändringen.
Om ditt program tidigare upptäckte ett undantag i händelse av en ofullständig läsning kan du ta bort det catch
blocket.
Om din app använde transformering av det sista blocket i hash-scenarier kan du behöva se till att hela dataströmmen läse innan den tas bort.
Kategori
Kryptografi
Berörda API:er
Entity Framework Core
Icke-bakåtkompatibla ändringar i Entity Framework Core
Globalisering
"C" nationella inställningar mappar till det invarianta språket
.NET Core 2.2 och tidigare versioner beror på standardbeteendet för ICU, som mappar språkvarianten "C" till en_US_POSIX nationella inställningar. Det en_US_POSIX nationella språket har ett oönskat sorteringsbeteende eftersom det inte stöder skiftlägesokänsliga strängjämförelser. Eftersom vissa Linux-distributioner anger "C"-språk som standardspråk hade användarna oväntat beteende.
Ändra beskrivning
Från och med .NET Core 3.0 har "C"-språkmappningen ändrats för att använda invariantspråket i stället för en_US_POSIX. "C"-språkvarianten för Invariant-mappning tillämpas också på Windows för konsekvens.
Mappning av "C" till en_US_POSIX kultur orsakade kundförvirring, eftersom en_US_POSIX inte stöder skiftlägesokänsliga sorterings-/söksträngsåtgärder. Eftersom "C"-språkvarianten används som standardspråk i vissa Linux-distributioner upplevde kunderna detta oönskade beteende på dessa operativsystem.
Version introducerad
3,0
Rekommenderad åtgärd
Inget specifikt mer än medvetenheten om denna förändring. Den här ändringen påverkar endast program som använder "C"-språkmappningen.
Kategori
Globalisering
Berörda API:er
Alla sorterings- och kultur-API:er påverkas av den här ändringen.
MSBuild
Namnändring för resursmanifestfil
Från och med .NET Core 3.0 genererar MSBuild i standardfallet ett annat manifestfilnamn för resursfiler.
Version introducerad
3,0
Ändra beskrivning
Innan .NET Core 3.0, om inga , eller metadata angavs för ett EmbeddedResource
objekt i projektfilen, genererade MSBuild ett manifestfilnamn i mönstret <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources
.DependentUpon
ManifestResourceName
LogicalName
Om RootNamespace
inte har definierats i projektfilen är det som standard namnet på projektet. Till exempel var det genererade manifestnamnet för en resursfil med namnet Form1.resx i rotprojektkatalogen MyProject.Form1.resources.
Från och med .NET Core 3.0, om en resursfil samplaceras med en källfil med samma namn (till exempel Form1.resx och Form1.cs), använder MSBuild typinformation från källfilen för att generera manifestfilens namn i mönstret <Namespace>.<ClassName>.resources
. Namnområdet och klassnamnet extraheras från den första typen i den samlokaliserade källfilen. Det genererade manifestnamnet för en resursfil med namnet Form1.resx som samlokaliserats med en källfil med namnet Form1.cs är MyNamespace.Form1.resources. Det viktigaste att notera är att den första delen av filnamnet skiljer sig från tidigare versioner av .NET Core (MyNamespace i stället för MyProject).
Kommentar
Om du har LogicalName
angett , ManifestResourceName
eller DependentUpon
metadata för ett EmbeddedResource
objekt i projektfilen påverkar inte den här ändringen resursfilen.
Den här icke-bakåtkompatibla ändringen introducerades med tillägget av EmbeddedResourceUseDependentUponConvention
egenskapen till .NET Core-projekt. Som standard visas inte resursfiler uttryckligen i en .NET Core-projektfil, så de har inga DependentUpon
metadata för att ange hur den genererade .resources-filen ska namnges. När EmbeddedResourceUseDependentUponConvention
är inställt på true
, vilket är standardinställningen, letar MSBuild efter en samlokaliserad källfil och extraherar ett namnområde och klassnamn från filen. Om du anger EmbeddedResourceUseDependentUponConvention
till false
genererar MSBuild manifestnamnet enligt det tidigare beteendet, som kombinerar RootNamespace
och den relativa filsökvägen.
Rekommenderad åtgärd
I de flesta fall krävs ingen åtgärd från utvecklarens sida, och din app bör fortsätta att fungera. Men om den här ändringen bryter din app kan du antingen:
Ändra koden så att den förväntar sig det nya manifestnamnet.
Avregistrera dig från den nya namngivningskonventionen genom att ange
EmbeddedResourceUseDependentUponConvention
ifalse
projektfilen.<PropertyGroup> <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention> </PropertyGroup>
Kategori
MSBuild
Berörda API:er
Ej tillämpligt
Nätverk
Standardvärdet för HttpRequestMessage.Version har ändrats till 1.1
Standardvärdet för System.Net.Http.HttpRequestMessage.Version egenskapen har ändrats från 2.0 till 1.1.
Version introducerad
3,0
Ändra beskrivning
I .NET Core 1.0 till 2.0 är standardvärdet för System.Net.Http.HttpRequestMessage.Version egenskapen 1.1. Från och med .NET Core 2.1 ändrades den till 2.1.
Från och med .NET Core 3.0 är standardversionsnumret som returneras av System.Net.Http.HttpRequestMessage.Version egenskapen återigen 1.1.
Rekommenderad åtgärd
Uppdatera koden om den är beroende av att System.Net.Http.HttpRequestMessage.Version egenskapen returnerar standardvärdet 2.0.
Kategori
Nätverk
Berörda API:er
WPF
Ändrat drag-och-släpp-beteende i textredigerare
.NET Core 3.0 introducerade en ändring i hur textredigerarens kontroller skapar en System.Windows.DataObject när text dras till en annan kontroll. Ändringen inaktiverade autokonverteringen, vilket gör att åtgärden behåller data som DataFormats.Text eller DataFormats.UnicodeText i stället för att konvertera dem till DataFormats.StringFormat.
Version introducerad
.NET Core 3.0
Kategori
Windows Presentation Foundation
Tidigare beteende
Datatypen på System.Windows.DataObject när du drar text från en textredigerare var DataFormats.StringFormat.
Nytt beteende
Datatypen på System.Windows.DataObject när du drar text från en textredigerare är DataFormats.Text eller DataFormats.UnicodeText.
Typ av icke-bakåtkompatibel ändring
Den här ändringen är en beteendeförändring.
Orsak till ändringen
Ändringen var oavsiktlig.
Rekommenderad åtgärd
Den här ändringen återställdes i .NET 7. Uppgradera till .NET 7 eller senare.