Modifiche di rilievo di ASP.NET Core per le versioni 3.0 e 3.1
ASP.NET Core fornisce le funzionalità di sviluppo di app Web usate da .NET Core.
Selezionare uno dei collegamenti seguenti per le modifiche che causano un'interruzione in una versione specifica:
Le modifiche di rilievo seguenti in ASP.NET Core 3.0 e 3.1 sono documentate in questa pagina:
- API antifalsificazione, CORS, di diagnostica, MVC e di routing obsolete rimosse
- Autenticazione: deprecazione di Google+
- Autenticazione: proprietà HttpContext.Authentication rimossa
- Autenticazione: tipi Newtonsoft.Json sostituiti
- Autenticazione: firma di OAuthHandler.ExchangeCodeAsync modificata
- Autorizzazione: overload di addAuthorization spostato in un assembly diverso
- Autorizzazione: IAllowAnonymous rimosso da AuthorizationFilterContext.Filters
- Autorizzazione: le implementazioni di IAuthorizationPolicyProvider richiedono un nuovo metodo
- Memorizzazione nella cache: proprietà CompactOnMemoryPressure rimossa
- Memorizzazione nella cache: Microsoft.Extensions.Caching.SqlServer usa un nuovo pacchetto SqlClient
- Protezione dei dati: DataProtection.Blobs usa nuove API di Archiviazione di Azure
- Hosting: AspNetCoreModule V1 rimosso dal bundle di hosting Windows
- Hosting: l'host generico limita l'inserimento del costruttore Startup
- Hosting: reindirizzamento HTTPS abilitato per le app IIS out-of-process
- Hosting: tipi IHostingEnvironment e IApplicationLifetime sostituiti
- Hosting: ObjectPoolProvider rimosso dalle dipendenze di WebHostBuilder
- HTTP: Le modifiche SameSite del browser influiscono sull'autenticazione
- HTTP: Estendibilità DefaultHttpContext rimossa
- HTTP: campi HeaderNames modificati in statici di sola lettura
- HTTP: modifiche all'infrastruttura del corpo della risposta
- HTTP: alcuni valori predefiniti SameSite per i cookie sono stati modificati
- HTTP: I/O sincrono disabilitato per impostazione predefinita
- Identity: overload del metodo AddDefaultUI rimosso
- Identity: modifica della versione di Bootstrap dell'interfaccia utente
- Identity: SignInAsync genera un'eccezione per l'identità non autenticata
- Identity: il costruttore SignInManager accetta un nuovo parametro
- Identity: l'interfaccia utente usa la funzionalità degli asset Web statici
- Kestrel: adapter di connessione rimossi
- Kestrel: assembly HTTPS vuoto rimosso
- Kestrel: intestazioni del trailer della richiesta spostate nella nuova raccolta
- Kestrel: modifiche del livello di astrazione del trasporto
- Localizzazione: API contrassegnate come obsolete
- Registrazione: classe DebugLogger resa interna
- MVC: suffisso Async delle azioni del controller rimosso
- MVC: JsonResult spostato in Microsoft.AspNetCore.Mvc.Core
- MVC: strumento di precompilazione deprecato
- MVC: tipi modificati in interni
- MVC: shim di compatibilità API Web rimosso
- Razor: API RazorTemplateEngine rimossa
- Razor: compilazione in fase di esecuzione spostata in un pacchetto
- Stato sessione: API obsolete rimosse
- Framework condiviso: rimozione di assembly da Microsoft.AspNetCore.App
- Framework condiviso: Microsoft.AspNetCore.All rimosso
- SignalR: HandshakeProtocol.SuccessHandshakeData sostituito
- SignalR: metodi HubConnection rimossi
- SignalR: costruttori HubConnectionContext modificati
- SignalR: modifica del nome del pacchetto client JavaScript
- SignalR: API obsolete
- Applicazioni a pagina singola: modifica del fallback predefinito al logger della console di SpaServices e NodeServices
- Applicazioni a pagina singola: SpaServices e NodeServices contrassegnati come obsoleti
- Framework di destinazione: .NET Framework non supportato
ASP.NET Core 3.1
HTTP: Le modifiche dello stesso sito browser influiscono sull'autenticazione
Alcuni browser, ad esempio Chrome e Firefox, hanno apportato modifiche di rilievo alle loro implementazioni di SameSite
per i cookie. Le modifiche influiscono sugli scenari di autenticazione remota, ad esempio OpenID Connect e WS-Federation, che devono rifiutare esplicitamente inviando SameSite=None
. Tuttavia, SameSite=None
si interrompe in iOS 12 e in alcune versioni precedenti di altri browser. L'app deve eseguire l'analisi di queste versioni e omettere SameSite
.
Per informazioni su questo problema, vedere dotnet/aspnetcore#14996.
Versione introdotta
3.1 Preview 1
Comportamento precedente
SameSite
è una bozza di estensione standard 2016 per i cookie HTTP. È progettato per attenuare la richiesta cross-site forgery (CSRF). Originariamente progettato come funzionalità, i server potrebbero acconsentire esplicitamente aggiungendo i nuovi parametri. ASP.NET Core 2.0 ha aggiunto il supporto iniziale per SameSite
.
Nuovo comportamento
Google ha proposto un nuovo standard bozza che non è compatibile con le versioni precedenti. Lo standard modifica la modalità predefinita in Lax
e aggiunge una nuova voce None
per rifiutare esplicitamente. Lax
è sufficiente per la maggior parte dei cookie dell'app. Tuttavia, interrompe gli scenari tra siti, ad esempio OpenID Connect e l'account di accesso WS-Federation. La maggior parte degli account di accesso OAuth non è interessata a causa delle differenze nel flusso della richiesta. Il nuovo parametro None
causa problemi di compatibilità con i client che hanno implementato la bozza dello standard precedente (ad esempio, iOS 12). Chrome 80 includerà le modifiche. Vedere Aggiornamenti SameSite per la sequenza temporale di avvio del prodotto Chrome.
ASP.NET Core 3.1 è stato aggiornato per implementare il nuovo comportamento di SameSite
. L'aggiornamento ridefinisce il comportamento di SameSiteMode.None
per generare SameSite=None
e aggiunge un nuovo valore SameSiteMode.Unspecified
per omettere l'attributo SameSite
. Tutte le API dei cookie sono ora predefinite su Unspecified
, anche se alcuni componenti che usano i valori impostati dai cookie sono più specifici per i relativi scenari, ad esempio la correlazione OpenID Connect e i cookie nonce.
Per altre modifiche recenti in questa area, vedere HTTP: Alcune impostazioni predefinite di SameSite cookie sono state modificate in Nessuno. In ASP.NET Core 3.0, la maggior parte delle impostazioni predefinite è stata modificata da SameSiteMode.Lax a SameSiteMode.None (ma usando ancora lo standard precedente).
Motivo della modifica
Modifiche del browser e delle specifiche, come descritto nel testo precedente.
Azione consigliata
Le app che interagiscono con siti remoti, ad esempio tramite un account di accesso di terze parti, devono:
- Testare questi scenari in più browser.
- Applicare la mitigazione dell'analisi del browser dei criteri dei cookie descritta in Supporto di browser meno recenti.
Per istruzioni su test e analisi del browser, vedere la sezione seguente.
Determinare se si è interessati
Testare l'app Web usando una versione client che può acconsentire esplicitamente al nuovo comportamento. Chrome, Firefox e Microsoft Edge Chromium hanno tutti nuovi flag di funzionalità di consenso esplicito che possono essere usati per i test. Verificare che l'app sia compatibile con le versioni client precedenti dopo aver applicato le patch, in particolare Safari. Per altre informazioni, vedere Supporto di browser meno recenti.
Chrome
Chrome 78 e versioni successive producono risultati di test fuorvianti. Queste versioni hanno una mitigazione temporanea sul posto e consentono i cookie meno di due minuti prima. Con i flag di test appropriati abilitati, Chrome 76 e 77 producono risultati più accurati. Per testare il nuovo comportamento, impostare chrome://flags/#same-site-by-default-cookies
su abilitato. È stato segnalato che Chrome 75 e versioni precedenti non funzionano con la nuova None
impostazione. Per altre informazioni, vedere Supporto di browser meno recenti.
Google non rende disponibili le versioni precedenti di Chrome. È tuttavia possibile scaricare le versioni precedenti di Chromium, che sarà sufficiente per i test. Seguire le istruzioni in Scaricare Chromium.
Safari
Safari 12 ha implementato rigorosamente la bozza precedente e ha esito negativo se vede il nuovo valore None
nei cookie. Questa operazione deve essere evitata tramite il codice di analisi del browser visualizzato in Supporto di browser meno recenti. Assicurarsi di testare Safari 12 e 13, nonché gli account di accesso basati su WebKit in stile sistema operativo usando Microsoft Authentication Library (MSAL), Active Directory Authentication Library (ADAL) o qualsiasi libreria in uso. Il problema dipende dalla versione del sistema operativo sottostante. OSX Mojave 10.14 e iOS 12 sono noti per avere problemi di compatibilità con il nuovo comportamento. L'aggiornamento a OSX Catalina 10.15 o iOS 13 risolve il problema. Safari non dispone attualmente di un flag di consenso esplicito per testare il nuovo comportamento di specifica.
Firefox
Il supporto di Firefox per il nuovo standard può essere testato nella versione 68 e successive acconsentire esplicitamente alla pagina about:config
con il flag di funzionalità network.cookie.sameSite.laxByDefault
. Non sono stati segnalati problemi di compatibilità sulle versioni precedenti di Firefox.
Microsoft Edge
Anche se Microsoft Edge supporta il vecchio standard SameSite
, a partire dalla versione 44 non ha avuto problemi di compatibilità con il nuovo standard.
Microsoft Edge Chromium
Il flag di funzionalità è edge://flags/#same-site-by-default-cookies
. Non sono stati rilevati problemi di compatibilità durante i test con Microsoft Edge Chromium 78.
Electron
Le versioni di Electron includono versioni precedenti di Chromium. Ad esempio, la versione di Electron usata da Microsoft Teams è Chromium 66, che mostra il comportamento precedente. Eseguire test di compatibilità personalizzati con la versione di Electron usata dal prodotto. Per altre informazioni, vedere Supporto di browser meno recenti.
Supportare browser meno recenti
Lo standard SameSite
2016 imponeva che i valori sconosciuti venissero considerati come valori SameSite=Strict
. Di conseguenza, tutti i browser meno recenti che supportano lo standard originale si possono interrompere quando visualizzano una proprietà SameSite
con un valore di None
. Le app Web devono implementare l'analisi del browser se intendono supportare questi vecchi browser. ASP.NET Core non implementa l'analisi del browser perché i valori di intestazione della richiesta User-Agent
sono altamente instabili e cambiano su base settimanale. Al contrario, un punto di estensione nei criteri cookie consente di aggiungere logica specifica per User-Agent
.
In Startup.cs aggiungere le istruzioni seguenti:
private void CheckSameSite(HttpContext httpContext, CookieOptions options)
{
if (options.SameSite == SameSiteMode.None)
{
var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
// TODO: Use your User Agent library of choice here.
if (/* UserAgent doesn't support new behavior */)
{
options.SameSite = SameSiteMode.Unspecified;
}
}
}
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.OnAppendCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
options.OnDeleteCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
}
public void Configure(IApplicationBuilder app)
{
// Before UseAuthentication or anything else that writes cookies.
app.UseCookiePolicy();
app.UseAuthentication();
// code omitted for brevity
}
Opzioni di rifiuto esplicito
L'opzione di compatibilità Microsoft.AspNetCore.SuppressSameSiteNone
consente di rifiutare temporaneamente il nuovo comportamento dei cookie di ASP.NET Core. Aggiungere il codice JSON seguente a un file runtimeconfig.template.json nel progetto:
{
"configProperties": {
"Microsoft.AspNetCore.SuppressSameSiteNone": "true"
}
}
Altre versioni
Le patch correlate SameSite
sono disponibili per:
- ASP.NET Core 2.1, 2.2 e 3.0
Microsoft.Owin
4.1System.Web
(per .NET Framework 4.7.2 e versioni successive)
Category
ASP.NET
API interessate
- Microsoft.AspNetCore.Builder.CookiePolicyOptions.MinimumSameSitePolicy
- Microsoft.AspNetCore.Http.CookieBuilder.SameSite
- Microsoft.AspNetCore.Http.CookieOptions.SameSite
- Microsoft.AspNetCore.Http.SameSiteMode
- Microsoft.Net.Http.Headers.SameSiteMode
- Microsoft.Net.Http.Headers.SetCookieHeaderValue.SameSite
ASP.NET Core 3.0
API obsolete antifalsificazione, CORS, di diagnostica, MVC e di routing rimosse
Le opzioni di compatibilità e i membri obsoleti in ASP.NET Core 2.2 sono stati rimossi.
Versione introdotta
3,0
Motivo della modifica
Miglioramento della superficie dell'API nel tempo.
Azione consigliata
Quando la destinazione è .NET Core 2.2, seguire le indicazioni contenute nei messaggi di compilazione obsoleti per adottare invece le nuove API.
Category
ASP.NET Core
API interessate
I tipi e i membri seguenti sono stati contrassegnati come obsoleti per ASP.NET Core 2.1 e 2.2:
Tipi
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
Costruttori
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)
Proprietà
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
Metodi
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)
Autenticazione: Google+ deprecato e sostituito
Google ha iniziato a disattivare il sistema Accesso a Google+ per le app il 28 gennaio 2019.
Descrizione delle modifiche
ASP.NET 4.x e ASP.NET Core usavano le API di Accesso a Google+ per autenticare gli utenti degli account Google nelle app Web. I pacchetti NuGet interessati sono Microsoft.AspNetCore.Authentication.Google per ASP.NET Core e Microsoft.Owin.Security.Google per Microsoft.Owin
con Web Forms ASP.NET e MVC.
Le API di sostituzione di Google usano un'origine dati e un formato differenti. Le mitigazioni e le soluzioni fornite di seguito tengono conto delle modifiche strutturali. Le app devono verificare che i dati continuino a soddisfare i requisiti. Ad esempio, nomi, indirizzi e-mail, collegamenti al profilo e foto del profilo possono fornire valori leggermente diversi rispetto a prima.
Versione introdotta
tutte le versioni. Questa modifica è esterna a ASP.NET Core.
Azione consigliata
Owin con Web Forms ASP.NET e MVC
Per Microsoft.Owin
3.1.0 e versioni successive, una mitigazione temporanea è illustrata qui. Le app devono completare i test con la mitigazione per rilevare le eventuali modifiche nel formato dei dati. È in programma il rilascio di Microsoft.Owin
4.0.1 con un aggiornamento. Le app che usano qualsiasi versione precedente devono essere aggiornate alla versione 4.0.1.
ASP.NET Core 1.x
La mitigazione in Owin con Web Forms ASP.NET e MVC può essere adattata ad ASP.NET Core 1.x. Non sono previste patch del pacchetto NuGet, perché 1.x ha raggiunto lo stato di fine del ciclo di vita.
ASP.NET Core 2.x
Per Microsoft.AspNetCore.Authentication.Google
versione 2.x, sostituire la chiamata esistente a AddGoogle
in Startup.ConfigureServices
con il codice seguente:
.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");
});
Le patch di febbraio delle versioni 2.1 e 2.2 incorporavano la riconfigurazione precedente come nuova impostazione predefinita. Non è prevista alcuna patch per ASP.NET Core 2.0 perché ha raggiunto la fine del ciclo di vita.
ASP.NET Core 3.0
La mitigazione fornita per ASP.NET Core 2.x può essere usata anche per ASP.NET Core 3.0. Nelle prossime anteprime della versione 3.0, il pacchetto Microsoft.AspNetCore.Authentication.Google
potrebbe essere rimosso. Gli utenti verrebbero reindirizzati a Microsoft.AspNetCore.Authentication.OpenIdConnect
. Il codice seguente mostra come sostituire AddGoogle
con AddOpenIdConnect
in Startup.ConfigureServices
. Questa sostituzione può essere usata con ASP.NET Core 2.0 e versioni successive e può essere adattata per ASP.NET Core 1.x in base alle esigenze.
.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();
Category
ASP.NET Core
API interessate
Microsoft.AspNetCore.Authentication.Google
Autenticazione: proprietà HttpContext.Authentication rimossa
La proprietà deprecata Authentication
in HttpContext
è stata rimossa.
Descrizione delle modifiche
Come parte di dotnet/aspnetcore#6504, la proprietà deprecata Authentication
in HttpContext
è stata rimossa. La proprietà Authentication
è stata deprecata a partire dalla versione 2.0. È stata pubblicata una guida alla migrazione per eseguire la migrazione del codice che usa questa proprietà deprecata alle nuove API sostitutive. Le rimanenti classi/API inutilizzate correlate al vecchio stack di autenticazione ASP.NET Core 1.x sono state rimosse nel commit dotnet/aspnetcore@d7a7c65.
Per informazioni, vedere dotnet/aspnetcore#6533.
Versione introdotta
3,0
Motivo della modifica
Le API ASP.NET Core 1.0 sono state sostituite da metodi di estensione in Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions.
Azione consigliata
Vedere la guida alla migrazione.
Category
ASP.NET Core
API interessate
- 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
Autenticazione: tipi Newtonsoft.Json sostituiti
In ASP.NET Core 3.0, i tipi Newtonsoft.Json
usati nelle API di autenticazione sono stati sostituiti con tipi System.Text.Json
. Tranne che nei casi seguenti, l'utilizzo di base dei pacchetti di autenticazione rimane invariato:
- Classi derivate da provider OAuth, ad esempio quelle di aspnet-contrib.
- Implementazioni avanzate di manipolazione delle attestazioni.
Per altre informazioni, vedere dotnet/aspnetcore#7105. Per informazioni, vedere dotnet/aspnetcore#7289.
Versione introdotta
3,0
Azione consigliata
Per le implementazioni OAuth derivate, la modifica più comune consiste nel sostituire JObject.Parse
con JsonDocument.Parse
nell'override CreateTicketAsync
, come illustrato qui. JsonDocument
implementa IDisposable
.
L'elenco seguente illustra le modifiche note:
- ClaimAction.Run(JObject, ClaimsIdentity, String) diventa
ClaimAction.Run(JsonElement userData, ClaimsIdentity identity, string issuer)
. Lo stesso si verifica per tutte le implementazioni derivate diClaimAction
. - ClaimActionCollectionMapExtensions.MapCustomJson(ClaimActionCollection, String, Func<JObject,String>) diventa
MapCustomJson(this ClaimActionCollection collection, string claimType, Func<JsonElement, string> resolver)
- ClaimActionCollectionMapExtensions.MapCustomJson(ClaimActionCollection, String, String, Func<JObject,String>) diventa
MapCustomJson(this ClaimActionCollection collection, string claimType, string valueType, Func<JsonElement, string> resolver)
- In OAuthCreatingTicketContext è stato rimosso un costruttore precedente e nell'altro è stato sostituito
JObject
conJsonElement
. La proprietàUser
e il metodoRunClaimActions
sono stati aggiornati in modo che corrispondano. - Success(JObject) ora accetta un parametro di tipo
JsonDocument
anzichéJObject
. LaResponse
proprietà è stata aggiornata in modo che corrisponda.OAuthTokenResponse
ora è eliminabile e verrà eliminato daOAuthHandler
. Le implementazioni OAuth derivate che eseguono l'override diExchangeCodeAsync
non devono necessariamente eliminareJsonDocument
oOAuthTokenResponse
. - In UserInformationReceivedContext.User,
JObject
è cambiato inJsonDocument
. - In TwitterCreatingTicketContext.User,
JObject
è cambiato inJsonElement
. - L'ultimo parametro di TwitterHandler.CreateTicketAsync(ClaimsIdentity,AuthenticationProperties,AccessToken,JObject) è cambiato da
JObject
aJsonElement
. Il metodo di sostituzione è TwitterHandler.CreateTicketAsync(ClaimsIdentity, AuthenticationProperties, AccessToken, JsonElement).
Category
ASP.NET Core
API interessate
- Microsoft.AspNetCore.Authentication.Facebook
- Microsoft.AspNetCore.Authentication.Google
- Microsoft.AspNetCore.Authentication.MicrosoftAccount
- Microsoft.AspNetCore.Authentication.OAuth
- Microsoft.AspNetCore.Authentication.OpenIdConnect
- Microsoft.AspNetCore.Authentication.Twitter
Autenticazione: firma di OAuthHandler.ExchangeCodeAsync modificata
In ASP.NET Core 3.0 la firma di OAuthHandler.ExchangeCodeAsync
è stata modificata da:
protected virtual System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.OAuth.OAuthTokenResponse> ExchangeCodeAsync(string code, string redirectUri) { throw null; }
Con:
protected virtual System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.OAuth.OAuthTokenResponse> ExchangeCodeAsync(Microsoft.AspNetCore.Authentication.OAuth.OAuthCodeExchangeContext context) { throw null; }
Versione introdotta
3,0
Comportamento precedente
Le stringhe code
e redirectUri
venivano passate come argomenti separati.
Nuovo comportamento
Code
e RedirectUri
sono proprietà di OAuthCodeExchangeContext
che è possibile impostare tramite il costruttore OAuthCodeExchangeContext
. Il nuovo tipo di OAuthCodeExchangeContext
è l'unico argomento passato a OAuthHandler.ExchangeCodeAsync
.
Motivo della modifica
Questa modifica consente di specificare parametri aggiuntivi senza causare interruzioni. Non è necessario creare nuovi overload di ExchangeCodeAsync
.
Azione consigliata
Costruire un elemento OAuthCodeExchangeContext
con i valori code
e redirectUri
appropriati. È necessario specificare un'istanza di AuthenticationProperties. È possibile passare a OAuthHandler.ExchangeCodeAsync
questa singola istanza di OAuthCodeExchangeContext
anziché più argomenti.
Category
ASP.NET Core
API interessate
OAuthHandler<TOptions>.ExchangeCodeAsync(String, String)
Autorizzazione: overload di AddAuthorization spostato in un assembly diverso
I metodi principali AddAuthorization
presenti in genere in Microsoft.AspNetCore.Authorization
sono stati rinominati in AddAuthorizationCore
. I metodi AddAuthorization
precedenti esistono ancora, ma si trovano nell'assembly Microsoft.AspNetCore.Authorization.Policy
. Le app che usano entrambi i metodi non dovrebbero subire conseguenze. Si noti che Microsoft.AspNetCore.Authorization.Policy
ora viene fornito nel framework condiviso anziché in un pacchetto autonomo, come descritto in Framework condiviso: assembly rimossi da Microsoft.AspNetCore.App.
Versione introdotta
3,0
Comportamento precedente
I metodi AddAuthorization
esistevano in Microsoft.AspNetCore.Authorization
.
Nuovo comportamento
I metodi AddAuthorization
esistono in Microsoft.AspNetCore.Authorization.Policy
. AddAuthorizationCore
è il nuovo nome dei metodi precedenti.
Motivo della modifica
AddAuthorization
è un nome di metodo migliore per l'aggiunta di tutti i servizi comuni necessari per l'autorizzazione.
Azione consigliata
Aggiungere un riferimento a Microsoft.AspNetCore.Authorization.Policy
o usare AddAuthorizationCore
.
Category
ASP.NET Core
API interessate
Autorizzazione: IAllowAnonymous rimosso da AuthorizationFilterContext.Filters
A partire da ASP.NET Core 3.0, MVC non aggiunge AllowAnonymousFilters per gli attributi [AllowAnonymous] individuati nei controller e nei metodi di azione. Questa modifica viene risolta in locale per i derivati di AuthorizeAttribute, ma si tratta di una modifica che causa un'interruzione per le implementazioni di IAsyncAuthorizationFilter e IAuthorizationFilter. Tali implementazioni, incapsulate in un attributo [TypeFilter] sono un modo diffuso e supportato per ottenere un'autorizzazione basata su attributi fortemente tipizzati quando sono necessari sia la configurazione che l'inserimento delle dipendenze.
Versione introdotta
3,0
Comportamento precedente
IAllowAnonymous compariva nella raccolta AuthorizationFilterContext.Filters. Testare la presenza dell'interfaccia era un approccio valido per eseguire l'override o disabilitare il filtro su singoli metodi del controller.
Nuovo comportamento
IAllowAnonymous
non compare più nella raccolta AuthorizationFilterContext.Filters
. Le implementazioni di IAsyncAuthorizationFilter
dipendenti dal comportamento precedente causano a intermittenza risposte HTTP 401 (accesso non autorizzato) o HTTP 403 (accesso negato).
Motivo della modifica
In ASP.NET Core 3.0 è stata introdotta una nuova strategia di routing degli endpoint.
Azione consigliata
Cercare i metadati dell'endpoint per IAllowAnonymous
. Ad esempio:
var endpoint = context.HttpContext.GetEndpoint();
if (endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null)
{
}
Un esempio di questa tecnica si può osservare in questo metodo HasAllowAnonymous.
Category
ASP.NET Core
API interessate
None
Autorizzazione: le implementazioni di IAuthorizationPolicyProvider richiedono un nuovo metodo
In ASP.NET Core 3.0, un nuovo metodo GetFallbackPolicyAsync
è stato aggiunto a IAuthorizationPolicyProvider
. Questo criterio di fallback viene usato dal middleware di autorizzazione quando non è specificato alcun criterio.
Per altre informazioni, vedere dotnet/aspnetcore#9759.
Versione introdotta
3,0
Comportamento precedente
Le implementazioni di IAuthorizationPolicyProvider
non richiedevano un metodo GetFallbackPolicyAsync
.
Nuovo comportamento
Le implementazioni di IAuthorizationPolicyProvider
richiedono un metodo GetFallbackPolicyAsync
.
Motivo della modifica
Per il nuovo AuthorizationMiddleware
era necessario un nuovo metodo da usare quando non è specificato alcun criterio.
Azione consigliata
Aggiungere il metodo GetFallbackPolicyAsync
alle implementazioni di IAuthorizationPolicyProvider
.
Category
ASP.NET Core
API interessate
Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider
Memorizzazione nella cache: proprietà CompactOnMemoryPressure rimossa
Nella versione ASP.NET Core 3.0 sono state rimosse le API MemoryCacheOptions obsolete.
Descrizione delle modifiche
Questa modifica è una conseguenza di aspnet/Caching#221. Per informazioni, vedere dotnet/extensions#1062.
Versione introdotta
3,0
Comportamento precedente
Era disponibile la proprietà MemoryCacheOptions.CompactOnMemoryPressure
.
Nuovo comportamento
La proprietà MemoryCacheOptions.CompactOnMemoryPressure
è stata rimossa.
Motivo della modifica
La compattazione automatica della cache provocava problemi. Per evitare comportamenti imprevisti, la cache deve essere compattata solo quando è necessario.
Azione consigliata
Per compattare la cache, eseguire il downcast a MemoryCache
e chiamare Compact
quando necessario.
Category
ASP.NET Core
API interessate
MemoryCacheOptions.CompactOnMemoryPressure
Memorizzazione nella cache: Microsoft.Extensions.Caching.SqlServer usa un nuovo pacchetto SqlClient
Il pacchetto Microsoft.Extensions.Caching.SqlServer
userà il nuovo pacchetto Microsoft.Data.SqlClient
anziché il pacchetto System.Data.SqlClient
. Questa modifica potrebbe causare modifiche che causano un'interruzione di lieve entità. Per altre informazioni, vedere la presentazione del nuovo Microsoft.Data.SqlClient.
Versione introdotta
3,0
Comportamento precedente
Il pacchetto Microsoft.Extensions.Caching.SqlServer
usava il pacchetto System.Data.SqlClient
.
Nuovo comportamento
Ora Microsoft.Extensions.Caching.SqlServer
usa il pacchetto Microsoft.Data.SqlClient
.
Motivo della modifica
Microsoft.Data.SqlClient
è un nuovo pacchetto basato su System.Data.SqlClient
. È qui che da ora in poi verrà svolto tutto il lavoro delle nuove funzionalità.
Azione consigliata
I clienti non devono preoccuparsi di questa modifica che causa un'interruzione, a meno che non usino tipi restituiti dal pacchetto Microsoft.Extensions.Caching.SqlServer
e ne eseguano il cast a tipi System.Data.SqlClient
. Ad esempio, se si eseguiva il cast di un elemento DbConnection
al vecchio tipo SqlConnection, è necessario modificare il cast nel nuovo tipo Microsoft.Data.SqlClient.SqlConnection
.
Category
ASP.NET Core
API interessate
None
Memorizzazione nella cache: tipi "pubternal" di ResponseCaching modificati in tipi interni
In ASP.NET Core 3.0 i tipi "pubternal" in ResponseCaching
sono stati modificati in internal
.
Inoltre, le implementazioni predefinite di IResponseCachingPolicyProvider
e IResponseCachingKeyProvider
non vengono più aggiunte ai servizi come parte del metodo AddResponseCaching
.
Descrizione delle modifiche
In ASP.NET Core i tipi "pubternal" vengono dichiarati come public
, ma risiedono in uno spazio dei nomi con il suffisso .Internal
. Sebbene questi tipi siano pubblici, non hanno criteri di supporto e sono soggetti a modifiche che causano un'interruzione. Sfortunatamente, l'uso accidentale di questi tipi è stato frequente, dando luogo a modifiche che causano interruzioni in questi progetti e limitando la capacità di gestire il framework.
Versione introdotta
3,0
Comportamento precedente
Questi tipi erano visibili pubblicamente, ma non supportati.
Nuovo comportamento
Ora questi tipi sono internal
.
Motivo della modifica
L'ambito internal
è più idoneo per l'assenza di criteri di supporto.
Azione consigliata
Copiare i tipi usati dalla propria app o libreria.
Category
ASP.NET Core
API interessate
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)
Protezione dei dati: DataProtection.Blobs usa nuove API di Archiviazione di Azure
Azure.Extensions.AspNetCore.DataProtection.Blobs
dipende dalle librerie di Archiviazione di Azure. In queste librerie sono stati rinominati gli assembly, i pacchetti e gli spazi dei nomi. A partire da ASP.NET Core 3.0, Azure.Extensions.AspNetCore.DataProtection.Blobs
usa i nuovi pacchetti e le nuove API con prefisso Azure.Storage.
.
Per domande sulle API di Archiviazione di Azure, usare https://github.com/Azure/azure-storage-net. Per informazioni su questo problema, vedere dotnet/aspnetcore#19570.
Versione introdotta
3,0
Comportamento precedente
Il pacchetto faceva riferimento al pacchetto NuGet WindowsAzure.Storage
.
Il pacchetto fa riferimento al pacchetto NuGet Microsoft.Azure.Storage.Blob
.
Nuovo comportamento
Il pacchetto fa riferimento al pacchetto NuGet Azure.Storage.Blob
.
Motivo della modifica
Questa modifica consente a Azure.Extensions.AspNetCore.DataProtection.Blobs
di eseguire la migrazione ai pacchetti di Archiviazione di Azure consigliati.
Azione consigliata
Se è ancora necessario usare le API di Archiviazione di Azure precedenti con ASP.NET Core 3.0, aggiungere una dipendenza diretta al pacchetto WindowsAzure.Storage o Microsoft.Azure.Storage. Questo pacchetto può essere installato insieme alle nuove API Azure.Storage
.
In molti casi, l'aggiornamento implica solo la modifica delle istruzioni using
in modo da usare i nuovi spazi dei nomi:
- 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;
Category
ASP.NET Core
API interessate
None
Hosting: AspNetCoreModule V1 rimosso dal bundle di hosting Windows
A partire da ASP.NET Core 3.0, il bundle di hosting Windows non conterrà AspNetCoreModule (ANCM) V1.
ANCM V2 è compatibile con le versioni precedenti di ANCM OutOfProcess ed è consigliato per l'uso con le app ASP.NET Core 3.0.
Per informazioni, vedere dotnet/aspnetcore#7095.
Versione introdotta
3,0
Comportamento precedente
ANCM V1 è incluso nel bundle di hosting Windows.
Nuovo comportamento
ANCM V1 non è incluso nel bundle di hosting Windows.
Motivo della modifica
ANCM V2 è compatibile con le versioni precedenti di ANCM OutOfProcess ed è consigliato per l'uso con le app ASP.NET Core 3.0.
Azione consigliata
Usare ANCM V2 con le app ASP.NET Core 3.0.
Se è necessario ANCM V1, può essere installato usando il bundle di hosting Windows per ASP.NET Core 2.1 o 2.2.
Questa modifica interromperà il funzionamento delle app ASP.NET Core 3.0 che:
- Hanno acconsentito esplicitamente all'uso di ANCM V1 con
<AspNetCoreModuleName>AspNetCoreModule</AspNetCoreModuleName>
. - Hanno un file web.config personalizzato con
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
.
Category
ASP.NET Core
API interessate
None
Hosting: l'host generico limita l'inserimento del costruttore Startup
Gli unici tipi supportati dall'host generico per l'inserimento del costruttore di classe Startup
sono IHostEnvironment
, IWebHostEnvironment
e IConfiguration
. Le app che usano WebHost
non sono interessate.
Descrizione delle modifiche
Prima di ASP.NET Core 3.0, era possibile usare l'inserimento del costruttore per i tipi arbitrari nel costruttore della classe Startup
. In ASP.NET Core 3.0, lo stack Web è stato migrato alla libreria host generica. La modifica è visibile nel file Program.cs dei modelli:
ASP.NET Core 2.x:
ASP.NET Core 3.0:
Host
usa un contenitore di inserimento delle dipendenze (DI) per compilare l'app. WebHost
usa due contenitori, uno per l'host e uno per l'app. Di conseguenza, il costruttore Startup
non supporta più l'inserimento di servizi personalizzati. È possibile inserire solo IHostEnvironment
, IWebHostEnvironment
e IConfiguration
. Questa modifica evita i problemi di inserimento delle dipendenze, ad esempio la creazione duplicata di un servizio singleton.
Versione introdotta
3,0
Motivo della modifica
Questa modifica è una conseguenza della conversione della piattaforma dello stack Web nella libreria host generica.
Azione consigliata
Inserire i servizi nella firma del metodo Startup.Configure
. Ad esempio:
public void Configure(IApplicationBuilder app, IOptions<MyOptions> options)
Category
ASP.NET Core
API interessate
None
Hosting: reindirizzamento HTTPS abilitato per le app IIS out-of-process
La versione 13.0.19218.0 del modulo ASP.NET Core (ANCM) per l'hosting tramite IIS out-of-process abilita una funzionalità di reindirizzamento HTTPS esistente per le app ASP.NET Core 3.0 e 2.2.
Per informazioni, vedere dotnet/AspNetCore#15243.
Versione introdotta
3,0
Comportamento precedente
Il modello di progetto ASP.NET Core 2.1 ha introdotto per la prima volta il supporto per i metodi middleware HTTPS come UseHttpsRedirection e UseHsts. Per abilitare il reindirizzamento HTTPS era necessaria l'aggiunta della configurazione, poiché le app in fase di sviluppo non usano la porta predefinita 443. HTTP Strict Transport Security (HSTS) è attivo solo se la richiesta usa già HTTPS. Localhost viene ignorato per impostazione predefinita.
Nuovo comportamento
In ASP.NET Core 3.0, lo scenario HTTPS di IIS è stato migliorato. Con il miglioramento, un'app poteva individuare le porte HTTPS del server e far funzionare UseHttpsRedirection
per impostazione predefinita. Il componente in-process eseguiva l'individuazione delle porte con la funzionalità IServerAddresses
; questo influisce solo sulle app ASP.NET Core 3.0 perché la libreria in-process ha la stessa versione del framework. Il componente out-of-process è stato modificato in modo da aggiungere automaticamente la variabile di ambiente ASPNETCORE_HTTPS_PORT
. Questa modifica aveva effetto sulle app ASP.NET Core 2.2 e 3.0, perché il componente out-of-process è condiviso a livello globale. Le app ASP.NET Core 2.1 non sono interessate perché usano una versione precedente di ANCM per impostazione predefinita.
In ASP.NET Core 3.0.1 e 3.1.0 Preview 3 il comportamento precedente è stato modificato in modo da annullare le modifiche funzionali apportate in ASP.NET Core 2.x. Queste modifiche influiscono solo sulle app IIS out-of-process.
Come descritto in precedenza, l'installazione di ASP.NET Core 3.0.0 aveva come effetto collaterale anche l'attivazione del middleware UseHttpsRedirection
nelle app ASP.NET Core 2.x. In ASP.NET Core 3.0.1 e 3.1.0 Preview 3 è stata apportata una modifica ad ANCM in modo che l'installazione non abbia più questo effetto sulle app ASP.NET Core 2.x. La variabile di ambiente ASPNETCORE_HTTPS_PORT
popolata da ANCM in ASP.NET Core 3.0.0 è stata modificata in ASPNETCORE_ANCM_HTTPS_PORT
nelle versioni ASP.NET Core 3.0.1 e 3.1.0 Preview 3. In queste versioni è stato aggiornato anche UseHttpsRedirection
per comprendere sia le nuove variabili che quelle precedenti. ASP.NET Core 2.x non verrà aggiornato. Di conseguenza, ripristina il comportamento precedente di essere disabilitato per impostazione predefinita.
Motivo della modifica
Miglioramento della funzionalità di ASP.NET Core 3.0.
Azione consigliata
Se si vuole che tutti i client usino HTTPS, non è necessario alcun intervento. Per consentire ad alcuni client di usare HTTP, eseguire una delle operazioni seguenti:
Rimuovere le chiamate a
UseHttpsRedirection
eUseHsts
dal metodoStartup.Configure
del progetto e ridistribuire l'app.Nel file web.config impostare la variabile di ambiente
ASPNETCORE_HTTPS_PORT
su una stringa vuota. Questa modifica può essere apportata direttamente nel server senza ridistribuire l'app. Ad esempio:<aspNetCore processPath="dotnet" arguments=".\WebApplication3.dll" stdoutLogEnabled="false" stdoutLogFile="\\?\%home%\LogFiles\stdout" > <environmentVariables> <environmentVariable name="ASPNETCORE_HTTPS_PORT" value="" /> </environmentVariables> </aspNetCore>
UseHttpsRedirection
può essere ancora:
- Attivato manualmente in ASP.NET Core 2.x impostando la variabile di ambiente
ASPNETCORE_HTTPS_PORT
sul numero di porta appropriato, che nella maggior parte degli scenari di produzione è 443. - Disattivato in ASP.NET Core 3.x definendo
ASPNETCORE_ANCM_HTTPS_PORT
con un valore stringa vuoto. Questo valore si imposta nello stesso modo dell'esempioASPNETCORE_HTTPS_PORT
precedente.
I computer che eseguono app ASP.NET Core 3.0.0 devono installare il runtime ASP.NET Core 3.0.1 prima di installare il modulo ANCM di ASP.NET Core 3.1.0 Preview 3. Questo garantisce che UseHttpsRedirection
continui a funzionare come previsto per le app ASP.NET Core 3.0.
In Servizio app di Azure, ANCM viene distribuito separatamente rispetto al runtime a causa della sua natura globale. ANCM è stato distribuito in Azure con queste modifiche dopo la distribuzione di ASP.NET Core 3.0.1 e 3.1.0.
Category
ASP.NET Core
API interessate
HttpsPolicyBuilderExtensions.UseHttpsRedirection(IApplicationBuilder)
Hosting: tipi IHostingEnvironment e IApplicationLifetime sostituiti
Sono stati introdotti nuovi tipi per sostituire i tipi IHostingEnvironment
e IApplicationLifetime
esistenti.
Versione introdotta
3,0
Comportamento precedente
Esistevano due tipi IHostingEnvironment
e IApplicationLifetime
diversi provenienti da Microsoft.Extensions.Hosting
e Microsoft.AspNetCore.Hosting
.
Nuovo comportamento
I tipi precedenti sono stati contrassegnati come obsoleti e sostituiti con nuovi tipi.
Motivo della modifica
Quando Microsoft.Extensions.Hosting
è stato introdotto in ASP.NET Core 2.1, alcuni tipi come IHostingEnvironment
e IApplicationLifetime
sono stati copiati da Microsoft.AspNetCore.Hosting
. A seguito di alcune modifiche di ASP.NET Core 3.0, le app includono entrambi gli spazi dei nomi Microsoft.Extensions.Hosting
e Microsoft.AspNetCore.Hosting
. Qualsiasi uso di questi tipi duplicati causa un errore del compilatore "riferimento ambiguo" quando viene fatto riferimento a entrambi gli spazi dei nomi.
Azione consigliata
Sostituire tutti gli utilizzi dei tipi precedenti con i nuovi tipi introdotti, come indicato di seguito:
Tipi obsoleti (avviso):
- Microsoft.Extensions.Hosting.IHostingEnvironment
- Microsoft.AspNetCore.Hosting.IHostingEnvironment
- Microsoft.Extensions.Hosting.IApplicationLifetime
- Microsoft.AspNetCore.Hosting.IApplicationLifetime
- Microsoft.Extensions.Hosting.EnvironmentName
- Microsoft.AspNetCore.Hosting.EnvironmentName
Nuovi tipi:
- Microsoft.Extensions.Hosting.IHostEnvironment
Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment
- Microsoft.Extensions.Hosting.IHostApplicationLifetime
- Microsoft.Extensions.Hosting.Environments
I nuovi metodi di estensione IHostEnvironment
IsDevelopment
e IsProduction
si trovano nello spazio dei nomi Microsoft.Extensions.Hosting
. Può essere necessario aggiungere tale spazio dei nomi al progetto.
Category
ASP.NET Core
API interessate
- Microsoft.AspNetCore.Hosting.EnvironmentName
- Microsoft.AspNetCore.Hosting.IApplicationLifetime
- Microsoft.AspNetCore.Hosting.IHostingEnvironment
- Microsoft.Extensions.Hosting.EnvironmentName
- Microsoft.Extensions.Hosting.IApplicationLifetime
- Microsoft.Extensions.Hosting.IHostingEnvironment
Hosting: ObjectPoolProvider rimosso dalle dipendenze di WebHostBuilder
Per rendere ASP.NET Core più efficiente, ObjectPoolProvider
è stato rimosso dal set di dipendenze principale. Ora gli specifici componenti che si basano su ObjectPoolProvider
vengono aggiunti automaticamente.
Per informazioni, vedere dotnet/aspnetcore#5944.
Versione introdotta
3,0
Comportamento precedente
WebHostBuilder
fornisce ObjectPoolProvider
per impostazione predefinita nel contenitore di inserimento delle dipendenze.
Nuovo comportamento
WebHostBuilder
non fornisce più ObjectPoolProvider
per impostazione predefinita nel contenitore di inserimento delle dipendenze.
Motivo della modifica
Questa modifica è stata apportata per rendere ASP.NET Core più efficiente.
Azione consigliata
Se il componente richiede ObjectPoolProvider
, va aggiunto alle dipendenze tramite IServiceCollection
.
Category
ASP.NET Core
API interessate
None
HTTP: estendibilità di DefaultHttpContext rimossa
Nell'ambito dei miglioramenti delle prestazioni di ASP.NET Core 3.0, l'estendibilità di DefaultHttpContext
è stata rimossa. La classe è ora sealed
. Per altre informazioni, vedere dotnet/aspnetcore#6504.
Se gli unit test usano Mock<DefaultHttpContext>
, usare Mock<HttpContext>
o new DefaultHttpContext()
.
Per informazioni, vedere dotnet/aspnetcore#6534.
Versione introdotta
3,0
Comportamento precedente
Le classi possono derivare da DefaultHttpContext
.
Nuovo comportamento
Le classi non possono derivare da DefaultHttpContext
.
Motivo della modifica
Inizialmente, l'estendibilità è stata fornita per consentire il pooling di HttpContext
, ma ha introdotto una complessità non necessaria e ha impedito altre ottimizzazioni.
Azione consigliata
Se si usa Mock<DefaultHttpContext>
negli unit test, iniziare a usare Mock<HttpContext>
.
Category
ASP.NET Core
API interessate
Microsoft.AspNetCore.Http.DefaultHttpContext
HTTP: costanti HeaderNames modificate in statiche di sola lettura
A partire da ASP.NET Core 3.0 Preview 5, i campi in Microsoft.Net.Http.Headers.HeaderNames sono passati da const
a static readonly
.
Per informazioni, vedere dotnet/aspnetcore#9514.
Versione introdotta
3,0
Comportamento precedente
Questi campi erano const
.
Nuovo comportamento
Ora questi campi sono static readonly
.
Motivo della modifica
La modifica:
- Impedisce che i valori vengano incorporati tra limiti di assembly, consentendo la correzione dei valori in base alle esigenze.
- Permette di eseguire controlli di uguaglianza dei riferimenti più veloci.
Azione consigliata
Ricompilare per la versione 3.0. Il codice sorgente che usa questi campi nei modi seguenti non può più farlo:
- Come argomento di un attributo
- Come
case
in un'istruzioneswitch
- Quando si definisce un altro valore
const
Per ovviare a questa modifica che causa un'interruzione, passare all'uso di costanti del nome di intestazione autodefinite o valori letterali stringa.
Category
ASP.NET Core
API interessate
Microsoft.Net.Http.Headers.HeaderNames
HTTP: modifiche all'infrastruttura del corpo della risposta
L'infrastruttura che supporta il corpo della risposta HTTP è stata modificata. Se si usa HttpResponse
direttamente, non è necessario apportare modifiche al codice. Continuare a leggere se si esegue il wrapping o la sostituzione di HttpResponse.Body
o si accede a HttpContext.Features
.
Versione introdotta
3,0
Comportamento precedente
Al corpo della risposta HTTP erano associate tre API:
IHttpResponseFeature.Body
IHttpSendFileFeature.SendFileAsync
IHttpBufferingFeature.DisableResponseBuffering
Nuovo comportamento
Se si sostituisce HttpResponse.Body
, sostituisce l'intera interfaccia IHttpResponseBodyFeature
con un wrapper intorno al flusso specificato, usando StreamResponseBodyFeature
per fornire implementazioni predefinite per tutte le API previste. Il ripristino del flusso originale annulla questa modifica.
Motivo della modifica
La motivazione è combinare le API del corpo della risposta in un'unica nuova interfaccia di funzionalità.
Azione consigliata
Usare IHttpResponseBodyFeature
dove in precedenza si usava IHttpResponseFeature.Body
, IHttpSendFileFeature
o IHttpBufferingFeature
.
Category
ASP.NET Core
API interessate
- Microsoft.AspNetCore.Http.Features.IHttpBufferingFeature
- Microsoft.AspNetCore.Http.Features.IHttpResponseFeature.Body
- Microsoft.AspNetCore.Http.Features.IHttpSendFileFeature
HTTP: alcuni valori predefiniti SameSite per i cookie sono stati modificati in None
SameSite
è un'opzione per i cookie utile per mitigare alcuni attacchi di richiesta intersito falsa. Quando questa opzione è stata introdotta per la prima volta, nelle varie API ASP.NET Core sono state usate impostazioni predefinite incoerenti. Questa incoerenza ha generato risultati confusi. A partire da ASP.NET Core 3.0, queste impostazioni predefinite sono più allineate. È necessario acconsentire esplicitamente a questa funzionalità per ogni singolo componente.
Versione introdotta
3,0
Comportamento precedente
API ASP.NET Core simili usavano valori predefiniti di SameSiteMode diversi. Un esempio di questa incoerenza compare in HttpResponse.Cookies.Append(String, String)
e HttpResponse.Cookies.Append(String, String, CookieOptions)
, che usavano rispettivamente i valori predefiniti SameSiteMode.None
e SameSiteMode.Lax
.
Nuovo comportamento
Tutte le API interessate usano per impostazione predefinita SameSiteMode.None
.
Motivo della modifica
Il valore predefinito è stato modificato per rendere SameSite
una funzionalità che prevede il consenso esplicito.
Azione consigliata
Ogni componente che genera cookie deve decidere se SameSite
è appropriato per i propri scenari. Esaminare l'utilizzo delle API interessate e riconfigurare SameSite
in base alle esigenze.
Category
ASP.NET Core
API interessate
HTTP: I/O sincrono disabilitato in tutti i server
A partire da ASP.NET Core 3.0, le operazioni server sincrone sono disabilitate per impostazione predefinita.
Descrizione delle modifiche
AllowSynchronousIO
è un'opzione presente in ogni server che abilita o disabilita le API di I/O sincrone come HttpRequest.Body.Read
, HttpResponse.Body.Write
e Stream.Flush
. Queste API sono state a lungo la causa di blocchi delle app e mancanza di risorse dei thread. A partire da ASP.NET Core 3.0 Preview 3, queste operazioni sincrone sono disabilitate per impostazione predefinita.
Server interessati:
- Kestrel
- HttpSys
- IIS in-process
- TestServer
Si prevedono errori simili a:
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.
Ogni server ha un'opzione AllowSynchronousIO
che controlla questo comportamento e il valore predefiniti per tutti i server è ora false
.
Come mitigazione temporanea, il comportamento può anche essere sottoposto a override in base a singole richieste. Ad esempio:
var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
}
Se si verificano problemi con un elemento TextWriter
o un altro flusso che chiama un'API sincrona in Dispose
, chiamare invece la nuova API DisposeAsync
.
Per informazioni, vedere dotnet/aspnetcore#7644.
Versione introdotta
3,0
Comportamento precedente
Le API HttpRequest.Body.Read
, HttpResponse.Body.Write
e Stream.Flush
erano consentite per impostazione predefinita.
Nuovo comportamento
Queste API sincrone non sono consentite per impostazione predefinita:
Si prevedono errori simili a:
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.
Motivo della modifica
Queste API sincrone sono state a lungo la causa di blocchi delle app e mancanza di risorse dei thread. A partire da ASP.NET Core 3.0 Preview 3, le operazioni sincrone sono disabilitate per impostazione predefinita.
Azione consigliata
Usare le versioni asincrone dei metodi. Come mitigazione temporanea, il comportamento può anche essere sottoposto a override in base a singole richieste.
var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
}
Category
ASP.NET Core
API interessate
Identity: overload del metodo AddDefaultUI rimosso
A partire da ASP.NET Core 3.0, l'overload del metodo IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder,UIFramework) non esiste più.
Versione introdotta
3,0
Motivo della modifica
Questa modifica è stata il risultato dell'adozione della funzionalità degli asset Web statici.
Azione consigliata
Chiamare IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder) anziché l'overload che accetta due argomenti. Se si usa Bootstrap 3, aggiungere anche la riga seguente a un elemento <PropertyGroup>
nel file di progetto:
<IdentityUIFrameworkVersion>Bootstrap3</IdentityUIFrameworkVersion>
Category
ASP.NET Core
API interessate
IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder,UIFramework)
Identity: versione predefinita di Bootstrap dell'interfaccia utente modificata
A partire da ASP.NET Core 3.0, l'interfaccia utente di Identity usa per impostazione predefinita la versione 4 di Bootstrap.
Versione introdotta
3,0
Comportamento precedente
La chiamata al metodo services.AddDefaultIdentity<IdentityUser>().AddDefaultUI();
equivaleva a services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap3);
Nuovo comportamento
La chiamata al metodo services.AddDefaultIdentity<IdentityUser>().AddDefaultUI();
equivale a services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap4);
Motivo della modifica
Bootstrap 4 è stato rilasciato durante il periodo di ASP.NET Core 3.0.
Azione consigliata
Si è interessati da questa modifica se si usa l'interfaccia utente predefinita di Identity e la si è aggiunta in Startup.ConfigureServices
, come illustrato nell'esempio seguente:
services.AddDefaultIdentity<IdentityUser>().AddDefaultUI();
Effettua una delle seguenti azioni:
Eseguire la migrazione dell'app all'uso di Bootstrap 4 usando la guida alla migrazione.
Aggiornare
Startup.ConfigureServices
in modo da imporre l'utilizzo di Bootstrap 3. Ad esempio:services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap3);
Category
ASP.NET Core
API interessate
None
Identity: SignInAsync genera un'eccezione per l'identità non autenticata
Per impostazione predefinita, SignInAsync
genera un'eccezione per le entità di sicurezza/identità in cui IsAuthenticated
è false
.
Versione introdotta
3,0
Comportamento precedente
SignInAsync
accetta qualsiasi entità di sicurezza/identità, incluse le identità in cui IsAuthenticated
è false
.
Nuovo comportamento
Per impostazione predefinita, SignInAsync
genera un'eccezione per le entità di sicurezza/identità in cui IsAuthenticated
è false
. È disponibile un nuovo flag per eliminare questo comportamento, ma il comportamento predefinito è cambiato.
Motivo della modifica
Il comportamento precedente causava problemi perché, per impostazione predefinita, queste entità erano rifiutate da [Authorize]
/ RequireAuthenticatedUser()
.
Azione consigliata
In ASP.NET Core 3.0 Preview 6 c'è un flag RequireAuthenticatedSignIn
in AuthenticationOptions
che per impostazione predefinita è true
. Impostare questo flag su false
per ripristinare il comportamento precedente.
Category
ASP.NET Core
API interessate
None
Identity: il costruttore SignInManager accetta un nuovo parametro
A partire da ASP.NET Core 3.0, al costruttore SignInManager
è stato aggiunto un nuovo parametro IUserConfirmation<TUser>
. Per altre informazioni, vedere dotnet/aspnetcore#8356.
Versione introdotta
3,0
Motivo della modifica
Il motivo della modifica è stato l'aggiunta del supporto per i nuovi flussi di posta elettronica/conferma in Identity.
Azione consigliata
Se si costruisce manualmente un elemento SignInManager
, fornire un'implementazione di IUserConfirmation
o recuperarne una da fornire dall'inserimento delle dipendenze.
Category
ASP.NET Core
API interessate
Identity: l'interfaccia utente usa la funzionalità degli asset Web statici
In ASP.NET Core 3.0 è stata introdotta una funzionalità di asset Web statici e l'interfaccia utente di Identity l'ha adottata.
Descrizione delle modifiche
In seguito all'adozione della funzionalità degli asset Web statici nell'interfaccia utente di Identity:
- La selezione del framework viene eseguita usando la proprietà
IdentityUIFrameworkVersion
nel file di progetto. - Bootstrap 4 è il framework di interfaccia utente predefinito per l'interfaccia utente di Identity. Bootstrap 3 ha raggiunto la fine del ciclo di vita ed è consigliabile eseguire la migrazione a una versione supportata.
Versione introdotta
3,0
Comportamento precedente
Il framework di interfaccia utente predefinito per l'interfaccia utente di Identity era Bootstrap 3. Si poteva configurare il framework di interfaccia utente usando un parametro per la chiamata al metodo AddDefaultUI
in Startup.ConfigureServices
.
Nuovo comportamento
Il framework di interfaccia utente predefinito per l'interfaccia utente di Identity è Bootstrap 4. Il framework di interfaccia utente deve essere configurato nel file di progetto anziché nella chiamata al metodo AddDefaultUI
.
Motivo della modifica
L'adozione della funzionalità degli asset Web statici richiedeva che la configurazione del framework di interfaccia utente passasse a MSBuild. La decisione su quale framework incorporare è una decisione da prendere in fase di compilazione, non in fase di runtime.
Azione consigliata
Esaminare l'interfaccia utente del sito per assicurarsi che i nuovi componenti Bootstrap 4 siano compatibili. Se necessario, usare la proprietà IdentityUIFrameworkVersion
di MSBuild per ripristinare Bootstrap 3. Aggiungere la proprietà a un elemento <PropertyGroup>
nel file di progetto:
<IdentityUIFrameworkVersion>Bootstrap3</IdentityUIFrameworkVersion>
Category
ASP.NET Core
API interessate
IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder, UIFramework)
Kestrel: adapter di connessione rimossi
Nell'ambito della modifica delle API "pubternal" in public
, il concetto di IConnectionAdapter
è stato rimosso da Kestrel. Gli adapter di connessione sono stati sostituiti dal middleware di connessione (simile al middleware HTTP nella pipeline di ASP.NET Core, ma per le connessioni di livello inferiore). La registrazione delle connessioni e HTTPS sono stati spostati dagli adapter di connessione al middleware di connessione. Questi metodi di estensione dovrebbero continuare a funzionare senza problemi, ma i dettagli di implementazione sono cambiati.
Per altre informazioni, vedere dotnet/aspnetcore#11412. Per informazioni, vedere dotnet/aspnetcore#11475.
Versione introdotta
3,0
Comportamento precedente
I componenti di estendibilità di Kestrel erano creati usando IConnectionAdapter
.
Nuovo comportamento
I componenti di estendibilità di Kestrel vengono creati come middleware.
Motivo della modifica
Questa modifica ha lo scopo di offrire un'architettura di estendibilità più flessibile.
Azione consigliata
Convertire tutte le implementazioni di IConnectionAdapter
all'uso del nuovo modello middleware, come illustrato qui.
Category
ASP.NET Core
API interessate
Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal.IConnectionAdapter
Kestrel: assembly HTTPS vuoto rimosso
L'assembly Microsoft.AspNetCore.Server.Kestrel.Https è stato rimosso.
Versione introdotta
3,0
Motivo della modifica
In ASP.NET Core 2.1, il contenuto di Microsoft.AspNetCore.Server.Kestrel.Https
è stato spostato in Microsoft.AspNetCore.Server.Kestrel.Core. Questa modifica è stata eseguita in una modalità che non causa interruzioni usando attributi [TypeForwardedTo]
.
Azione consigliata
- Le librerie che fanno riferimento a
Microsoft.AspNetCore.Server.Kestrel.Https
2.0 devono aggiornare tutte le dipendenze di ASP.NET Core alla versione 2.1 o successiva. In caso contrario, possono bloccarsi quando vengono caricate in un'app ASP.NET Core 3.0. - Le app e le librerie destinate ad ASP.NET Core 2.1 e versioni successive devono rimuovere qualunque riferimento diretto al pacchetto NuGet
Microsoft.AspNetCore.Server.Kestrel.Https
.
Category
ASP.NET Core
API interessate
None
Kestrel: intestazioni Trailer della richiesta spostate in una nuova raccolta
Nelle versioni precedenti, Kestrel aggiungeva intestazioni Trailer in blocchi HTTP/1.1 nella raccolta delle intestazioni delle richieste quando il corpo della richiesta veniva letto in corrispondenza della fine. Questo comportamento causava preoccupazioni sull'ambiguità tra intestazioni e trailer. È stata presa la decisione di spostare i trailer in una nuova raccolta.
I trailer delle richieste HTTP/2 non erano disponibili in ASP.NET Core 2.2, ma ora sono disponibili in questa nuova raccolta in ASP.NET Core 3.0.
Sono stati aggiunti nuovi metodi di estensione della richiesta per accedere a questi trailer.
I trailer HTTP/1.1 sono disponibili dopo la lettura dell'intero corpo della richiesta.
I trailer HTTP/2 sono disponibili una volta ricevuti dal client. Il client non invierà i trailer finché l'intero corpo della richiesta non è stato almeno memorizzato nel buffer dal server. Può essere necessario leggere il corpo della richiesta per liberare spazio di buffer. I trailer sono sempre disponibili se si legge il corpo della richiesta nella parte finale. I trailer contrassegnano la fine del corpo.
Versione introdotta
3,0
Comportamento precedente
Le intestazioni Trailer della richiesta venivano aggiunte alla raccolta HttpRequest.Headers
.
Nuovo comportamento
Le intestazioni Trailer della richiesta non sono presenti nella raccolta HttpRequest.Headers
. Usare i metodi di estensione seguenti in HttpRequest
per accedervi:
GetDeclaredTrailers()
- Ottiene l'intestazione "Trailer" della richiesta che elenca i trailer previsti dopo il corpo.SupportsTrailers()
- Indica se la richiesta supporta la ricezione di intestazioni Trailer.CheckTrailersAvailable()
- Determina se la richiesta supporta i trailer e se sono disponibili per la lettura.GetTrailer(string trailerName)
- Ottiene l'intestazione Trailer richiesta dalla risposta.
Motivo della modifica
I trailer sono una funzionalità chiave in scenari come gRPC. L'unione dei trailer alle intestazioni delle richieste causava confusione negli utenti.
Azione consigliata
Usare i metodi di estensione correlati ai trailer in HttpRequest
per accedere ai trailer.
Category
ASP.NET Core
API interessate
Kestrel: astrazioni di trasporto rimosse e rese pubbliche
Nel quadro dell'abbandono delle API "pubternal", le API del livello di trasporto di Kestrel vengono esposte come interfaccia pubblica nella libreria Microsoft.AspNetCore.Connections.Abstractions
.
Versione introdotta
3,0
Comportamento precedente
- Le astrazioni correlate al trasporto erano disponibili nella libreria
Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions
. - Era disponibile la proprietà
ListenOptions.NoDelay
.
Nuovo comportamento
- L'interfaccia
IConnectionListener
è stata introdotta nella libreriaMicrosoft.AspNetCore.Connections.Abstractions
per esporre le funzionalità più usate dalla libreria...Transport.Abstractions
. - Ora nelle opzioni di trasporto è disponibile
NoDelay
(LibuvTransportOptions
eSocketTransportOptions
). SchedulingMode
non è più disponibile.
Motivo della modifica
ASP.NET Core 3.0 ha abbandonato l'uso delle API "pubternal".
Azione consigliata
Category
ASP.NET Core
API interessate
None
Localizzazione: ResourceManagerWithCultureStringLocalizer e WithCulture contrassegnati come obsoleti
La classe ResourceManagerWithCultureStringLocalizer e il membro dell'interfaccia WithCulture sono spesso fonte di confusione per gli utenti della localizzazione, in particolare quando creano la propria implementazione di IStringLocalizer
. Questi elementi danno all'utente l'impressione che un'istanza di IStringLocalizer
sia per lingua e per risorsa. In realtà, le istanze devono essere solo per risorsa. Il linguaggio cercato è determinato dall'elemento CultureInfo.CurrentUICulture
in fase di esecuzione. Per eliminare la causa di confusione, le API sono state contrassegnate come obsolete in ASP.NET Core 3.0 Preview 3. Le API verranno rimosse in una versione futura.
Per il contesto, vedere dotnet/aspnetcore#3324. Per informazioni, vedere dotnet/aspnetcore#7756.
Versione introdotta
3,0
Comportamento precedente
I metodi non sono stati contrassegnati come Obsolete
.
Nuovo comportamento
I metodi sono contrassegnati come Obsolete
.
Motivo della modifica
Le API rappresentavano un caso d'uso non consigliato. C'era confusione sulla progettazione della localizzazione.
Azione consigliata
È consigliabile usare ResourceManagerStringLocalizer
. Lasciare che le impostazioni cultura siano impostate da CurrentCulture
. Se non è possibile, creare e usare una copia di ResourceManagerWithCultureStringLocalizer.
Category
ASP.NET Core
API interessate
Registrazione: classe DebugLogger resa interna
Prima di ASP.NET Core 3.0, il modificatore di accesso di DebugLogger
era public
. In ASP.NET Core 3.0 il modificatore di accesso è diventato internal
.
Versione introdotta
3,0
Motivo della modifica
La modifica è stata apportata per:
- Garantire la coerenza con altre implementazioni del logger, ad esempio
ConsoleLogger
. - Ridurre la superficie dell'API.
Azione consigliata
Usare il metodo di estensione ILoggingBuilder
di AddDebug per abilitare la registrazione di debug. DebugLoggerProvider è ancora public
, nel caso in cui il servizio debba essere registrato manualmente.
Category
ASP.NET Core
API interessate
Microsoft.Extensions.Logging.Debug.DebugLogger
MVC: suffisso Async rimosso dai nomi delle azioni del controller
Come parte della soluzione del problema dotnet/aspnetcore#4849, ASP.NET Core MVC elimina il suffisso Async
dai nomi delle azioni per impostazione predefinita. A partire da ASP.NET Core 3.0, questa modifica influisce sia sul routing che sulla generazione di collegamenti.
Versione introdotta
3,0
Comportamento precedente
Considerare il controller ASP.NET Core MVC seguente:
public class ProductController : Controller
{
public async IActionResult ListAsync()
{
var model = await DbContext.Products.ToListAsync();
return View(model);
}
}
L'azione è instradabile tramite Product/ListAsync
. Per la generazione di collegamenti occorre specificare il suffisso Async
. Ad esempio:
<a asp-controller="Product" asp-action="ListAsync">List</a>
Nuovo comportamento
In ASP.NET Core 3.0 l'azione può essere instradata tramite Product/List
. Il codice di generazione del collegamento deve omettere il suffisso Async
. Ad esempio:
<a asp-controller="Product" asp-action="List">List</a>
Questa modifica non influisce sui nomi specificati usando l'attributo [ActionName]
. È possibile disabilitare il nuovo comportamento impostando MvcOptions.SuppressAsyncSuffixInActionNames
su false
in Startup.ConfigureServices
:
services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});
Motivo della modifica
Per convenzione, i metodi .NET asincroni hanno il suffisso Async
. Tuttavia, quando un metodo definisce un'azione MVC, non è consigliabile usare il suffisso Async
.
Azione consigliata
Se per l'app è necessario che le azioni MVC conservino il suffisso Async
del nome, scegliere una delle mitigazioni seguenti:
- Usare l'attributo
[ActionName]
per mantenere il nome originale. - Disabilitare completamente la ridenominazione impostando
MvcOptions.SuppressAsyncSuffixInActionNames
sufalse
inStartup.ConfigureServices
:
services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});
Category
ASP.NET Core
API interessate
None
MVC: JsonResult spostato in Microsoft.AspNetCore.Mvc.Core
JsonResult
è stato spostato nell'assembly Microsoft.AspNetCore.Mvc.Core
. Questo tipo era definito in Microsoft.AspNetCore.Mvc.Formatters.Json. Per risolvere questo problema per la maggior parte degli utenti, in Microsoft.AspNetCore.Mvc.Formatters.Json
è stato aggiunto un attributo [TypeForwardedTo] a livello di assembly. Le app che usano librerie di terze parti possono riscontrare problemi.
Versione introdotta
3.0 Preview 6
Comportamento precedente
Un'app che usa una libreria basata su 2.2 viene compilata correttamente.
Nuovo comportamento
La compilazione di un'app che usa una libreria basata su 2.2 non riesce. Viene visualizzato un errore contenente un errore simile al seguente:
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'
Per un esempio di questo tipo di problema, vedere dotnet/aspnetcore#7220.
Motivo della modifica
Modifiche a livello di piattaforma alla composizione di ASP.NET Core, come descritto in aspnet/Announcements#325.
Azione consigliata
Potrebbe essere necessario ricompilare le librerie compilate per la versione 2.2 di Microsoft.AspNetCore.Mvc.Formatters.Json
per risolvere il problema per tutti i consumer. Se si è interessati dal problema, rivolgersi all'autore della libreria. Chiedere la ricompilazione della libreria per la destinazione ASP.NET Core 3.0.
Category
ASP.NET Core
API interessate
Microsoft.AspNetCore.Mvc.JsonResult
MVC: strumento di precompilazione deprecato
In ASP.NET Core 1.1 è stato introdotto il pacchetto Microsoft.AspNetCore.Mvc.Razor.ViewCompilation
(strumento di precompilazione MVC) per aggiungere il supporto per la compilazione in fase di pubblicazione dei file Razor (.cshtml). In ASP.NET Core 2.1 è stato introdotto Razor SDK, per ampliare le funzionalità dello strumento di precompilazione. Razor SDK ha aggiunto il supporto per la compilazione di file Razor in fase di compilazione e pubblicazione. L'SDK verifica la correttezza dei file.cshtml in fase di compilazione, migliorando inoltre il tempo di avvio dell'app. Razor SDK è attivato per impostazione predefinita e non è necessario alcun intervento per iniziare a usarlo.
In ASP.NET Core 3.0, lo strumento di precompilazione MVC di ASP.NET Core 1.1 è stato rimosso. Le versioni precedenti del pacchetto continueranno a ricevere importanti correzioni di bug e per sicurezza nelle versioni patch.
Versione introdotta
3,0
Comportamento precedente
Il pacchetto Microsoft.AspNetCore.Mvc.Razor.ViewCompilation
era usato per precompilare le visualizzazioni Razor di MVC.
Nuovo comportamento
Razor SDK supporta questa funzionalità in modo nativo. Il pacchetto Microsoft.AspNetCore.Mvc.Razor.ViewCompilation
non viene più aggiornato.
Motivo della modifica
Razor SDK offre più funzionalità e verifica la correttezza dei file .cshtml in fase di compilazione. L'SDK migliora anche il tempo di avvio dell'app.
Azione consigliata
Per gli utenti di ASP.NET Core 2.1 o versione successiva, eseguire l'aggiornamento in modo da usare il supporto nativo per la precompilazione in Razor SDK. Se la presenza di bug o la mancanza di funzionalità impediscono la migrazione a Razor SDK, aprire un problema in dotnet/aspnetcore.
Category
ASP.NET Core
API interessate
None
MVC: tipi "pubternal" modificati in interni
In ASP.NET Core 3.0 tutti i tipi "pubternal" di MVC sono stati aggiornati per essere public
in uno spazio dei nomi supportato oppure internal
in base alle esigenze.
Descrizione delle modifiche
In ASP.NET Core i tipi "pubternal" vengono dichiarati come public
, ma risiedono in uno spazio dei nomi con suffisso .Internal
. Sebbene questi tipi siano public
, non hanno criteri di supporto e sono soggetti a modifiche che causano un'interruzione. Sfortunatamente, l'uso accidentale di questi tipi è stato frequente, dando luogo a modifiche che causano interruzioni in questi progetti e limitando la capacità di gestire il framework.
Versione introdotta
3,0
Comportamento precedente
Alcuni tipi in MVC erano public
, ma in uno spazio dei nomi .Internal
. Questi tipi non avevano criteri di supporto ed erano soggetti a modifiche causano un'interruzione.
Nuovo comportamento
Tutti questi tipi vengono aggiornati in modo che siano public
in uno spazio dei nomi supportato oppure contrassegnati come internal
.
Motivo della modifica
L'uso accidentale dei tipi "pubternal" è stato frequente, dando luogo a modifiche che causano un'interruzione in questi progetti e limitando la capacità di gestire il framework.
Azione consigliata
Se si usano tipi che sono diventati realmente public
e sono stati spostati in un nuovo spazio dei nomi supportato, aggiornare i riferimenti in modo che corrispondano ai nuovi spazi dei nomi.
Se si usano tipi che sono stati contrassegnati come internal
, sarà necessario trovare un'alternativa. I tipi precedentemente "pubternal" non sono mai stati supportati per l'utilizzo pubblico. Se in questi spazi dei nomi sono presenti tipi specifici di importanza critica per le app, segnalare il problema alla pagina dotnet/aspnetcore. Si potrebbe valutare di rendere public
i tipi richiesti.
Category
ASP.NET Core
API interessate
Questa modifica include i tipi negli spazi dei nomi seguenti:
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: shim di compatibilità API Web rimosso
A partire da ASP.NET Core 3.0, il pacchetto Microsoft.AspNetCore.Mvc.WebApiCompatShim
non è più disponibile.
Descrizione delle modifiche
Il pacchetto Microsoft.AspNetCore.Mvc.WebApiCompatShim
(WebApiCompatShim) offre compatibilità parziale in ASP.NET Core con l'API Web 2 di ASP.NET 4.x per semplificare la migrazione delle implementazioni di API Web esistenti ad ASP.NET Core. Tuttavia, le app che usano WebApiCompatShim non traggono vantaggio dalle funzionalità correlate alle API disponibili nelle versioni recenti di ASP.NET Core. Tali funzionalità includono il miglioramento della generazione della specifica OpenAPI, la gestione degli errori standardizzata e la generazione di codice client. Per focalizzare meglio le iniziative rivolte alle API nella versione 3.0, WebApiCompatShim è stato rimosso. Le app esistenti che usano WebApiCompatShim devono eseguire la migrazione al modello più recente di [ApiController]
.
Versione introdotta
3,0
Motivo della modifica
Lo shim di compatibilità dell'API Web era uno strumento di migrazione. Limita l'accesso degli utenti alle nuove funzionalità aggiunte in ASP.NET Core.
Azione consigliata
Rimuovere l'utilizzo di questo shim ed eseguire direttamente la migrazione alla funzionalità analoga in ASP.NET Core stesso.
Category
ASP.NET Core
API interessate
Microsoft.AspNetCore.Mvc.WebApiCompatShim
Razor: API RazorTemplateEngine rimossa
L'API RazorTemplateEngine
è stata rimossa e sostituita con Microsoft.AspNetCore.Razor.Language.RazorProjectEngine
.
Per informazioni, vedere il problema GitHub dotnet/aspnetcore#25215.
Versione introdotta
3,0
Comportamento precedente
È possibile creare un motore di modelli e usarlo per analizzare e generare codice per i file Razor.
Nuovo comportamento
È possibile creare un'API RazorProjectEngine
a cui fornire lo stesso tipo di informazioni di RazorTemplateEngine
per analizzare e generare codice per i file Razor. RazorProjectEngine
fornisce anche livelli di configurazione aggiuntivi.
Motivo della modifica
L'API RazorTemplateEngine
era accoppiata troppo strettamente alle implementazioni esistenti. Questo accoppiamento stretto generava ulteriori problemi nel tentativo di configurare correttamente una pipeline di analisi/generazione Razor.
Azione consigliata
Usare RazorProjectEngine
invece di RazorTemplateEngine
. Si considerino gli esempi seguenti.
Creare e configurare 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
});
Generare codice per un file Razor
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();
Category
ASP.NET Core
API interessate
RazorTemplateEngine
RazorTemplateEngineOptions
Razor: compilazione in fase di esecuzione spostata in un pacchetto
Il supporto per la compilazione in fase di esecuzione di visualizzazioni Razor e Razor Pages è stato spostato in un pacchetto separato.
Versione introdotta
3,0
Comportamento precedente
La compilazione in fase di esecuzione è disponibile senza bisogno di altri pacchetti.
Nuovo comportamento
La funzionalità è stata spostata nel pacchetto Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
In precedenza erano disponibili le API seguenti in Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions
per supportare la compilazione in fase di esecuzione. Ora le API sono disponibili tramite Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.MvcRazorRuntimeCompilationOptions
.
RazorViewEngineOptions.FileProviders
è oraMvcRazorRuntimeCompilationOptions.FileProviders
RazorViewEngineOptions.AdditionalCompilationReferences
è oraMvcRazorRuntimeCompilationOptions.AdditionalReferencePaths
Inoltre, Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions.AllowRecompilingViewsOnFileChange
è stato rimosso. La ricompilazione alla modifica dei file è abilitata per impostazione predefinita facendo riferimento al pacchetto Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
.
Motivo della modifica
Questa modifica è stata necessaria per rimuovere la dipendenza del framework condiviso di ASP.NET Core da Roslyn.
Azione consigliata
Per le app che richiedono la compilazione in fase di esecuzione o la ricompilazione dei file Razor occorre seguire questa procedura:
Aggiungere un riferimento al pacchetto
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
.Aggiornare il metodo
Startup.ConfigureServices
del progetto per includere una chiamata aAddRazorRuntimeCompilation
. Ad esempio:services.AddMvc() .AddRazorRuntimeCompilation();
Category
ASP.NET Core
API interessate
Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions
Stato sessione: API obsolete rimosse
Le API obsolete per la configurazione dei cookie di sessione sono state rimosse. Per altre informazioni, vedere aspnet/Announcements#257.
Versione introdotta
3,0
Motivo della modifica
Questa modifica assicura la coerenza tra le API per la configurazione delle funzionalità che usano i cookie.
Azione consigliata
Eseguire la migrazione delle app all'utilizzo delle nuove API al posto di quelle rimosse. Si consideri l'esempio seguente in Startup.ConfigureServices
:
public void ConfigureServices(ServiceCollection services)
{
services.AddSession(options =>
{
// Removed obsolete APIs
options.CookieName = "SessionCookie";
options.CookieDomain = "contoso.com";
options.CookiePath = "/";
options.CookieHttpOnly = true;
options.CookieSecure = CookieSecurePolicy.Always;
// new API
options.Cookie.Name = "SessionCookie";
options.Cookie.Domain = "contoso.com";
options.Cookie.Path = "/";
options.Cookie.HttpOnly = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});
}
Category
ASP.NET Core
API interessate
- 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
Framework condiviso: assembly rimossi da Microsoft.AspNetCore.App
A partire da ASP.NET Core 3.0, il framework condiviso ASP.NET Core (Microsoft.AspNetCore.App
) contiene solo assembly proprietari completamente sviluppati, supportati e mantenuti da Microsoft.
Descrizione delle modifiche
Si può considerare la modifica una ridefinizione dei limiti per la "piattaforma" ASP.NET Core. Tramite GitHub, chiunque potrà compilare il codice sorgente del framework condiviso, che continuerà a offrire gli attuali vantaggi dei framework condivisi di .NET Core alle app. Alcuni di questi vantaggi includono dimensioni di distribuzione minori, applicazione centralizzata delle patch e tempi di avvio più rapidi.
Come parte della modifica, in Microsoft.AspNetCore.App
sono state introdotte alcune modifiche di rilievo che causano un'interruzione.
Versione introdotta
3,0
Comportamento precedente
I progetti facevano riferimento a Microsoft.AspNetCore.App
tramite un elemento <PackageReference>
nel file di progetto.
Inoltre, Microsoft.AspNetCore.App
conteneva i sottocomponenti seguenti:
- Json.NET (
Newtonsoft.Json
) - Entity Framework Core (assembly con prefisso
Microsoft.EntityFrameworkCore.
) - Roslyn (
Microsoft.CodeAnalysis
)
Nuovo comportamento
Un riferimento a Microsoft.AspNetCore.App
non richiede più un elemento <PackageReference>
nel file di progetto. .NET Core SDK supporta un nuovo elemento denominato <FrameworkReference>
, che sostituisce l'uso di <PackageReference>
.
Per altre informazioni, vedere dotnet/aspnetcore#3612.
Entity Framework Core viene distribuito sotto forma di pacchetti NuGet. Questa modifica allinea il modello di distribuzione a quello di tutte le altre librerie di accesso ai dati in .NET. Fornisce a Entity Framework Core il percorso più semplice per continuare a innovare supportando le varie piattaforme .NET. Lo spostamento di Entity Framework Core all'esterno del framework condiviso non ha alcun impatto sul suo stato di libreria sviluppata, supportata e mantenuta da Microsoft. I criteri di supporto di .NET Core continuano a coprirla.
Json.NET ed Entity Framework Core continuano a funzionare con ASP.NET Core. Non saranno tuttavia inclusi nel framework condiviso.
Per altre informazioni, vedere Il futuro di JSON in .NET Core 3.0. Vedere anche l'elenco completo dei file binari rimossi dal framework condiviso.
Motivo della modifica
Questa modifica semplifica l'utilizzo di Microsoft.AspNetCore.App
e riduce la duplicazione tra pacchetti NuGet e framework condivisi.
Per altre informazioni sul motivo di questa modifica, vedere questo post di blog.
Azione consigliata
A partire da ASP.NET Core 3.0, non è più necessario per i progetti utilizzare gli assembly in Microsoft.AspNetCore.App
come pacchetti NuGet. Per semplificare la scelta della destinazione e l'utilizzo del framework condiviso di ASP.NET Core, molti pacchetti NuGet forniti a partire da ASP.NET Core 1.0 non vengono più prodotti. Le API fornite da tali pacchetti sono ancora disponibili per le app usando un elemento <FrameworkReference>
per fare riferimento a Microsoft.AspNetCore.App
. Alcuni esempi di API comuni includono Kestrel, MVC e Razor.
Questa modifica non si applica a tutti i file binari a cui viene fatto riferimento tramite Microsoft.AspNetCore.App
in ASP.NET Core 2.x. Le eccezioni rilevanti includono:
- Le librerie
Microsoft.Extensions
che continuano a essere destinate a .NET Standard e che sono disponibili come pacchetti NuGet (vedere https://github.com/dotnet/extensions). - Le API prodotte dal team ASP.NET Core che non fanno parte di
Microsoft.AspNetCore.App
. Ad esempio, i componenti seguenti sono disponibili come pacchetti NuGet:- Entity Framework Core
- Le API che forniscono l'integrazione di terze parti
- Funzionalità sperimentali
- Le API con dipendenze che non potevano soddisfare i requisiti per essere nel framework condiviso
- Le estensioni a MVC che mantengono il supporto per Json.NET. Per supportare l'uso di Json.NET e MVC è disponibile un'API fornita come pacchetto NuGet. Per altri dettagli, vedere la guida alla migrazione di ASP.NET Core.
- Il client .NET di SignalR continua a supportare .NET Standard e viene fornito come pacchetto NuGet. È progettato per l'utilizzo in molti runtime .NET, ad esempio Xamarin e UWP.
Per altre informazioni, vedere Interrompere la produzione di pacchetti per assembly del framework condiviso nella versione 3.0. Per informazioni, vedere dotnet/aspnetcore#3757.
Category
ASP.NET Core
API interessate
Framework condiviso: Microsoft.AspNetCore.All rimosso
A partire da ASP.NET Core 3.0, il metapacchetto Microsoft.AspNetCore.All
e il framework condiviso corrispondente Microsoft.AspNetCore.All
non vengono più prodotti. Questo pacchetto è disponibile in ASP.NET Core 2.2 e continuerà a ricevere aggiornamenti di manutenzione in ASP.NET Core 2.1.
Versione introdotta
3,0
Comportamento precedente
Le app possono usare il metapacchetto Microsoft.AspNetCore.All
per specificare come destinazione il framework condiviso Microsoft.AspNetCore.All
in .NET Core.
Nuovo comportamento
.NET Core 3.0 non include un framework condiviso Microsoft.AspNetCore.All
.
Motivo della modifica
Il metapacchetto Microsoft.AspNetCore.All
includeva un numero elevato di dipendenze esterne.
Azione consigliata
Eseguire la migrazione del progetto per usare il framework Microsoft.AspNetCore.App
. I componenti precedentemente disponibili in Microsoft.AspNetCore.All
sono ancora disponibili in NuGet. Ora questi componenti vengono distribuiti con l'app anziché essere inclusi nel framework condiviso.
Category
ASP.NET Core
API interessate
None
SignalR: HandshakeProtocol.SuccessHandshakeData sostituito
Il campo HandshakeProtocol.SuccessHandshakeData è stato rimosso e sostituito con un metodo helper che genera una risposta handshake riuscito in funzione di uno specifico IHubProtocol
.
Versione introdotta
3,0
Comportamento precedente
HandshakeProtocol.SuccessHandshakeData
era un campo public static ReadOnlyMemory<byte>
.
Nuovo comportamento
HandshakeProtocol.SuccessHandshakeData
è stato sostituito da un metodo static
GetSuccessfulHandshake(IHubProtocol protocol)
che restituisce un elemento ReadOnlyMemory<byte>
in base al protocollo specificato.
Motivo della modifica
Alla risposta handshake sono stati aggiunti campi non costanti, che cambiano a seconda del protocollo selezionato.
Azione consigliata
Nessuno. Questo tipo non è progettato per l'uso a partire dal codice utente. È public
, quindi può essere condiviso tra il server SignalR e il client. Può essere usato anche dai client SignalR dei clienti scritti in .NET. Gli utenti di SignalR non dovrebbero essere interessati da questa modifica.
Category
ASP.NET Core
API interessate
HandshakeProtocol.SuccessHandshakeData
SignalR: metodi ResetSendPing e ResetTimeout di HubConnection rimossi
I metodi ResetSendPing
e ResetTimeout
sono stati rimossi dall'API HubConnection
di SignalR. Questi metodi erano originariamente progettati solo per l'uso interno, ma sono stati resi pubblici in ASP.NET Core 2.2. A partire dalla versione ASP.NET Core 3.0 Preview 4, non saranno più disponibili. Per informazioni, vedere dotnet/aspnetcore#8543.
Versione introdotta
3,0
Comportamento precedente
Le API erano disponibili.
Nuovo comportamento
Le API sono state rimosse.
Motivo della modifica
Questi metodi in origine erano progettati solo per l'uso interno, ma sono stati resi pubblici in ASP.NET Core 2.2.
Azione consigliata
Non usare questi metodi.
Category
ASP.NET Core
API interessate
SignalR: costruttori HubConnectionContext modificati
I costruttori HubConnectionContext
di SignalR sono stati modificati in modo da accettare un tipo options anziché più parametri, per garantire la possibilità di aggiungere opzioni in futuro. Questa modifica sostituisce due costruttori con un singolo costruttore che accetta un tipo Options.
Versione introdotta
3,0
Comportamento precedente
HubConnectionContext
ha due costruttori:
public HubConnectionContext(ConnectionContext connectionContext, TimeSpan keepAliveInterval, ILoggerFactory loggerFactory);
public HubConnectionContext(ConnectionContext connectionContext, TimeSpan keepAliveInterval, ILoggerFactory loggerFactory, TimeSpan clientTimeoutInterval);
Nuovo comportamento
I due costruttori sono stati rimossi e sostituiti con un costruttore:
public HubConnectionContext(ConnectionContext connectionContext, HubConnectionContextOptions contextOptions, ILoggerFactory loggerFactory)
Motivo della modifica
Il nuovo costruttore usa un nuovo oggetto Options. Di conseguenza, in futuro sarà possibile espandere le funzionalità di HubConnectionContext
senza creare altri costruttori e apportare modifiche che causano un'interruzione.
Azione consigliata
Anziché usare il costruttore seguente:
HubConnectionContext connectionContext = new HubConnectionContext(
connectionContext,
keepAliveInterval: TimeSpan.FromSeconds(15),
loggerFactory,
clientTimeoutInterval: TimeSpan.FromSeconds(15));
Usare il costruttore seguente:
HubConnectionContextOptions contextOptions = new HubConnectionContextOptions()
{
KeepAliveInterval = TimeSpan.FromSeconds(15),
ClientTimeoutInterval = TimeSpan.FromSeconds(15)
};
HubConnectionContext connectionContext = new HubConnectionContext(connectionContext, contextOptions, loggerFactory);
Category
ASP.NET Core
API interessate
- HubConnectionContext(ConnectionContext, TimeSpan, ILoggerFactory)
- HubConnectionContext(ConnectionContext, TimeSpan, ILoggerFactory, TimeSpan)
SignalR: modifica del nome del pacchetto client JavaScript
In ASP.NET Core 3.0 Preview 7 il nome del pacchetto client JavaScript di SignalR è cambiato da @aspnet/signalr
a @microsoft/signalr
. La modifica del nome riflette il fatto che SignalR non è utile soltanto per le app ASP.NET Core, grazie al Servizio Azure SignalR.
Per reagire a questa modifica, modificare i riferimenti nei file package.json, nelle istruzioni require
e nelle istruzioni import
ECMAScript. Nessuna API verrà modificata come parte di questa ridenominazione.
Per informazioni, vedere dotnet/aspnetcore#11637.
Versione introdotta
3,0
Comportamento precedente
Il pacchetto client era denominato @aspnet/signalr
.
Nuovo comportamento
Il pacchetto client è denominato @microsoft/signalr
.
Motivo della modifica
La modifica del nome chiarisce il fatto che SignalR è utile anche oltre le app ASP.NET Core, grazie al Servizio Azure SignalR.
Azione consigliata
Passare al nuovo pacchetto @microsoft/signalr
.
Category
ASP.NET Core
API interessate
None
SignalR: metodi UseSignalR e UseConnections contrassegnati come obsoleti
I metodi UseConnections
e UseSignalR
e le classi ConnectionsRouteBuilder
e HubRouteBuilder
sono contrassegnati come obsoleti in ASP.NET Core 3.0.
Versione introdotta
3,0
Comportamento precedente
Il routing dell'hub di SignalR veniva configurato usando UseSignalR
o UseConnections
.
Nuovo comportamento
Il vecchio modo di configurare il routing è diventato obsoleto ed è stato sostituito con il routing degli endpoint.
Motivo della modifica
Il middleware sta passando al nuovo sistema di routing degli endpoint. Il vecchio modo di aggiungere il middleware sta diventando obsoleto.
Azione consigliata
Sostituire UseSignalR
con UseEndpoints
:
Codice precedente:
app.UseSignalR(routes =>
{
routes.MapHub<SomeHub>("/path");
});
Nuovo codice:
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<SomeHub>("/path");
});
Category
ASP.NET Core
API interessate
- 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
Applicazioni a pagina singola: SpaServices e NodeServices contrassegnati come obsoleti
Il contenuto dei pacchetti NuGet seguenti non è più necessario a partire da ASP.NET Core 2.1. Di conseguenza, i pacchetti seguenti sono contrassegnati come obsoleti:
Per lo stesso motivo, i moduli npm seguenti vengono contrassegnati come deprecati:
I pacchetti e i moduli npm precedenti verranno successivamente rimossi in .NET 5.
Versione introdotta
3,0
Comportamento precedente
I pacchetti e i moduli npm deprecati erano progettati per integrare ASP.NET Core con vari framework per app a pagina singola. Tali framework includono Angular, React e React con Redux.
Nuovo comportamento
È disponibile un nuovo meccanismo di integrazione nel pacchetto NuGet Microsoft.AspNetCore.SpaServices.Extensions. Il pacchetto resta la base dei modelli di progetto Angular e React a partire da ASP.NET Core 2.1.
Motivo della modifica
ASP.NET Core supporta l'integrazione con vari framework per app a pagina singola, tra cui Angular, React e React con Redux. Inizialmente, l'integrazione con questi framework veniva eseguita con componenti specifici di ASP.NET Core che gestivano scenari come il rendering preliminare lato server e l'integrazione con Webpack. Col passare del tempo, gli standard del settore sono cambiati. Tutti i framework per app a pagina singola hanno rilasciato le proprie interfacce della riga di comando standard, ad esempio, Angular CLI e create-react-app.
Quando è stato rilasciato ASP.NET Core 2.1, nel maggio 2018, il team ha risposto alla modifica degli standard. È stato fornito un modo più semplice e nuovo per l'integrazione con le toolchain proprietarie dei framework per app a pagina singola. Il nuovo meccanismo di integrazione si trova nel pacchetto Microsoft.AspNetCore.SpaServices.Extensions
e rimane la base dei modelli di progetto Angular e React a partire da ASP.NET Core 2.1.
Per chiarire che i componenti specifici di ASP.NET Core precedenti sono irrilevanti e non sono consigliati:
- Il meccanismo di integrazione precedente alla versione 2.1 è contrassegnato come obsoleto.
- I pacchetti npm di supporto sono contrassegnati come deprecati.
Azione consigliata
Se si usano questi pacchetti, aggiornare le app in modo da usare la funzionalità:
- Nel pacchetto
Microsoft.AspNetCore.SpaServices.Extensions
. - Fornita dai framework per app a pagina singola in uso
Per abilitare funzionalità come il rendering preliminare lato server e il ricaricamento rapido dei moduli, vedere la documentazione del framework per app a pagina singola corrispondente. La funzionalità in Microsoft.AspNetCore.SpaServices.Extensions
non è obsoleta e continuerà a essere supportata.
Category
ASP.NET Core
API interessate
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
Applicazioni a pagina singola: SpaServices e NodeServices non eseguono più il fallback al logger della console
Microsoft.AspNetCore.SpaServices e Microsoft.AspNetCore.NodeServices non visualizzeranno i log della console a meno che non sia configurata la registrazione.
Versione introdotta
3,0
Comportamento precedente
Microsoft.AspNetCore.SpaServices
e Microsoft.AspNetCore.NodeServices
creavano automaticamente un logger della console quando la registrazione non è configurata.
Nuovo comportamento
Microsoft.AspNetCore.SpaServices
e Microsoft.AspNetCore.NodeServices
non visualizzeranno i log della console a meno che non sia configurata la registrazione.
Motivo della modifica
È necessario allineare il modo in cui gli altri pacchetti ASP.NET Core implementano la registrazione.
Azione consigliata
Se è necessario il comportamento precedente, per configurare la registrazione della console aggiungere services.AddLogging(builder => builder.AddConsole())
al metodoSetup.ConfigureServices
.
Category
ASP.NET Core
API interessate
None
Framework di destinazione: supporto di .NET Framework rimosso
A partire da ASP.NET Core 3.0, .NET Framework è un framework di destinazione non supportato.
Descrizione delle modifiche
.NET Framework 4.8 è l'ultima versione principale di .NET Framework. Le nuove app ASP.NET Core devono essere basate su .NET Core. A partire dalla versione .NET Core 3.0, si può considerare ASP.NET Core 3.0 come parte di .NET Core.
I clienti che usano ASP.NET Core con .NET Framework possono continuare in una modalità completamente supportata usando la versione 2.1 LTS. Il supporto e la manutenzione per la versione 2.1 proseguiranno fino al 21 agosto 2021. Questa data è di tre anni successiva alla dichiarazione della versione LTS in base ai criteri di supporto di .NET. Il supporto per i pacchetti ASP.NET Core 2.1 in .NET Framework continuerà a tempo indeterminato, in modo analogo ai criteri di manutenzione di altri framework ASP.NET basati su pacchetti.
Per altre informazioni sulla conversione da .NET Framework a .NET Core, vedere Conversione a .NET Core.
I Microsoft.Extensions
pacchetti, ad esempio per la registrazione, l'inserimento delle dipendenze e la configurazione, ed Entity Framework Core non sono interessati. Continueranno a supportare .NET Standard.
Per altre informazioni sul motivo di questa modifica, vedere il post di blog originale.
Versione introdotta
3,0
Comportamento precedente
Le app ASP.NET Core potevano essere eseguite in .NET Core o in .NET Framework.
Nuovo comportamento
Le app ASP.NET Core possono essere eseguite solo in .NET Core.
Azione consigliata
Effettua una delle seguenti azioni:
- Mantenere l'app in ASP.NET Core 2.1.
- Eseguire la migrazione dell'app e delle dipendenze a .NET Core.
Category
ASP.NET Core
API interessate
Nessuno
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per