Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
3,0
15/10/2019 • 55 minutos para ler •
Neste artigo
ASP.NET Core
CoreFx
Criptografia
Entity Framework Core
Globalização
Rede
) Importante
Este artigo está em construção. Esta não é uma lista completa de alterações significativas do .NET Core. Para obter mais informações
sobre as alterações significativas no .NET Core, você pode examinar os problemas individuais de alterações significativas no
repositório dotnet/docs no github.
Se você estiver migrando da versão 2,2 para a versão 3,0 do .NET Core, ASP.NET Core ou EF Core, examine os tópicos a seguir para obter
alterações significativas que possam afetar seu aplicativo:
ASP.NET Core
Versão introduzida
3.0
Motivo da alteração
Ação recomendada
Embora tenha como alvo o .NET Core 2,2, siga as orientações nas mensagens de compilação obsoletas para adotar novas APIs em vez
disso.
Categoria
ASP.NET Core
APIs afetadas
Os seguintes tipos e membros foram marcados como obsoletos para ASP.NET Core 2,1 e 2,2:
Tipos
• 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
Construtores
• Microsoft.AspNetCore.Cors.Infrastructure.CorsService.CorsService(IOptions<CorsOptions>)
• Microsoft.AspNetCore.Routing.Tree.TreeRouteBuilder.TreeRouteBuilder(ILoggerFactory, UrlEncoder, ObjectPool<UriBuildingContext>,
IInlineConstraintResolver)
• Microsoft.AspNetCore.Mvc.Formatters.OutputFormatterCanWriteContext.OutputFormatterCanWriteContext()
• Microsoft.AspNetCore.Mvc.ApiExplorer.DefaultApiDescriptionProvider.DefaultApiDescriptionProvider(IOptions<MvcOptions>,
IInlineConstraintResolver, IModelMetadataProvider)
• Microsoft.AspNetCore.Mvc.ApiExplorer.DefaultApiDescriptionProvider.DefaultApiDescriptionProvider(IOptions<MvcOptions>,
IInlineConstraintResolver, IModelMetadataProvider, IActionResultTypeMapper)
• Microsoft.AspNetCore.Mvc.Formatters.FormatFilter.FormatFilter(IOptions<MvcOptions>)
• Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ArrayModelBinder<TElement>.ArrayModelBinder<TElement>(IModelBinder)
• Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ByteArrayModelBinder.ByteArrayModelBinder()
• Microsoft.AspNetCore.Mvc.ModelBinding.Binders.CollectionModelBinder<TElement>.CollectionModelBinder<TElement>
(IModelBinder)
• Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.ComplexTypeModelBinder
(IDictionary<ModelMetadata,IModelBinder>)
• Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DictionaryModelBinder<TKey,TValue>.DictionaryModelBinder<TKey,TValue>
(IModelBinder, IModelBinder)
• Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DoubleModelBinder.DoubleModelBinder(NumberStyles)
• Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FloatModelBinder.FloatModelBinder(NumberStyles)
• Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FormCollectionModelBinder.FormCollectionModelBinder()
• Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FormFileModelBinder.FormFileModelBinder()
• Microsoft.AspNetCore.Mvc.ModelBinding.Binders.HeaderModelBinder.HeaderModelBinder()
• Microsoft.AspNetCore.Mvc.ModelBinding.Binders.KeyValuePairModelBinder<TKey,TValue>.KeyValuePairModelBinder<TKey,TValue>
(IModelBinder, IModelBinder)
• Microsoft.AspNetCore.Mvc.ModelBinding.Binders.SimpleTypeModelBinder.SimpleTypeModelBinder(Type)
• Microsoft.AspNetCore.Mvc.ModelBinding.ModelAttributes.ModelAttributes(IEnumerable<Object>)
• Microsoft.AspNetCore.Mvc.ModelBinding.ModelAttributes.ModelAttributes(IEnumerable<Object>, IEnumerable<Object>)
• Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderFactory.ModelBinderFactory(IModelMetadataProvider, IOptions<MvcOptions>)
• Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.ParameterBinder(IModelMetadataProvider, IModelBinderFactory,
IObjectModelValidator)
• Microsoft.AspNetCore.Mvc.Routing.KnownRouteValueConstraint.KnownRouteValueConstraint()
• Microsoft.AspNetCore.Mvc.Formatters.XmlDataContractSerializerInputFormatter.XmlDataContractSerializerInputFormatter()
• Microsoft.AspNetCore.Mvc.Formatters.XmlDataContractSerializerInputFormatter.XmlDataContractSerializerInputFormatter(Boolean)
• Microsoft.AspNetCore.Mvc.Formatters.XmlDataContractSerializerInputFormatter.XmlDataContractSerializerInputFormatter
(MvcOptions)
• Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerInputFormatter.XmlSerializerInputFormatter()
• Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerInputFormatter.XmlSerializerInputFormatter(Boolean)
• Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerInputFormatter.XmlSerializerInputFormatter(MvcOptions)
• Microsoft.AspNetCore.Mvc.TagHelpers.ImageTagHelper.ImageTagHelper(IHostingEnvironment, IMemoryCache, HtmlEncoder,
IUrlHelperFactory)
• Microsoft.AspNetCore.Mvc.TagHelpers.LinkTagHelper.LinkTagHelper(IHostingEnvironment, IMemoryCache, HtmlEncoder,
JavaScriptEncoder, IUrlHelperFactory)
• Microsoft.AspNetCore.Mvc.TagHelpers.ScriptTagHelper.ScriptTagHelper(IHostingEnvironment, IMemoryCache, HtmlEncoder,
JavaScriptEncoder, IUrlHelperFactory)
• Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.RazorPageAdapter.RazorPageAdapter(RazorPageBase)
Propriedades
• 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
Métodos
• 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)
O Google está começando a desligar o Google + entrar para aplicativos como no início de 28 de janeiro de 2019.
Alterar descrição
ASP.NET 4. x e ASP.NET Core têm usado as APIs de entrada do Google + para autenticar usuários da conta do Google em aplicativos Web.
Os pacotes NuGet afetados são Microsoft. AspNetCore. Authentication. Google para ASP.NET Core e Microsoft. Owin. Security. Google para
Microsoft.Owin com ASP.NET Web Forms e MVC.
As APIs de substituição do Google usam uma fonte de dados e um formato diferentes. As atenuações e soluções fornecidas abaixo têm
uma conta para as alterações estruturais. Os aplicativos devem verificar se os dados em si ainda atendem às suas necessidades. Por
exemplo, nomes, endereços de email, links de perfil e fotos de perfil podem fornecer valores sutilmente diferentes de antes.
Versão introduzida
Ação recomendada
Para Microsoft.Owin 3.1.0 e posterior, uma mitigação temporária é descrita aqui. Os aplicativos devem concluir o teste com a mitigação
para verificar se há alterações no formato de dados. Há planos para liberar Microsoft.Owin 4.0.1 com uma correção. Os aplicativos que
usam qualquer versão anterior devem ser atualizados para a versão 4.0.1.
ASP.NET Core 1. x
A mitigação no Owin com ASP.NET Web Forms e MVC pode ser adaptada para ASP.NET Core 1. x. Os patches do pacote NuGet não estão
planejados porque 1. x atingiu o status de término da vida útil .
ASP.NET Core 2. x
C# = Copiar
.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");
});
Os patches de fevereiro de 2,1 e 2,2 incorporaram a reconfiguração anterior como o novo padrão. Nenhum patch está planejado para
ASP.NET Core 2,0, pois ele atingiu o fim da vida útil.
A mitigação fornecida para o ASP.NET Core 2. x também pode ser usada para ASP.NET Core 3,0. Em futuras versões do 3,0, o pacote
Microsoft.AspNetCore.Authentication.Google pode ser removido. Os usuários seriam direcionados para
Microsoft.AspNetCore.Authentication.OpenIdConnect em vez disso. O código a seguir mostra como substituir AddGoogle por
AddOpenIdConnect em Startup.ConfigureServices . Essa substituição pode ser usada com o ASP.NET Core 2,0 e posterior e pode ser
C# = Copiar
.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 "/sigin-oidc"
o.Scope.Add("email");
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
Categoria
ASP.NET Core
APIs afetadas
Microsoft.AspNetCore.Authentication.Google
Alterar descrição
Como parte do ASPNET/AspNetCore # 6504, a propriedade preterida Authentication em HttpContext foi removida. A propriedade
Authentication foi preterida desde 2,0. Um Guia de migração foi publicado para migrar o código usando essa propriedade preterida para
as novas APIs de substituição. As classes/APIs não usadas restantes relacionadas à pilha de autenticação antiga ASP.NET Core 1. x foram
removidas na confirmação aspnet/AspNetCore@d7a7c65.
Versão introduzida
3.0
Motivo da alteração
Ação recomendada
Categoria
ASP.NET Core
APIs afetadas
• 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
No ASP.NET Core 3,0, os tipos Newtonsoft.Json usados em APIs de autenticação foram substituídos por tipos System.Text.Json . Exceto
pelos seguintes casos, o uso básico dos pacotes de autenticação permanece inalterado:
Para obter mais informações, consulte ASPNET/AspNetCore # 7105. Para obter uma discussão, consulte ASPNET/AspNetCore # 7289.
Versão introduzida
3.0
Ação recomendada
Para implementações de OAuth derivadas, a alteração mais comum é substituir JObject.Parse por JsonDocument.Parse na substituição
CreateTicketAsync , conforme mostrado aqui. JsonDocument implementa IDisposable .
• OAuthCreatingTicketContext teve um Construtor antigo removido e o outro foi substituído JObject por JsonElement . A propriedade
User e o método RunClaimActions foram atualizados para corresponder.
• Success(JObject) agora aceita um parâmetro do tipo JsonDocument em vez de JObject . A propriedade Response foi atualizada para
corresponder. OAuthTokenResponse agora é descartável e será descartado por OAuthHandler . As implementações de OAuth derivadas
que substituem ExchangeCodeAsync não precisam descartar o JsonDocument ou o OAuthTokenResponse .
• UserInformationReceivedContext.User alterado de JObject para JsonDocument .
• TwitterCreatingTicketContext.User alterado de JObject para JsonElement .
• TwitterHandler.CreateTicketAsync(ClaimsIdentity, AuthenticationProperties, AccessToken, JObject) mudou de aceitando JObject para
JsonElement .
Categoria
ASP.NET Core
APIs afetadas
• Microsoft.AspNetCore.Authentication.Facebook
• Microsoft.AspNetCore.Authentication.Google
• Microsoft.AspNetCore.Authentication.MicrosoftAccount
• Microsoft.AspNetCore.Authentication.OAuth
• Microsoft.AspNetCore.Authentication.OpenIdConnect
• Microsoft.AspNetCore.Authentication.Twitter
Autenticação: assinatura OAuthHandler ExchangeCodeAsync alterada
C# = Copiar
Para:
C# = Copiar
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Code e RedirectUri são propriedades em OAuthCodeExchangeContext que podem ser definidas por meio do Construtor
Motivo da alteração
Essa alteração permite que parâmetros adicionais sejam fornecidos de forma não-significativa. Não há necessidade de criar novas
sobrecargas ExchangeCodeAsync .
Ação recomendada
Construa um OAuthCodeExchangeContext com os valores de code e redirectUri apropriados. Uma instância AuthenticationProperties deve
ser fornecida. Essa instância única OAuthCodeExchangeContext pode ser passada para OAuthHandler.ExchangeCodeAsync em vez de vários
argumentos.
Categoria
ASP.NET Core
APIs afetadas
OAuthHandler<TOptions>.ExchangeCodeAsync(String, String)
Os métodos Core AddAuthorization que costumava residir em Microsoft.AspNetCore.Authorization foram renomeados para
AddAuthorizationCore . Os métodos antigos de AddAuthorization ainda existem, mas estão no pacote
Microsoft.AspNetCore.Authorization.Policy , em vez disso. Os aplicativos que usam os dois métodos não devem ter nenhum impacto. Os
aplicativos que não estavam usando o pacote de política devem mudar para usando AddAuthorizationCore .
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
os métodos AddAuthorization existem no Microsoft.AspNetCore.Authorization.Policy . AddAuthorizationCore é o novo nome para os
métodos antigos.
Motivo da alteração
AddAuthorization é um nome de método melhor para adicionar todos os serviços comuns necessários para autorização.
Ação recomendada
Categoria
ASP.NET Core
APIs afetadas
Microsoft.Extensions.DependencyInjection.AuthorizationServiceCollectionExtensions.AddAuthorization(IServiceCollection,
Action<AuthorizationOptions>)
No ASP.NET Core 3,0, um novo método GetFallbackPolicyAsync foi adicionado a IAuthorizationPolicyProvider . Essa política de fallback é
usada pelo middleware de autorização quando nenhuma política é especificada.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
Um novo método era necessário para o novo AuthorizationMiddleware a ser usado quando nenhuma política é especificada.
Ação recomendada
Categoria
ASP.NET Core
APIs afetadas
Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider
Alterar descrição
Essa alteração é um acompanhamento do ASPNET/Caching # 221. Para obter uma discussão, consulte ASPNET/Extensions # 1062.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
A compactação automática do cache causou problemas. Para evitar um comportamento inesperado, o cache só deve ser compactado
quando necessário.
Ação recomendada
Para compactar o cache, downcast para MemoryCache e chamar Compact quando necessário.
Categoria
ASP.NET Core
APIs afetadas
MemoryCacheOptions.CompactOnMemoryPressure
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
Microsoft.Data.SqlClient é um novo pacote criado de System.Data.SqlClient . É aqui que todo o novo recurso funcionará a partir de
agora.
Ação recomendada
Os clientes não devem precisar se preocupar com essa alteração significativa, a menos que estejam usando tipos retornados pelo pacote
Microsoft.Extensions.Caching.SqlServer e convertendo-os em tipos System.Data.SqlClient . Por exemplo, se alguém estivesse
convertendo um DbConnection para o tipo SqlConnection antigo, ele precisaria alterar a conversão para o novo tipo de
Microsoft.Data.SqlClient.SqlConnection .
Categoria
ASP.NET Core
APIs afetadas
Nenhum
Caching: tipos de ResponseCaching "pubternal" alterados para interno
No ASP.NET Core 3,0, os tipos "pubternal" no ResponseCaching foram alterados para internal .
Além disso, as implementações padrão de IResponseCachingPolicyProvider e IResponseCachingKeyProvider não são mais adicionadas aos
serviços como parte do método AddResponseCaching .
Alterar descrição
Em ASP.NET Core, os tipos "pubternal" são declarados como public , mas residem em um namespace com sufixo .Internal . Embora esses
tipos sejam públicos, eles não têm nenhuma política de suporte e estão sujeitos a alterações significativas. Infelizmente, o uso acidental
desses tipos foi comum, resultando em alterações significativas nesses projetos e limitando a capacidade de manter a estrutura.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
Ação recomendada
Categoria
ASP.NET Core
APIs afetadas
• 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)
Para perguntas sobre as APIs de armazenamento do Azure, use https://github.com/Azure/azure-storage-net. Para obter uma discussão
sobre esse problema, consulte ASPNET/AspNetCore # 8472.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
Essa alteração permite que Microsoft.AspNetCore.DataProtection.AzureStorage migre para os pacotes de armazenamento do Azure
recomendados.
Ação recomendada
Se você ainda precisar usar as APIs mais antigas do armazenamento do Azure com o ASP.NET Core 3,0, adicione uma dependência direta
ao pacote WindowsAzure. Storage . Esse pacote pode ser instalado juntamente com as novas APIs Microsoft.Azure.Storage .
Em muitos casos, a atualização envolve apenas a alteração das instruções using para usar os novos namespaces:
diff = Copiar
- using Microsoft.WindowsAzure.Storage;
- using Microsoft.WindowsAzure.Storage.Blob;
+ using Microsoft.Azure.Storage;
+ using Microsoft.Azure.Storage.Blob;
Categoria
ASP.NET Core
APIs afetadas
Nenhum
A partir do ASP.NET Core 3,0, o grupo de hospedagem do Windows não conterá AspNetCoreModule (ANCM) v1.
O ANCM V2 é compatível com versões anteriores com ANCM OutOfProcess e é recomendado para uso com ASP.NET Core aplicativos 3,0.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
O ANCM V2 é compatível com versões anteriores com ANCM OutOfProcess e é recomendado para uso com ASP.NET Core aplicativos 3,0.
Ação recomendada
Se o ANCM v1 for necessário, ele poderá ser instalado usando o pacote de hospedagem ASP.NET Core 2,1 ou 2,2 do Windows.
Categoria
ASP.NET Core
APIs afetadas
Nenhum
Os únicos tipos aos quais o host genérico dá suporte para injeção de construtor de classe Startup são IHostEnvironment ,
IWebHostEnvironment e IConfiguration . Os aplicativos que usam WebHost não são afetados.
Alterar descrição
Antes do ASP.NET Core 3,0, a injeção de Construtor poderia ser usada para tipos arbitrários no construtor da classe Startup . No ASP.NET
Core 3,0, a pilha da Web foi replataforma na biblioteca de hosts genérica. Você pode ver a alteração no arquivo Program.cs dos modelos:
ASP.NET Core 2. x:
https://github.com/aspnet/AspNetCore/blob/5cb615fcbe8559e49042e93394008077e30454c0/src/Templating/src/Microsoft.DotNet.Web.Pr
ojectTemplates/content/EmptyWeb-CSharp/Program.cs#L20-L22
https://github.com/aspnet/AspNetCore/blob/b1ca2c1155da3920f0df5108b9fedbe82efaa11c/src/ProjectTemplates/Web.ProjectTemplates/c
ontent/EmptyWeb-CSharp/Program.cs#L19-L24
Host usa um contêiner de injeção de dependência (DI) para compilar o aplicativo. WebHost usa dois contêineres: um para o host e outro
para o aplicativo. Como resultado, o Construtor Startup não oferece mais suporte à injeção de serviço personalizado. Somente
IHostEnvironment , IWebHostEnvironment e IConfiguration podem ser injetados. Essa alteração impede problemas de DI como a criação
Versão introduzida
3.0
Motivo da alteração
Essa alteração é uma consequência da replataforma da pilha da Web na biblioteca de hosts genérica.
Ação recomendada
C# = Copiar
Categoria
ASP.NET Core
APIs afetadas
Nenhum
Novos tipos foram introduzidos para substituir os tipos existentes IHostingEnvironment e IApplicationLifetime .
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Os tipos antigos foram marcados como obsoletos e substituídos por novos tipos.
Motivo da alteração
Quando Microsoft.Extensions.Hosting foi introduzido no ASP.NET Core 2,1, alguns tipos, como IHostingEnvironment e
IApplicationLifetime , foram copiados de Microsoft.AspNetCore.Hosting . Algumas alterações ASP.NET Core 3,0 fazem com que os
aplicativos incluam os namespaces Microsoft.Extensions.Hosting e Microsoft.AspNetCore.Hosting . Qualquer uso desses tipos duplicados
causa um erro de compilador "referência ambígua" quando ambos os namespaces são referenciados.
Ação recomendada
Substituídos os usos dos tipos antigos pelos tipos introduzidos recentemente, como abaixo:
• Microsoft.Extensions.Hosting.IHostingEnvironment
• Microsoft.AspNetCore.Hosting.IHostingEnvironment
• Microsoft.Extensions.Hosting.IApplicationLifetime
• Microsoft.AspNetCore.Hosting.IApplicationLifetime
• Microsoft.Extensions.Hosting.EnvironmentName
• Microsoft.AspNetCore.Hosting.EnvironmentName
Novos tipos:
• Microsoft.Extensions.Hosting.IHostEnvironment
• Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment
• Microsoft.Extensions.Hosting.IHostApplicationLifetime
• Microsoft.Extensions.Hosting.Environments
Os novos métodos de extensão IHostEnvironment IsDevelopment e IsProduction estão no namespace Microsoft.Extensions.Hosting . Esse
namespace pode precisar ser adicionado ao seu projeto.
Categoria
ASP.NET Core
APIs afetadas
• Microsoft.AspNetCore.Hosting.EnvironmentName
• Microsoft.AspNetCore.Hosting.IApplicationLifetime
• Microsoft.AspNetCore.Hosting.IHostingEnvironment
• Microsoft.Extensions.Hosting.EnvironmentName
• Microsoft.Extensions.Hosting.IApplicationLifetime
• Microsoft.Extensions.Hosting.IHostingEnvironment
Como parte de fazer ASP.NET Core mais Pay for Play, o ObjectPoolProvider foi removido do conjunto principal de dependências. Os
componentes específicos que dependem de ObjectPoolProvider agora o adicionam.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
Essa alteração foi feita para fazer ASP.NET Core mais Pay for Play.
Ação recomendada
Se o componente exigir ObjectPoolProvider , ele precisará ser adicionado às suas dependências por meio do IServiceCollection .
Categoria
ASP.NET Core
APIs afetadas
Nenhum
Como parte dos aprimoramentos de desempenho do ASP.NET Core 3,0, a extensibilidade do DefaultHttpContext foi removida. Agora, a
classe é sealed . Para obter mais informações, consulte ASPNET/AspNetCore # 6504.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
A extensibilidade foi inicialmente fornecida para permitir o pooling do HttpContext , mas introduziu uma complexidade desnecessária e
impedia outras otimizações.
Ação recomendada
Se você estiver usando Mock<DefaultHttpContext> em seus testes de unidade, comece a usar Mock<HttpContext> em vez disso.
Categoria
ASP.NET Core
APIs afetadas
Microsoft.AspNetCore.Http.DefaultHttpContext
A partir do ASP.NET Core 3,0 Preview 5, os campos em Microsoft.Net.Http.Headers.HeaderNames mudaram de const para static
readonly .
Para obter uma discussão, consulte ASPNET/AspNetCore # 9514.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
A alteração:
• Impede que os valores sejam inseridos entre limites de assembly, permitindo correções de valor conforme necessário.
• Permite verificações de igualdade de referência mais rápidas.
Ação recomendada
Recompile em relação a 3,0. O código-fonte que usa esses campos das seguintes maneiras não pode mais fazer isso:
Para contornar a alteração significativa, alterne para usando constantes de nome de cabeçalho autodefinido ou literais de cadeia de
caracteres.
Categoria
ASP.NET Core
APIs afetadas
Microsoft.Net.Http.Headers.HeaderNames
A infraestrutura que faz o backup de um corpo de resposta HTTP foi alterada. Se você estiver usando HttpResponse diretamente, não
precisará fazer nenhuma alteração de código. Leia mais detalhadamente se você estiver encapsulando ou substituindo HttpResponse.Body
ou acessando HttpContext.Features .
Versão introduzida
3.0
Comportamento antigo
• IHttpResponseFeature.Body
• IHttpSendFileFeature.SendFileAsync
• IHttpBufferingFeature.DisableResponseBuffering
Novo comportamento
Se você substituir HttpResponse.Body , ele substituirá todo o IHttpResponseBodyFeature por um wrapper em seu fluxo específico usando
StreamResponseBodyFeature para fornecer implementações padrão para todas as APIs esperadas. A configuração de volta do fluxo original
Motivo da alteração
A motivação é combinar as APIs de corpo de resposta em uma única interface de recurso nova.
Ação recomendada
Categoria
ASP.NET Core
APIs afetadas
• Microsoft.AspNetCore.Http.Features.IHttpBufferingFeature
• Microsoft.AspNetCore.Http.Features.IHttpResponseFeature.Body
• Microsoft.AspNetCore.Http.Features.IHttpSendFileFeature
A partir do ASP.NET Core 3,0, as operações de servidor síncronas são desabilitadas por padrão.
Alterar descrição
AllowSynchronousIO é uma opção em cada servidor que habilita ou desabilita APIs de e/s síncronas como HttpRequest.Body.Read ,
HttpResponse.Body.Write e Stream.Flush . Essas APIs têm sido uma origem de privação de threads e bloqueios de aplicativo. A partir do
ASP.NET Core 3,0 Preview 3, essas operações síncronas são desabilitadas por padrão.
Servidores afetados:
• Kestrel
• HttpSys
• IIS em processo
• TestServer
• 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.
Cada servidor tem uma opção AllowSynchronousIO que controla esse comportamento e o padrão para todos eles agora é false .
O comportamento também pode ser substituído em uma base por solicitação como uma mitigação temporária. Por exemplo:
C# = Copiar
Se você tiver problemas com um TextWriter ou outro fluxo chamando uma API síncrona no Dispose , chame a nova API DisposeAsync em
vez disso.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Essas APIs síncronas não são permitidas por padrão:
• 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 da alteração
Essas APIs síncronas têm sido uma origem de privação de threads e bloqueios de aplicativo. A partir do ASP.NET Core 3,0 Preview 3, as
operações síncronas são desabilitadas por padrão.
Ação recomendada
Use as versões assíncronas dos métodos. O comportamento também pode ser substituído em uma base por solicitação como uma
mitigação temporária.
C# = Copiar
Categoria
ASP.NET Core
APIs afetadas
• Stream.Flush
• Stream.Read
• Stream.Write
A partir do ASP.NET Core 3,0, a sobrecarga do método IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder, UIFramework) não existe
mais.
Versão introduzida
3.0
Motivo da alteração
Ação recomendada
XML = Copiar
<IdentityUIFrameworkVersion>Bootstrap3</IdentityUIFrameworkVersion>
Categoria
ASP.NET Core
APIs afetadas
Microsoft.AspNetCore.Identity.IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder, UIFramework)
Identidade: versão de inicialização padrão da interface do usuário alterada
A partir do ASP.NET Core 3,0, a interface do usuário de identidade usa como padrão a versão 4 da inicialização.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
Ação recomendada
Você será afetado por essa alteração se usar a interface do usuário de identidade padrão e a tiver adicionado em
Startup.ConfigureServices , conforme mostrado no exemplo a seguir:
C# = Copiar
services.AddDefaultIdentity<IdentityUser>().AddDefaultUI();
C# = Copiar
services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap3);
Categoria
ASP.NET Core
APIs afetadas
Nenhum
Por padrão, SignInAsync gera uma exceção para entidades/identidades nas quais IsAuthenticated é false .
Versão introduzida
3.0
Comportamento antigo
SignInAsync aceita quaisquer entidades/identidades, incluindo identidades nas quais IsAuthenticated é false .
Novo comportamento
Por padrão, SignInAsync gera uma exceção para entidades/identidades nas quais IsAuthenticated é false . Há um novo sinalizador para
suprimir esse comportamento, mas o comportamento padrão foi alterado.
Motivo da alteração
O comportamento antigo era problemático porque, por padrão, essas entidades foram rejeitadas por [Authorize] @ no__t-1 @ no__t-2.
Ação recomendada
No ASP.NET Core 3,0 Preview 6, há um sinalizador RequireAuthenticatedSignIn no AuthenticationOptions que é true por padrão. Defina
esse sinalizador como false para restaurar o comportamento antigo.
Categoria
ASP.NET Core
APIs afetadas
Nenhum
A partir do ASP.NET Core 3,0, um novo parâmetro IUserConfirmation<TUser> foi adicionado ao Construtor SignInManager . Para obter mais
informações, consulte ASPNET/AspNetCore # 8356.
Versão introduzida
3.0
Motivo da alteração
A motivação para a alteração foi adicionar suporte a novos fluxos de email/confirmação em identidade.
Ação recomendada
Se você construir manualmente um SignInManager , forneça uma implementação de IUserConfirmation ou pegue um da injeção de
dependência a ser fornecida.
Categoria
ASP.NET Core
APIs afetadas
SignInManager<TUser>.SignInManager<TUser>
O ASP.NET Core 3,0 introduziu um recurso de ativos da Web estático e a interface do usuário da identidade o adotou.
Alterar descrição
Como resultado da interface do usuário de identidade adotando o recurso de ativos da Web estáticos:
Versão introduzida
3.0
Comportamento antigo
A estrutura de interface do usuário padrão da interface do usuário de identidade foi a inicialização 3. A estrutura da interface do usuário
pode ser configurada usando um parâmetro para a chamada do método AddDefaultUI em Startup.ConfigureServices .
Novo comportamento
A estrutura de interface do usuário padrão para identidade de interface do usuário é Bootstrap 4. A estrutura da interface do usuário deve
ser configurada em seu arquivo de projeto, em vez de na chamada do método AddDefaultUI .
Motivo da alteração
A adoção do recurso de ativos da Web estáticos exigia que a configuração da estrutura da interface do usuário se mova para o MSBuild. A
decisão sobre qual estrutura deve ser inserida é uma decisão em tempo de compilação, não uma decisão de tempo de execução.
Ação recomendada
Examine a interface do usuário do site para garantir que os novos componentes Bootstrap 4 sejam compatíveis. Se necessário, use a
propriedade do MSBuild IdentityUIFrameworkVersion para reverter para a inicialização 3. Adicione a propriedade a um elemento
<PropertyGroup> em seu arquivo de projeto:
XML = Copiar
<IdentityUIFrameworkVersion>Bootstrap3</IdentityUIFrameworkVersion>
Categoria
ASP.NET Core
APIs afetadas
IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder, UIFramework)
Como parte da mudança para mover APIs "pubternal" para public , o conceito de um IConnectionAdapter foi removido de Kestrel. Os
adaptadores de conexão estão sendo substituídos pelo middleware de conexão (semelhante ao middleware HTTP no pipeline de ASP.NET
Core, mas para conexões de nível inferior). O log de conexão e HTTPS foi movido dos adaptadores de conexão para o middleware de
conexão. Esses métodos de extensão devem continuar funcionando sem problemas, mas os detalhes da implementação foram alterados.
Para obter mais informações, consulte ASPNET/AspNetCore # 11412. Para obter uma discussão, consulte ASPNET/AspNetCore # 11475.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
Ação recomendada
Converta todas as implementações de IConnectionAdapter para usar o novo padrão de middleware, conforme mostrado aqui.
Categoria
ASP.NET Core
APIs afetadas
Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal.IConnectionAdapter
Versão introduzida
3.0
Motivo da alteração
Ação recomendada
• Bibliotecas que fazem referência a Microsoft.AspNetCore.Server.Kestrel.Https 2,0 devem atualizar todas as dependências de
ASP.NET Core para 2,1 ou posterior. Caso contrário, eles poderão ser interrompidos quando forem carregados em um aplicativo
ASP.NET Core 3,0.
• Os aplicativos e bibliotecas destinados a ASP.NET Core 2,1 e posterior devem remover todas as referências diretas para o pacote
NuGet Microsoft.AspNetCore.Server.Kestrel.Https .
Categoria
ASP.NET Core
APIs afetadas
Nenhum
Nas versões anteriores, Kestrel adicionou cabeçalhos de trailers de HTTP/1.1 na coleção de cabeçalhos de solicitação quando o corpo da
solicitação foi lido até o final. Esse comportamento causou preocupações sobre ambigüidade entre cabeçalhos e trailers. A decisão foi feita
para mover os trailers para uma nova coleção.
Os trailers de solicitação HTTP/2 não estavam disponíveis no ASP.NET Core 2,2, mas agora também estão disponíveis nesta nova coleção no
ASP.NET Core 3,0.
Novos métodos de extensão de solicitação foram adicionados para acessar esses trailers.
Os trailers HTTP/1.1 estão disponíveis quando todo o corpo da solicitação tiver sido lido.
Os trailers HTTP/2 estão disponíveis quando são recebidos do cliente. O cliente não enviará os trailers até que todo o corpo da solicitação
tenha sido pelo menos armazenado em buffer pelo servidor. Talvez seja necessário ler o corpo da solicitação para liberar espaço no buffer.
Os trailers sempre estarão disponíveis se você ler o corpo da solicitação para o final. Os marcadores marcam o fim do corpo.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Os cabeçalhos de trailer de solicitação não estão presentes na coleção HttpRequest.Headers . Use os métodos de extensão a seguir em
HttpRequest para acessá-los:
• GetDeclaredTrailers() -Obtém o cabeçalho "trailer" da solicitação que lista os marcadores a serem esperados após o corpo.
• SupportsTrailers() -indica se a solicitação dá suporte ao recebimento de cabeçalhos de trailer.
• CheckTrailersAvailable() -determina se a solicitação dá suporte a trailers e se está disponível para leitura.
• GetTrailer(string trailerName) -Obtém o cabeçalho à direita solicitado da resposta.
Motivo da alteração
Os trailers são um recurso importante em cenários como o gRPC. Mesclar os trailers em cabeçalhos de solicitação era confuso para os
usuários.
Ação recomendada
Categoria
ASP.NET Core
APIs afetadas
HttpRequest.Headers
Como parte da afastamento das APIs "pubternal", as APIs da camada de transporte do Kestrel são expostas como uma interface pública na
biblioteca Microsoft.AspNetCore.Connections.Abstractions .
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
Ação recomendada
Categoria
ASP.NET Core
APIs afetadas
Nenhum
A classe ResourceManagerWithCultureStringLocalizer e o membro da interface WithCulture geralmente são fontes de confusão para os
usuários da localização, especialmente ao criar sua própria implementação IStringLocalizer . Esses itens dão ao usuário a impressão de
que uma instância IStringLocalizer é "por idioma, por recurso". Na realidade, as instâncias só devem ser "por recurso". O idioma
procurado é determinado pelo CultureInfo.CurrentUICulture no momento da execução. Para eliminar a origem da confusão, as APIs foram
marcadas como obsoletas no ASP.NET Core 3,0 Preview 3. As APIs serão removidas em uma versão futura.
Para contexto, consulte ASPNET/AspNetCore # 3324. Para obter uma discussão, consulte ASPNET/AspNetCore # 7756.
Versão introduzida
3.0
Comportamento antigo
Motivo da alteração
As APIs representaram um caso de uso que não é recomendado. Houve uma confusão sobre o design da localização.
Ação recomendada
A recomendação é usar ResourceManagerStringLocalizer em vez disso. Permita que a cultura seja definida pelo CurrentCulture . Se essa
não for uma opção, crie e use uma cópia de ResourceManagerWithCultureStringLocalizer.
Categoria
ASP.NET Core
APIs afetadas
• ResourceManagerWithCultureStringLocalizer
• ResourceManagerStringLocalizer.WithCulture
Antes do ASP.NET Core 3,0, o modificador de acesso de DebugLogger era public . No ASP.NET Core 3,0, o modificador de acesso foi
alterado para internal .
Versão introduzida
3.0
Motivo da alteração
Ação recomendada
Use o método de extensão AddDebug ILoggingBuilder para habilitar o log de depuração. DebugLoggerProvider ainda é public no caso
de o serviço precisar ser registrado manualmente.
Categoria
ASP.NET Core
APIs afetadas
Microsoft.Extensions.Logging.Debug.DebugLogger
Como parte do endereçamento ASPNET/AspNetCore # 4849, ASP.NET Core MVC apara o sufixo Async dos nomes de ação por padrão. A
partir do ASP.NET Core 3,0, essa alteração afeta o roteamento e a geração de link.
Versão introduzida
3.0
Comportamento antigo
C# = Copiar
public class ProductController : Controller
{
public async IActionResult ListAsync()
{
var model = await DbContext.Products.ToListAsync();
return View(model);
}
}
A ação é roteável via Product/ListAsync . A geração de link requer a especificação do sufixo Async . Por exemplo:
CSHTML = Copiar
Novo comportamento
No ASP.NET Core 3,0, a ação é roteável via Product/List . O código de geração de link deve omitir o sufixo Async . Por exemplo:
CSHTML = Copiar
Essa alteração não afeta os nomes especificados usando o atributo [ActionName] . O novo comportamento pode ser desabilitado definindo
MvcOptions.SuppressAsyncSuffixInActionNames como false em Startup.ConfigureServices :
C# = Copiar
services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});
Motivo da alteração
Por convenção, os métodos .NET assíncronos têm um sufixo Async . No entanto, quando um método define uma ação MVC, não é desejável
usar o sufixo Async .
Ação recomendada
Se seu aplicativo depende de ações do MVC preservando o sufixo Async do nome, escolha uma das seguintes atenuações:
C# = Copiar
services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});
Categoria
ASP.NET Core
APIs afetadas
Nenhum
No ASP.NET Core 1,1, o pacote Microsoft.AspNetCore.Mvc.Razor.ViewCompilation (ferramenta de pré-compilação MVC) foi introduzido para
adicionar suporte à compilação de tempo de publicação de arquivos Razor (arquivos . cshtml ). No ASP.NET Core 2,1, o SDK do Razor foi
introduzido para expandir os recursos da ferramenta de pré-compilação. O SDK do Razor adicionou suporte para compilação de
compilação e tempo de publicação de arquivos Razor. O SDK verifica a exatidão dos arquivos . cshtml no momento da compilação, ao
mesmo tempo em que melhora o tempo de inicialização do aplicativo. O SDK do Razor está ativado por padrão e nenhum gesto é
necessário para começar a usá-lo.
No ASP.NET Core 3,0, a ferramenta de pré-compilação MVC ASP.NET Core 1,1 de era removida. Versões anteriores do pacote continuarão
recebendo correções importantes de bugs e de segurança na versão do patch.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
O SDK do Razor oferece suporte nativo a essa funcionalidade. O pacote Microsoft.AspNetCore.Mvc.Razor.ViewCompilation não é mais
atualizado.
Motivo da alteração
O SDK do Razor fornece mais funcionalidade e verifica a exatidão dos arquivos . cshtml no momento da compilação. O SDK também
melhora o tempo de inicialização do aplicativo.
Ação recomendada
Para usuários do ASP.NET Core 2,1 ou posterior, atualize para usar o suporte nativo para pré-compilação no SDK do Razor. Se os bugs ou
os recursos ausentes impedirem a migração para o SDK do Razor, abra um problema em ASPNET/AspNetCore.
Categoria
ASP.NET Core
APIs afetadas
Nenhum
No ASP.NET Core 3,0, todos os tipos "pubternal" no MVC foram atualizados para public em um namespace com suporte ou internal ,
conforme apropriado.
Alterar descrição
Em ASP.NET Core, os tipos "pubternal" são declarados como public , mas residem em um namespace .Internal . Embora esses tipos sejam
public , eles não têm nenhuma política de suporte e estão sujeitos a alterações significativas. Infelizmente, o uso acidental desses tipos foi
comum, resultando em alterações significativas nesses projetos e limitando a capacidade de manter a estrutura.
Versão introduzida
3.0
Comportamento antigo
Alguns tipos no MVC foram public , mas em um namespace .Internal . Esses tipos não tinham nenhuma política de suporte e estavam
sujeitos a alterações significativas.
Novo comportamento
Todos esses tipos são atualizados para serem public em um namespace com suporte ou marcados como internal .
Motivo da alteração
O uso acidental dos tipos "pubternal" é comum, resultando em alterações significativas nesses projetos e limitando a capacidade de manter
a estrutura.
Ação recomendada
Se você estiver usando tipos que se tornaram verdadeiramente public e foram movidos para um novo namespace com suporte, atualize
suas referências para que correspondam aos novos namespaces.
Se você estiver usando tipos que se tornaram marcados como internal , você precisará encontrar uma alternativa. Os tipos de "pubternal"
anteriormente nunca tinham suporte para uso público. Se houver tipos específicos nesses namespaces que são críticos para seus
aplicativos, execute um problema em ASPNET/AspNetCore. Podem ser feitas considerações para fazer os tipos solicitados public .
Categoria
ASP.NET Core
APIs afetadas
• 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
A partir do ASP.NET Core 3,0, o pacote Microsoft.AspNetCore.Mvc.WebApiCompatShim não está mais disponível.
Alterar descrição
O pacote Microsoft.AspNetCore.Mvc.WebApiCompatShim (WebApiCompatShim) fornece compatibilidade parcial em ASP.NET Core com a API
Web do ASP.NET 4. x para simplificar a migração de implementações de API Web existentes para ASP.NET Core. No entanto, os aplicativos
que usam o WebApiCompatShim não se beneficiam dos recursos relacionados à API fornecidos em versões recentes de ASP.NET Core.
Esses recursos incluem geração aprimorada de especificação de API aberta, tratamento de erro padronizado e geração de código de
cliente. Para focar melhor os esforços de API em 3,0, o WebApiCompatShim foi removido. Os aplicativos existentes que usam o
WebApiCompatShim devem migrar para o modelo [ApiController] mais recente.
Versão introduzida
3.0
Motivo da alteração
O Shim da compatibilidade da API Web era uma ferramenta de migração. Ele restringe o acesso do usuário à nova funcionalidade
adicionada no ASP.NET Core.
Ação recomendada
Remova o uso desse Shim e migre diretamente para a funcionalidade semelhante no ASP.NET Core em si.
Categoria
ASP.NET Core
APIs afetadas
Microsoft.AspNetCore.Mvc.WebApiCompatShim
O suporte para a compilação em tempo de execução de exibições do Razor e Razor Pages foi movido para um pacote separado.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
Essa alteração foi necessária para remover a dependência de estrutura compartilhada ASP.NET Core em Roslyn.
Ação recomendada
Aplicativos que exigem compilação em tempo de execução ou recompilação de arquivos Razor devem executar as seguintes etapas:
2. Atualize o método Startup.ConfigureServices do projeto para incluir uma chamada para AddMvcRazorRuntimeCompilation . Por
exemplo, em Startup.ConfigureServices :
C# = Copiar
services.AddMvc()
.AddMvcRazorRuntimeCompilation();
Categoria
ASP.NET Core
APIs afetadas
Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions
APIs obsoletas para configurar cookies de sessão foram removidas. Para obter mais informações, consulte ASPNET/comunicados n º 257.
Versão introduzida
3.0
Motivo da alteração
Essa alteração impõe a consistência entre APIs para configurar recursos que usam cookies.
Ação recomendada
Migre o uso das APIs removidas para suas substituições mais recentes. Considere o exemplo a seguir em Startup.ConfigureServices :
C# = Copiar
// new API
options.Cookie.Name = "SessionCookie";
options.Cookie.Domain = "contoso.com";
options.Cookie.Path = "/";
options.Cookie.HttpOnly = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});
}
Categoria
ASP.NET Core
APIs afetadas
• 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
A partir do ASP.NET Core 3,0, a estrutura compartilhada ASP.NET Core ( Microsoft.AspNetCore.App ) contém apenas assemblies de terceiros
que são totalmente desenvolvidos, com suporte e podem ser atendidos pela Microsoft.
Alterar descrição
Imagine a alteração como a redefinição de limites para a ASP.NET Core "plataforma". A estrutura compartilhada será criada de origem por
qualquer pessoa por meio do GitHub e continuará a oferecer os benefícios existentes das estruturas compartilhadas do .NET Core para seus
aplicativos. Alguns benefícios incluem tamanho de implantação menor, aplicação de patch centralizada e tempo de inicialização mais
rápido.
Como parte da alteração, algumas alterações significativas importantes são introduzidas em Microsoft.AspNetCore.App .
Versão introduzida
3.0
Comportamento antigo
• Json.NET ( Newtonsoft.Json )
• Entity Framework Core (assemblies prefixados com Microsoft.EntityFrameworkCore. )
• Roslyn ( Microsoft.CodeAnalysis )
Novo comportamento
Uma referência a Microsoft.AspNetCore.App não requer mais um elemento <PackageReference> no arquivo de projeto. O SDK do .NET Core
dá suporte a um novo elemento chamado <FrameworkReference> , que substitui o uso de <PackageReference> .
Entity Framework Core são fornecidos como pacotes NuGet. Essa alteração alinha o modelo de envio com todas as outras bibliotecas de
acesso a dados no .NET. Ele fornece Entity Framework Core caminho mais simples para continuar inovação enquanto dá suporte a várias
plataformas .NET. A mudança de Entity Framework Core da estrutura compartilhada não tem impacto sobre seu status como uma biblioteca
de serviços desenvolvidos, com suporte e desenvolvido pela Microsoft. A política de suporte do .NET Core continua a cobrir.
Json.NET e Entity Framework Core continuam trabalhando com ASP.NET Core. No entanto, eles não serão incluídos na estrutura
compartilhada.
Para obter mais informações, consulte o futuro do JSON no .NET Core 3,0. Consulte também a lista completa de binários removidos da
estrutura compartilhada.
Motivo da alteração
Essa alteração simplifica o consumo de Microsoft.AspNetCore.App e reduz a duplicação entre pacotes do NuGet e estruturas
compartilhadas.
Para obter mais informações sobre a motivação para essa alteração, consulte esta postagem no blog.
Ação recomendada
Não será necessário que os projetos consumam assemblies em Microsoft.AspNetCore.App como pacotes NuGet. Para simplificar o
direcionamento e o uso da estrutura ASP.NET Core compartilhada, muitos pacotes NuGet fornecidos desde ASP.NET Core 1,0 não são mais
produzidos. As APIs que esses pacotes fornecem ainda estão disponíveis para aplicativos usando um <FrameworkReference> a
Microsoft.AspNetCore.App . Exemplos comuns de API incluem Kestrel, MVC e Razor.
Essa alteração não se aplica a todos os binários referenciados por meio de Microsoft.AspNetCore.App em ASP.NET Core 2. x. As exceções
notáveis incluem:
• as bibliotecas Microsoft.Extensions que continuam a direcionar .NET Standard estarão disponíveis como pacotes NuGet (consulte
https://github.com/aspnet/Extensions).
• APIs produzidas pela equipe de ASP.NET Core que não fazem parte do Microsoft.AspNetCore.App . Por exemplo, os seguintes
componentes estão disponíveis como pacotes NuGet:
◦ Entity Framework Core
◦ APIs que fornecem integração de terceiros
◦ Recursos experimentais
◦ APIs com dependências que não puderam atender aos requisitos para estar na estrutura compartilhada
• Extensões para MVC que mantêm suporte para Json.NET. Uma API será fornecida como um pacote NuGet para dar suporte ao uso do
Json.NET e MVC.
• O cliente do sinalizador .NET continuará a dar suporte a .NET Standard e enviará como um pacote NuGet. Ele é destinado ao uso em
vários tempos de execução do .NET, como Xamarin e UWP.
Para obter mais informações, consulte parar de produzir pacotes para assemblies de estrutura compartilhada em 3,0. Para obter uma
discussão, consulte ASPNET/AspNetCore # 3757.
Categoria
ASP.NET Core
APIs afetadas
• Microsoft.CodeAnalysis
• Microsoft.EntityFrameworkCore
Versão introduzida
3.0
Comportamento antigo
Os aplicativos podem usar o metapacote Microsoft.AspNetCore.All para direcionar a estrutura compartilhada Microsoft.AspNetCore.All
no .NET Core.
Novo comportamento
O .NET Core 3,0 não inclui uma estrutura compartilhada Microsoft.AspNetCore.All .
Motivo da alteração
Ação recomendada
Migre seu projeto para usar a estrutura Microsoft.AspNetCore.App . Os componentes que estavam disponíveis anteriormente no
Microsoft.AspNetCore.All ainda estão disponíveis no NuGet. Esses componentes agora são implantados com seu aplicativo, em vez de
Categoria
ASP.NET Core
APIs afetadas
Nenhum
O campo HandshakeProtocol. SuccessHandshakeData foi removido e substituído por um método auxiliar que gera uma resposta de
handshake com êxito, dado um IHubProtocol específico.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
Campos adicionais foram adicionados à resposta de handshake que são não constantes e mudam dependendo do protocolo selecionado.
Ação recomendada
nenhuma. Esse tipo não é projetado para uso do código do usuário. É public , para que possa ser compartilhado entre o servidor e o
cliente do Signalr. Ele também pode ser usado por clientes do Signalr do cliente escritos em .NET. Os usuários do signalr não devem ser
afetados por essa alteração.
Categoria
ASP.NET Core
APIs afetadas
SuccessHandshakeData
Os métodos ResetSendPing e ResetTimeout foram removidos da API do Signalr HubConnection . Esses métodos eram originalmente
destinados apenas ao uso interno, mas foram disponibilizados para o público em ASP.NET Core 2,2. Esses métodos não estarão disponíveis
a partir da versão ASP.NET Core 3,0 Preview 4. Para obter uma discussão, consulte ASPNET/AspNetCore # 8543.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
Esses métodos eram originalmente destinados apenas ao uso interno, mas foram disponibilizados para o público em ASP.NET Core 2,2.
Ação recomendada
Categoria
ASP.NET Core
APIs afetadas
• HubConnection.ResetSendPing()
• HubConnection.ResetTimeout()
Os construtores HubConnectionContext do signalr foram alterados para aceitar um tipo de opções, em vez de vários parâmetros, para a
adição de opções à prova de futuro. Essa alteração substitui dois construtores por um único Construtor que aceita um tipo de opções.
Versão introduzida
3.0
Comportamento antigo
C# = Copiar
Novo comportamento
C# = Copiar
Motivo da alteração
O novo construtor usa um novo objeto Options. Consequentemente, os recursos de HubConnectionContext podem ser expandidos no
futuro sem fazer mais construtores e alterações significativas.
Ação recomendada
C# = Copiar
C# = Copiar
Categoria
ASP.NET Core
APIs afetadas
No ASP.NET Core 3,0 Preview 7, o nome do pacote de cliente do sinalizador JavaScript mudou de @aspnet/signalr para
@microsoft/signalr . A alteração de nome reflete o fato de que o Signalr é útil em mais do que apenas ASP.NET Core aplicativos, graças ao
Para reagir a essa alteração, altere as referências em seus arquivos Package. JSON , instruções require e instruções ECMAScript import .
Nenhuma API será alterada como parte dessa renomeação.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Motivo da alteração
A alteração de nome esclarece que o Signalr é útil além dos aplicativos ASP.NET Core, graças ao serviço do Azure Signalr.
Ação recomendada
Categoria
ASP.NET Core
APIs afetadas
Nenhum
Os métodos UseConnections e UseSignalR e as classes ConnectionsRouteBuilder e HubRouteBuilder são marcados como obsoletos no
ASP.NET Core 3,0.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
A maneira antiga de configurar o roteamento foi obsoleta e substituída pelo roteamento de ponto de extremidade.
Motivo da alteração
O middleware está sendo movido para o novo sistema de roteamento de ponto de extremidade. A maneira antiga de adicionar o
middleware está sendo obsoleta.
Ação recomendada
Código antigo:
C# = Copiar
app.UseSignalR(routes =>
{
routes.MapHub<SomeHub>("/path");
});
Novo código:
C# = Copiar
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<SomeHub>("/path");
});
Categoria
ASP.NET Core
APIs afetadas
• 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
Todos os conteúdos dos pacotes NuGet a seguir foram desnecessários desde ASP.NET Core 2,1. Consequentemente, os seguintes pacotes
estão sendo marcados como obsoletos:
Pelo mesmo motivo, os seguintes módulos NPM estão sendo marcados como preteridos:
• ASPNET-angular
• ASPNET-pré-processamento
• ASPNET-webpack
• ASPNET-webpack – reagir
• tarefa de domínio
3.0
Comportamento antigo
Os pacotes preteridos e os módulos NPM foram destinados a integrar ASP.NET Core com várias estruturas de SPA (aplicativo de página
única). Tais estruturas incluem angular, reagir e reagir com Redux.
Novo comportamento
Existe um novo mecanismo de integração no pacote NuGet Microsoft. AspNetCore. SpaServices. Extensions . O pacote permanece a base
dos modelos de projeto angular e reajam desde o ASP.NET Core 2,1.
Motivo da alteração
O ASP.NET Core dá suporte à integração com várias estruturas de SPA (aplicativo de página única), incluindo angular, reagir e reagir com
Redux. Inicialmente, a integração com essas estruturas foi realizada com componentes específicos do ASP.NET Core que manipulavam
cenários como o pré-processamento do lado do servidor e a integração com o webpack. À medida que o tempo passou, os padrões do
setor mudaram. Cada uma das estruturas de SPA lançou suas próprias interfaces de linha de comando padrão. Por exemplo, CLI angular e
Create-reajam-app.
Quando ASP.NET Core 2,1 foi lançado em maio de 2018, a equipe respondeu à alteração nos padrões. Foi fornecida uma maneira mais
nova e mais simples de integrar com o próprio cadeias das estruturas do SPA. O novo mecanismo de integração existe no pacote
Microsoft.AspNetCore.SpaServices.Extensions e permanece a base dos modelos de projeto angular e reajam desde ASP.NET Core 2,1.
Para esclarecer que os componentes mais antigos ASP.NET Core específicos são irrelevantes e não são recomendados:
Ação recomendada
Se você estiver usando esses pacotes, atualize seus aplicativos para usar a funcionalidade:
• No pacote Microsoft.AspNetCore.SpaServices.Extensions .
• Fornecido pelas estruturas SPA que você está usando
Para habilitar recursos como o pré-processamento do lado do servidor e a recarga de módulo quente, consulte a documentação da
estrutura SPA correspondente. A funcionalidade no Microsoft.AspNetCore.SpaServices.Extensions não está obsoleta e continuará a ter
suporte.
Categoria
ASP.NET Core
APIs afetadas
• Microsoft.AspNetCore.Builder.SpaRouteExtensions
• Microsoft.AspNetCore.Builder.WebpackDevMiddleware
• Microsoft.AspNetCore.NodeServices.EmbeddedResourceReader
• Microsoft.AspNetCore.NodeServices.INodeServices
• Microsoft.AspNetCore.NodeServices.NodeServicesFactory
• Microsoft.AspNetCore.NodeServices.NodeServicesOptions
• Microsoft.AspNetCore.NodeServices.StringAsTempFile
• 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.Prerenderer
• Microsoft.AspNetCore.SpaServices.Prerendering.PrerenderTagHelper
• Microsoft.AspNetCore.SpaServices.Prerendering.RenderToStringResult
• Microsoft.AspNetCore.SpaServices.Webpack.WebpackDevMiddlewareOptions
• Microsoft.Extensions.DependencyInjection.NodeServicesServiceCollectionExtensions
• Microsoft.Extensions.DependencyInjection.PrerenderingServiceCollectionExtensions
Microsoft.AspNetCore.SpaServices e Microsoft.AspNetCore.NodeServices não exibirão logs do console, a menos que o log esteja
configurado.
Versão introduzida
3.0
Comportamento antigo
Novo comportamento
Microsoft.AspNetCore.SpaServices e Microsoft.AspNetCore.NodeServices não exibirão logs do console, a menos que o log esteja
configurado.
Motivo da alteração
Há a necessidade de se alinhar com o modo como outros pacotes de ASP.NET Core implementam o registro em log.
Ação recomendada
Se o comportamento antigo for necessário, para configurar o log do console, adicione services.AddLogging(builder => builder.AddConsole
()) ao seu método Setup.ConfigureServices .
Categoria
ASP.NET Core
APIs afetadas
Nenhum
A partir do ASP.NET Core 3,0, .NET Framework é uma estrutura de destino sem suporte.
Alterar descrição
.NET Framework 4,8 é a última versão principal do .NET Framework. Novos aplicativos de ASP.NET Core devem ser criados no .NET Core. A
partir da versão 3,0 do .NET Core, você pode considerar ASP.NET Core 3,0 como parte do .NET Core.
Os clientes que usam ASP.NET Core com .NET Framework podem continuar de uma maneira totalmente compatível usando a versão 2,1 do
LTS. O suporte e serviço para 2,1 continua até, pelo menos, 21 de agosto de 2021. Essa data é de três anos após a declaração da versão do
LTS de acordo com a política de suporte do .net. O suporte para pacotes ASP.NET Core 2,1 em .NET Framework será estendido
indefinidamente, semelhante à política de serviço para outras estruturas ASP.net baseadas em pacote.
Para obter mais informações sobre como portar do .NET Framework para o .NET Core, consulte portando para o .NET Core.
os pacotes Microsoft.Extensions (como registro em log, injeção de dependência e configuração) e Entity Framework Core não são
afetados. Eles continuarão a dar suporte a .NET Standard.
Para obter mais informações sobre a motivação para essa alteração, consulte a postagem do blog original.
Versão introduzida
3.0
Comportamento antigo
ASP.NET Core aplicativos podem ser executados no .NET Core ou .NET Framework.
Novo comportamento
Ação recomendada
Categoria
ASP.NET Core
APIs afetadas
Nenhum
CoreFx
As APIs que relatam versão agora relatam produto e não versão de arquivo
Muitas das APIs que retornam versões no .NET Core agora retornavam a versão do produto em vez da versão do arquivo.
Alterar descrição
No .NET Core 2,2 e em versões anteriores, métodos como Environment.Version, RuntimeInformation.FrameworkDescriptione a caixa de
diálogo Propriedades do arquivo para assemblies do .NET Core refletem a versão do arquivo. A partir do .NET Core 3,0, eles refletem a
versão do produto.
A figura a seguir ilustra a diferença nas informações de versão do assembly System. Runtime. dll para .net Core 2,2 (à esquerda) e do .net
Core 3,0 (à direita), conforme exibido pela caixa de diálogo Propriedades de arquivo do Windows Explorer .
Versão introduzida
3.0
Ação recomendada
nenhuma. Essa alteração deve tornar a detecção de versão intuitiva, em vez de obtuso.
Categoria
CoreFx
APIs afetadas
• Environment.Version
• RuntimeInformation.FrameworkDescription
Alterar descrição
Durante uma operação de transcodificação de caractere para byte, o tempo de execução detecta sequências UTF-16 mal formadas ou não
conversíveis e fornece esses caracteres para o método EncoderFallbackBuffer.Fallback. O método Fallback determina quais caracteres
devem ser substituídos pelos dados não conversíveis originais, e esses caracteres são drenados chamando
EncoderFallbackBuffer.GetNextChar em um loop.
Em seguida, o tempo de execução tenta transcodificar esses caracteres de substituição para a codificação de destino. Se essa operação for
realizada com sucesso, o tempo de execução continuará transcodificando de onde parou na cadeia de caracteres de entrada original.
No .NET Core Preview 7 e versões anteriores, implementações personalizadas de EncoderFallbackBuffer.GetNextChar() podem retornar
sequências de caracteres que não são conversíveis para a codificação de destino. Se os caracteres substituídos não puderem ser
transcodificados para a codificação de destino, o tempo de execução invocará o método EncoderFallbackBuffer.Fallback mais uma vez com
os caracteres de substituição, esperando que o método EncoderFallbackBuffer.GetNextChar() retorne uma nova sequência de substituição.
Esse processo continua até que o tempo de execução eventualmente Veja uma substituição bem formada, conversível ou até que uma
contagem de recursão máxima seja atingida.
A partir do .NET Core 3,0, implementações personalizadas de EncoderFallbackBuffer.GetNextChar() devem retornar sequências de
caracteres que são conversíveis para a codificação de destino. Se os caracteres substituídos não puderem ser transcodificados para a
codificação de destino, um ArgumentException será lançado. O tempo de execução não fará mais chamadas recursivas na instância
EncoderFallbackBuffer.
Esse comportamento se aplica somente quando todas as três condições a seguir são atendidas:
• O tempo de execução detecta uma sequência UTF-16 mal formada ou uma sequência UTF-16 que não pode ser convertida para a
codificação de destino.
• Um EncoderFallback personalizado foi especificado.
• O EncoderFallback personalizado tenta substituir uma nova sequência UTF-16 mal formada ou não conversível.
Versão introduzida
3.0
Ação recomendada
Categoria
CoreFx
APIs afetadas
• EncoderFallbackBuffer.Fallback
• EncoderFallbackBuffer.GetNextChar()
A Double análise de ponto flutuante e o comportamento de formatação ( Single pelos tipos e) agora são compatíveis com IEEE.
Alterar descrição
No .NET Core 2,2 e versões anteriores, Formatar com Double.ToString e Single.ToStringe analisar Single.TryParse com, Double.TryParse,
Double.Parse Single.Parsee não são compatíveis com IEEE. Como resultado, é impossível garantir que um valor seja arvoltado com qualquer
cadeia de caracteres de formato padrão ou personalizada com suporte. Para algumas entradas, a tentativa de analisar um valor formatado
pode falhar e, para outros, o valor analisado não é igual ao valor original.
A partir do .NET Core 3,0, as operações de análise e formatação são compatíveis com o IEEE 754. Isso garante que o comportamento dos
tipos de ponto flutuante no .NET corresponda ao de linguagens compatíveis com IEEE, C#como. Para obter mais informações, consulte a
postagem de ponto flutuante e melhorias de formatação no blog do .NET Core 3,0 .
Versão introduzida
3.0
Ação recomendada
A seção "impacto potencial para código existente" das melhorias de análise de ponto flutuante e de formatação na postagem de blog
do .net Core 3,0 sugere alterações no código se você observar uma alteração de comportamento em comparação com os aplicativos .net
Core 2,2 em geral, Isso envolve o uso de uma cadeia de caracteres de formato padrão ou personalizada diferente para impor o
comportamento desejado. Alguns resultados podem não ter uma solução alternativa se eles estavam incorretos anteriormente.
Categoria
CoreFx
APIs afetadas
• Double.ToString
• Single.ToString
• Double.Parse
• Double.TryParse
• Single.Parse
• Single.TryParse
Operações de análise de ponto flutuante não falham mais ou geram uma estourexception
Os métodos de análise de ponto flutuante não lançam mais um OverflowException ou retornam false quando analisam uma cadeia de
caracteres cujo valor numérico está fora do intervalo do Single ou Double tipo de ponto flutuante.
Alterar descrição
No .NET Core 2,2 e versões anteriores, os métodos Double.Parse e Single.Parse geram uma OverflowException para valores que estão fora
do intervalo de seus respectivos tipos. Os métodos Double.TryParse e Single.TryParse retornam false para as representações de cadeia de
caracteres de valores numéricos fora do intervalo.
A partir do .NET Core 3,0, os métodos Double.Parse, Double.TryParse, Single.Parsee Single.TryParse não falham mais ao analisar cadeias de
caracteres numéricas fora do intervalo. Em vez disso, os métodos de análise de Double retornam Double.PositiveInfinity para valores que
excedem Double.MaxValuee retornam Double.NegativeInfinity para valores menores que Double.MinValue. Da mesma forma, os métodos
de análise de Single retornam Single.PositiveInfinity para valores que excedem Single.MaxValuee retornam Single.NegativeInfinity para
valores menores que Single.MinValue.
Essa alteração foi feita para melhorar a conformidade com o IEEE 754:2008.
Versão introduzida
3.0
Ação recomendada
• Seu código depende do manipulador para que o OverflowException seja executado quando ocorrer um estouro. Nesse caso, você
deve remover a instrução catch e inserir qualquer código necessário em uma instrução If que testa se Double.IsInfinity ou
Single.IsInfinity é true .
• Seu código supõe que os valores de ponto flutuante não são Infinity . Nesse caso, você deve adicionar o código necessário para
verificar se há valores de ponto flutuante de PositiveInfinity e NegativeInfinity .
Categoria
CoreFx
APIs afetadas
• Double.Parse
• Double.TryParse
• Single.Parse
• Single.TryParse
Alterar descrição
No .NET Core 2,2 e versões anteriores, a InvalidAsynchronousStateException classe é encontrada no assembly System. ComponentModel.
TypeConverter .
A partir do .NET Core 3,0, ele é encontrado no assembly System. ComponentModel. primitivas .
Versão introduzida
3.0
Ação recomendada
Essa alteração afeta apenas os aplicativos que usam a reflexão para InvalidAsynchronousStateException carregar o chamando um método
Assembly.GetType como ou uma sobrecarga de Activator.CreateInstance que assume que o tipo está em um assembly específico. Se esse
for o caso, o assembly ao qual o assembly referenciado na chamada do método deve ser atualizado para refletir o novo local do assembly
do tipo.
Categoria
CoreFx
APIs afetadas
• Nenhum
O .NET Core 3,0 segue as práticas recomendadas de Unicode ao substituir sequências de bytes UTF-8 malformadas
Quando a classe UTF8Encoding encontra uma sequência de bytes UTF-8 mal formada durante uma operação de transcodificação byte a
caractere, ela substituirá essa sequência por um caractere ' ' (caractere de substituição U + FFFD) na cadeia de caracteres de saída. O .NET
Core 3,0 é diferente das versões anteriores do .NET Core e do .NET Framework seguindo a prática recomendada de Unicode para executar
essa substituição durante a operação de transcodificação.
Isso faz parte de um esforço maior para melhorar a manipulação de UTF-8 em todo o .NET, incluindo os novos tipos
System.Text.Unicode.Utf8 e System.Text.Rune. O tipo UTF8Encoding recebeu um mecanismo de tratamento de erros aprimorado para que
ele produza uma saída consistente com os tipos introduzidos recentemente.
Alterar descrição
A partir do .NET Core 3,0, ao transcodificar bytes em caracteres, a classe UTF8Encoding executa a substituição de caracteres com base nas
práticas recomendadas Unicode. O mecanismo de substituição usado é descrito pelo padrão Unicode, versão 12,0, seg. 3,9 (PDF) no título
intitulado U + FFFD substituição de subpartes do máximo.
Esse comportamento se aplica somente quando a sequência de bytes de entrada contém dados UTF-8 mal formados. Além disso, se a
instância UTF8Encoding tiver sido construída com throwOnInvalidBytes: true (consulte a [documentação do construtor do UTF8Encoding]
(UTF8Encoding(Boolean, Boolean), a instância UTF8Encoding continuará a gerar uma entrada inválida em vez de executar a substituição U +
FFFD.
O seguinte ilustra o impacto dessa alteração com uma entrada de 3 bytes inválida:
Entrada de 3 bytes formada incorretamente Saída antes do .NET Core 3,0 Saída a partir do .NET Core 3,0
Essa saída de 3 caracteres é a saída preferida, de acordo com a tabela 3-9 do PDF padrão Unicode vinculado anteriormente.
Versão introduzida
3.0
Ação recomendada
Categoria
CoreFx
APIs afetadas
• UTF8Encoding.GetCharCount
• UTF8Encoding.GetChars
• UTF8Encoding.GetString(Byte[], Int32, Int32)
No .NET Core 2,2 e versões anteriores, a TypeDescriptionProviderAttribute classe é encontrada no assembly System. ComponentModel.
TypeConverter .
Versão introduzida
3.0
Ação recomendada
Essa alteração afeta apenas os aplicativos que usam a reflexão para TypeDescriptionProviderAttribute carregar o tipo chamando um
método Assembly.GetType como ou uma sobrecarga de Activator.CreateInstance que assume que o tipo está em um assembly específico.
Se esse for o caso, o assembly referenciado na chamada do método deverá ser atualizado para refletir o novo local do assembly do tipo.
Categoria
Windows Forms
APIs afetadas
• Nenhum
O ZipArchiveEntry não lida mais com os arquivos mortos com tamanhos de entrada inconsistentes
Os arquivos zip listam Tamanho compactado e Tamanho descompactado no diretório central e no cabeçalho local. Os próprios dados de
entrada também indicam seu tamanho. No .NET Core 2,2 e versões anteriores, esses valores nunca foram verificados quanto à consistência.
A partir do .NET Core 3,0, eles agora são.
Alterar descrição
No .NET Core 2,2 e versões anteriores, ZipArchiveEntry.Open() o é bem sucedido mesmo que o cabeçalho local desconcorde com o
cabeçalho central do arquivo zip. Os dados são descompactados até que o final do fluxo compactado seja atingido, mesmo que seu
comprimento exceda o tamanho do arquivo descompactado listado no cabeçalho do diretório central/local.
A partir do .NET Core 3,0, ZipArchiveEntry.Open() o método verifica se o cabeçalho local e o cabeçalho central concordam em tamanhos
compactados e não compactados de uma entrada. Se não tiverem, o método lançará um InvalidDataException se o cabeçalho local do
arquivo e/ou os tamanhos da lista do descritor de dados que discordarem com o diretório central do arquivo zip. Ao ler uma entrada, os
dados descompactados são truncados para o tamanho de arquivo descompactado listado no cabeçalho.
Essa alteração foi feita para garantir que um ZipArchiveEntry represente corretamente o tamanho de seus dados e que apenas essa
quantidade de dados seja lida.
Versão introduzida
3.0
Ação recomendada
Categoria
CoreFx
APIs afetadas
• ZipArchiveEntry.Open()
• ZipFileExtensions.ExtractToDirectory
• ZipFileExtensions.ExtractToFile
• ZipFile.ExtractToDirectory
Criptografia
O algoritmo de criptografia simétrica padrão usado pelo EnvelopedCms foi alterado de TripleDES para AES-256.
Alterar descrição
No .NET Core Preview 7 e versões anteriores, quando EnvelopedCms é usado para criptografar dados sem especificar um algoritmo de
criptografia simétrica por meio de uma sobrecarga de construtor, os dados foram criptografados com o algoritmo
TripleDES/3DES/3DEA/DES3-EDE.
A partir do .NET Core 3,0 Preview 8 (por meio da versão 4.6.0 do pacote NuGet System. Security. Cryptography. Pkcs ), o algoritmo padrão
foi alterado para AES-256 para modernização do algoritmo e para melhorar a segurança das opções padrão. Se um certificado de
destinatário de mensagem tiver uma chave pública Diffie-Hellman (não-EC), a operação de criptografia poderá falhar com um
CryptographicException devido a limitações na plataforma subjacente.
No código de exemplo a seguir, os dados são criptografados com TripleDES se executados no .NET Core 3,0 Preview 7 ou anterior. Se
estiver executando no .NET Core 3,0 Preview 8 ou posterior, ele será criptografado com AES-256.
C# = Copiar
Versão introduzida
3,0 Preview 8
Ação recomendada
Se você for afetado negativamente pela alteração, poderá restaurar a criptografia TripleDES especificando explicitamente o identificador de
algoritmo de criptografia em um Construtor EnvelopedCms que inclui um parâmetro do tipo AlgorithmIdentifier, como:
C# = Copiar
cms.Encrypt(recipient);
return cms.Encode()l
Categoria
Criptografia
APIs afetadas
• EnvelopedCms.EnvelopedCms()
• EnvelopedCms.EnvelopedCms(ContentInfo)
• EnvelopedCms.EnvelopedCms(SubjectIdentifierType, ContentInfo)
O tamanho mínimo para gerar novas chaves RSA no Linux aumentou de 384 bits para 512 bits.
Alterar descrição
A partir do .NET Core 3,0, o tamanho mínimo da chave legal relatado LegalKeySizes pela propriedade nas instâncias RSA RSA.Createde
RSAOpenSsl.RSAOpenSsl, e RSACryptoServiceProvider.RSACryptoServiceProvider no Linux aumentou de 384 para 512.
Como resultado, no .NET Core 2,2 e em versões anteriores, uma chamada de método como RSA.Create(384) o é bem sucedido. No .NET
Core 3,0 e versões posteriores, a chamada RSA.Create(384) do método gera uma exceção indicando que o tamanho é muito pequeno.
Essa alteração foi feita porque o OpenSSL, que executa as operações criptográficas no Linux, aumentou seu mínimo entre as versões 1.0.2 e
1.1.0. O .NET Core 3,0 prefere o OpenSSL 1.1. x a 1,0. x e a versão relatada mínima foi gerada para refletir essa nova limitação de
dependência mais alta.
Versão introduzida
3.0
Ação recomendada
Se você chamar qualquer uma das APIs afetadas, certifique-se de que o tamanho de qualquer chave gerada não seja menor do que o
mínimo do provedor.
7 Observação
o RSA de 384 bits já é considerado inseguro (como é o RSA de 512 bits). As recomendações modernas, como a publicação especial do
NIST 800-57 parte 1 revisão 4, sugerem 2048 bits como o tamanho mínimo para chaves geradas recentemente.
Categoria
Criptografia
APIs afetadas
• AsymmetricAlgorithm.LegalKeySizes
• RSA.Create
• RSAOpenSsl.RSAOpenSsl
• RSACryptoServiceProvider.RSACryptoServiceProvider
O .NET Core para Linux, que funciona em várias distribuições do Linux, pode dar suporte a OpenSSL 1.0. x e OpenSSL 1.1. x. .NET Core 2,1
e .NET Core 2,2 Procure 1,0. x primeiro e, em seguida, retorne para 1.1. x; o .NET Core 3,0 procura por 1,1. x primeiro. Essa alteração foi feita
para adicionar suporte para novos padrões de criptografia.
Essa alteração pode afetar as bibliotecas ou os aplicativos que fazem a interoperabilidade de plataforma com os tipos de interoperabilidade
específicos do OpenSSL no .NET Core.
Alterar descrição
No .NET Core 2,2 e versões anteriores, o tempo de execução prefere carregar o OpenSSL 1.0. x acima de 1.1. x. Isso significa que os IntPtr
tipos SafeHandle e para interoperabilidade com OpenSSL são usados com libcrypto. portanto. 1.0.0/libcrypto. portanto. 1.0/libcrypto.
portanto, 10 por preferência.
A partir do .NET Core 3,0, o tempo de execução prefere carregar o OpenSSL 1.1. x em relação ao OpenSSL 1.0 IntPtr . SafeHandle x,
portanto, os tipos e para interoperabilidade com OpenSSL são usados com libcrypto. por isso, 1.1/libcrypto. portanto, 11/libcrypto.
portanto, 1.1.0/libcrypto. portanto. 1.1.1 por preferência. Como resultado, as bibliotecas e os aplicativos que interoperam com o OpenSSL
diretamente podem ter ponteiros incompatíveis com os valores expostos do .NET Core ao atualizar do .NET Core 2,1 ou do .NET Core 2,2.
Versão introduzida
3.0
Ação recomendada
Bibliotecas e aplicativos que fazem operações diretas com o OpenSSL precisam ter cuidado para garantir que estejam usando a mesma
versão do OpenSSL que o tempo de execução do .NET Core.
Todas as bibliotecas ou aplicativos que IntPtr usam SafeHandle ou valores dos tipos de criptografia do .NET Core diretamente com o
OpenSSL devem comparar a versão da biblioteca que usam com SafeEvpPKeyHandle.OpenSslVersion a nova propriedade para garantir que
os ponteiros sejam compatíveis.
Categoria
Criptografia
APIs afetadas
• SafeEvpPKeyHandle.SafeEvpPKeyHandle
• RSAOpenSsl.RSAOpenSsl(IntPtr)
• RSAOpenSsl.RSAOpenSsl(SafeEvpPKeyHandle)
• RSAOpenSsl.DuplicateKeyHandle()
• DSAOpenSsl.DSAOpenSsl(IntPtr)
• DSAOpenSsl.DSAOpenSsl(SafeEvpPKeyHandle)
• DSAOpenSsl.DuplicateKeyHandle()
• ECDsaOpenSsl.ECDsaOpenSsl(IntPtr)
• ECDsaOpenSsl.ECDsaOpenSsl(SafeEvpPKeyHandle)
• ECDsaOpenSsl.DuplicateKeyHandle()
• ECDiffieHellmanOpenSsl.ECDiffieHellmanOpenSsl(IntPtr)
• ECDiffieHellmanOpenSsl.ECDiffieHellmanOpenSsl(SafeEvpPKeyHandle)
• ECDiffieHellmanOpenSsl.DuplicateKeyHandle()
• X509Certificate.Handle
Globalização
O .NET Core 2,2 e versões anteriores dependem do comportamento padrão do ICU, que mapeia a localidade "C" para a localidade
en_US_POSIX. A localidade en_US_POSIX tem um comportamento de agrupamento indesejável, pois não oferece suporte a comparações de
cadeias de caracteres que não diferenciam maiúsculas de minúscula Como algumas distribuições do Linux definem a localidade "C" como a
localidade padrão, os usuários estão apresentando um comportamento inesperado.
Alterar descrição
A partir do .NET Core 3,0, o mapeamento de localidade "C" foi alterado para usar a localidade invariável em vez de en_US_POSIX. A
localidade "C" para mapeamento invariável também é aplicada ao Windows para fins de consistência.
O mapeamento de "C" para a cultura en_US_POSIX causou confusão do cliente, pois o en_US_POSIX não dá suporte a operações de cadeia
de caracteres de classificação/pesquisa sem diferenciação Como a localidade "C" é usada como uma localidade padrão em alguns dos
distribuições do Linux, os clientes tiveram esse comportamento indesejado nesses sistemas operacionais.
Versão introduzida
3.0
Ação recomendada
Nada mais específico do que a conscientização dessa alteração. Essa alteração afeta apenas os aplicativos que usam o mapeamento de
localidade "C".
Categoria
Globalização
APIs afetadas
Rede
Versão introduzida
.NET Core 3.0
Alterar descrição
No .NET Core 1,0 até 2,0, o valor padrão da propriedade System.Net.Http.HttpRequestMessage.Version é 1,1. A partir do .NET Core 2,1, ele
foi alterado para 2,1.
A partir do .NET Core 3,0, o número de versão padrão retornado pela propriedade System.Net.Http.HttpRequestMessage.Version é mais
uma vez 1,1.
Ação recomendada
Atualize seu código se ele depender da propriedade System.Net.Http.HttpRequestMessage.Version retornando um valor padrão de 2,0.
Categoria
Rede
APIs afetadas
• System.Net.Http.HttpRequestMessage.Version
Sim Não