Dicas para migrar sua aplicação
ASP.NET para ASP.NET Core
#VSSUMMIT
DEVO MIGRAR PARA ASP.NET CORE
SE…
Desempenho é algo obrigatório (Kestrel delivers 7M req/sec)
Suporte multiplataforma é necessário
Ambiente Enterprise (muitas aplicações em mesmo server, diferentes frameworks, etc)
Se o update de 6 meses para Open Source é algo aceitável
Sua aplicação já é ASP.NET MVC, WebAPI, ou SignalR
NÃO MIGRAR PARA ASP.NET CORE
SE…
Você acha legal, novo ou só porque seus amigos estão usando
Sua aplicação precisa trabalhar com containers
Você precisa de Injeção de Dependência em todos os lugares
Você gosta de web.config
A sua aplicação funciona bem e entrega o que precisa para o seu negócio
Visão da plataforma .NET atualmente
LIBRARIES
INFRASTRUCTURE
.NET STANDARD
DESKTOP WEB CLOUD MOBILE GAMING IoT AI
NEWTONSOFT.JSONPacote de
Exemplo
DOTNETOPENAUTHPacote de
Exemplo
ARQUIVO CSPROJ NO ASP.NET
4.6.1
ARQUIVO CSPROJ NO ASP.NET
CORE 2.1
PREOCUPAÇÕES COM O
STARTUP.CS
 Certifique-se de que o middleware para solicitações MVC/WebAPI esteja configurado corretamente
 Revise e adicione configuração para:
o CORS – Cross-Origin Resource Sharing
o Global Exception Handling
o MVC Routing
o MVC / WebAPI Filters
o WebAPI Formatters
o Model Binders
o Areas
o Authentication
CONFIGURAÇÃO CORS
services.AddCors(options =>
{
options.AddPolicy("AllowAnyOrigin",
builder => builder
.AllowAnyMethod()
.AllowAnyHeader());
});
MANIPULAÇÃO DE EXCEPTIONS
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
FILTERS
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Filters.Add(new AddHeaderAttribute("GlobalAddHeader",
"Resultado do filter adicionado para o GlobalHeader")); // uma instância
options.Filters.Add(typeof(SampleActionFilter)); // por type
options.Filters.Add(new SampleGlobalActionFilter()); // uma instância
});
services.AddScoped<AddHeaderFilterWithDi>();
}
FORMATTERS
public class VcardOutputFormatter : TextOutputFormatter
public class VcardInputFormatter : TextInputFormatter
services.AddMvc(options =>
{
options.InputFormatters.Insert(0, new VcardInputFormatter());
options.OutputFormatters.Insert(0, new VcardOutputFormatter());
});
CRIE UM MIDDLEWARE
 Software montado em um pipeline
 Lida com solicitações e respostas,
BeginRequest e EndRequest
 Sua classe Middleware deve manipular um
Delegate
MANIPULE O MIDDLEWARE
O manipulador processa a solicitação e entrega
RequestDelegate
Request
USANDO O NOVO MIDDLEWARE
app.UseMiddleware<MyMiddleware>();
app.MapWhen(
context =>
context.Request.Path.ToString().EndsWith(".report"),
appBranch => {
appBranch.UseMiddleware<MyHandlerMiddleware Handler>();
});
INJEÇÃO DE DEPENDÊNCIA
INTEGRADA
 Padrão DI nativo
 Controle simples e eficiente em três escopos:
 Transient: todos diferentes. Nova instância para todos controladores e serviços
 Scoped: mesma instância para a mesma request, porém diferente em requests diferentes
 Singleton: mesma instância. Para todos os objetos e requests
 Startup.ConfigureServices ()
COMPATIBILIDADE DA WEBAPI
 Incluir o Microsoft.AspNetCore.Mvc.WebApiCompatShim para facilitar a
compatibilidade com o Web API 2.
 O máximo que puder, sempre migre pra usar o [ApiController]
 Se você estiver usando HttpResponseMessage em seus Web Api Controllers, você
precisará fazer uma pequena alteração de código na sua classe de inicialização para
chamar AddWebApiConventions().
services.AddMvc().AddWebApiConventions()
 Dependendo de como você deseja fazer o roteamento com o Web API, talvez seja necessário
registrar as rotas para ele na sua classe de inicialização.
routes.MapWebApiRoute(name: "DefaultApi",
template: "api/{controller}/{id?}");
ESTRATÉGIAS DE MIGRAÇÃO DAS
CONFIGURAÇÕES
Copie o conteúdo para appsettings.json
Migrar conteúdo para o Azure Key Vault
 Refatore para usar o Configuration[“setting”]
Para uma transição suave use o pacote System.Configuration.ConfigurationManager
 Não há necessidade de refatoração das configs e você traz todo o web.config
 Não é compatível com Linux ou Mac
 Deve estar sendo executado no IIS
CONTEÚDO ESTÁTICO NO
WWWROOT
PORTABILIDADE DO ENTITY
FRAMEWORK
Entity Framework 6.x é incompatível com o .NET Core
 Solução: Rodar aplicações ASP.NET Core no .NET Framework
 Restrição: roda apenas no Windows e IIS
Scaffold EF Core data-context from existing database
dotnet ef dbcontext scaffold “ConnectionString“
Microsoft.EntityFrameworkCore.SqlServer -o Model
SUPORTE DI PARA O DBCONTEXT
Configure seu DbContext no ConfigureServices
Adicione o novo construtor DbContextOptions
Aceite o contexto como parâmetro de entrada em Controllers, Views, etc
Mude o System.Web.HttpContext para o
novo Microsoft.AspNetCore.Http.HttpContext
http://bit.ly/migratehttphandlers
AUTENTICAÇÃO E AUTORIZAÇÃO
Comece usando o ASP.NET Core Identity
 Não use sua própria solução de segurança
 Use o scaffold do Identity 2.1 e personalize para corresponder aos seus objetos
anteriores.
GERENCIANDO JAVASCRIPT/CSS COM
ASP.NET CORE
Adicione package.json/libman.json como referências aos seus pacotes
 libman.json não depende do NodeJS
 libman.json localiza arquivos conforme as instruções, o package.json requer outra etapa para implementar
os recursos
Use a extensão BunderMinifier ao invés do System.Web.Optimization
 Procure o “MadsKristensen.BundlerMinifier” no Visual Studio Marketplace
 Instale o pacote NuGet para o bundle on build – isso permitirá que compilações de
linha de comando sejam agrupadas
 Preserve o bundleconfig.json
MIGRANDO VIEWS
Razor é compatível com versões anteriores
Copie a pasta Views para dentro do novo projeto
Converta Views/web.config para Views/_ViewImports.cshtml
 Converta namespaces.add para @using
 Migre todas as configurações para a configurações centrais da aplicação
Scripts.Render e Styles.Render não existem
 Troque as referencias de saída para o libman ou BundlerMinifier
RECURSOS PARA IR ALÉM
Documentação official de migração
https://aka.ms/aspnetmigrate21
Visual Studio Channel
 https://twitch.tv/visualstudio
 https://mixer.com/visualstudio
ASP.NET Blog
 https://blogs.msdn.microsoft.com/webdev
#VSSUMMIT
MUITOOBRIGADO!

Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x

  • 1.
    Dicas para migrarsua aplicação ASP.NET para ASP.NET Core #VSSUMMIT
  • 3.
    DEVO MIGRAR PARAASP.NET CORE SE… Desempenho é algo obrigatório (Kestrel delivers 7M req/sec) Suporte multiplataforma é necessário Ambiente Enterprise (muitas aplicações em mesmo server, diferentes frameworks, etc) Se o update de 6 meses para Open Source é algo aceitável Sua aplicação já é ASP.NET MVC, WebAPI, ou SignalR
  • 4.
    NÃO MIGRAR PARAASP.NET CORE SE… Você acha legal, novo ou só porque seus amigos estão usando Sua aplicação precisa trabalhar com containers Você precisa de Injeção de Dependência em todos os lugares Você gosta de web.config A sua aplicação funciona bem e entrega o que precisa para o seu negócio
  • 10.
    Visão da plataforma.NET atualmente LIBRARIES INFRASTRUCTURE .NET STANDARD DESKTOP WEB CLOUD MOBILE GAMING IoT AI
  • 12.
  • 13.
  • 15.
    ARQUIVO CSPROJ NOASP.NET 4.6.1
  • 16.
    ARQUIVO CSPROJ NOASP.NET CORE 2.1
  • 19.
    PREOCUPAÇÕES COM O STARTUP.CS Certifique-se de que o middleware para solicitações MVC/WebAPI esteja configurado corretamente  Revise e adicione configuração para: o CORS – Cross-Origin Resource Sharing o Global Exception Handling o MVC Routing o MVC / WebAPI Filters o WebAPI Formatters o Model Binders o Areas o Authentication
  • 20.
  • 21.
    MANIPULAÇÃO DE EXCEPTIONS if(env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } public IActionResult Error() { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); }
  • 22.
    FILTERS public void ConfigureServices(IServiceCollectionservices) { services.AddMvc(options => { options.Filters.Add(new AddHeaderAttribute("GlobalAddHeader", "Resultado do filter adicionado para o GlobalHeader")); // uma instância options.Filters.Add(typeof(SampleActionFilter)); // por type options.Filters.Add(new SampleGlobalActionFilter()); // uma instância }); services.AddScoped<AddHeaderFilterWithDi>(); }
  • 23.
    FORMATTERS public class VcardOutputFormatter: TextOutputFormatter public class VcardInputFormatter : TextInputFormatter services.AddMvc(options => { options.InputFormatters.Insert(0, new VcardInputFormatter()); options.OutputFormatters.Insert(0, new VcardOutputFormatter()); });
  • 25.
    CRIE UM MIDDLEWARE Software montado em um pipeline  Lida com solicitações e respostas, BeginRequest e EndRequest  Sua classe Middleware deve manipular um Delegate
  • 26.
    MANIPULE O MIDDLEWARE Omanipulador processa a solicitação e entrega RequestDelegate Request
  • 27.
    USANDO O NOVOMIDDLEWARE app.UseMiddleware<MyMiddleware>(); app.MapWhen( context => context.Request.Path.ToString().EndsWith(".report"), appBranch => { appBranch.UseMiddleware<MyHandlerMiddleware Handler>(); });
  • 29.
    INJEÇÃO DE DEPENDÊNCIA INTEGRADA Padrão DI nativo  Controle simples e eficiente em três escopos:  Transient: todos diferentes. Nova instância para todos controladores e serviços  Scoped: mesma instância para a mesma request, porém diferente em requests diferentes  Singleton: mesma instância. Para todos os objetos e requests  Startup.ConfigureServices ()
  • 31.
    COMPATIBILIDADE DA WEBAPI Incluir o Microsoft.AspNetCore.Mvc.WebApiCompatShim para facilitar a compatibilidade com o Web API 2.  O máximo que puder, sempre migre pra usar o [ApiController]  Se você estiver usando HttpResponseMessage em seus Web Api Controllers, você precisará fazer uma pequena alteração de código na sua classe de inicialização para chamar AddWebApiConventions(). services.AddMvc().AddWebApiConventions()  Dependendo de como você deseja fazer o roteamento com o Web API, talvez seja necessário registrar as rotas para ele na sua classe de inicialização. routes.MapWebApiRoute(name: "DefaultApi", template: "api/{controller}/{id?}");
  • 33.
    ESTRATÉGIAS DE MIGRAÇÃODAS CONFIGURAÇÕES Copie o conteúdo para appsettings.json Migrar conteúdo para o Azure Key Vault  Refatore para usar o Configuration[“setting”] Para uma transição suave use o pacote System.Configuration.ConfigurationManager  Não há necessidade de refatoração das configs e você traz todo o web.config  Não é compatível com Linux ou Mac  Deve estar sendo executado no IIS
  • 35.
  • 37.
    PORTABILIDADE DO ENTITY FRAMEWORK EntityFramework 6.x é incompatível com o .NET Core  Solução: Rodar aplicações ASP.NET Core no .NET Framework  Restrição: roda apenas no Windows e IIS Scaffold EF Core data-context from existing database dotnet ef dbcontext scaffold “ConnectionString“ Microsoft.EntityFrameworkCore.SqlServer -o Model
  • 38.
    SUPORTE DI PARAO DBCONTEXT Configure seu DbContext no ConfigureServices Adicione o novo construtor DbContextOptions Aceite o contexto como parâmetro de entrada em Controllers, Views, etc
  • 40.
    Mude o System.Web.HttpContextpara o novo Microsoft.AspNetCore.Http.HttpContext http://bit.ly/migratehttphandlers
  • 42.
    AUTENTICAÇÃO E AUTORIZAÇÃO Comeceusando o ASP.NET Core Identity  Não use sua própria solução de segurança  Use o scaffold do Identity 2.1 e personalize para corresponder aos seus objetos anteriores.
  • 44.
    GERENCIANDO JAVASCRIPT/CSS COM ASP.NETCORE Adicione package.json/libman.json como referências aos seus pacotes  libman.json não depende do NodeJS  libman.json localiza arquivos conforme as instruções, o package.json requer outra etapa para implementar os recursos Use a extensão BunderMinifier ao invés do System.Web.Optimization  Procure o “MadsKristensen.BundlerMinifier” no Visual Studio Marketplace  Instale o pacote NuGet para o bundle on build – isso permitirá que compilações de linha de comando sejam agrupadas  Preserve o bundleconfig.json
  • 46.
    MIGRANDO VIEWS Razor écompatível com versões anteriores Copie a pasta Views para dentro do novo projeto Converta Views/web.config para Views/_ViewImports.cshtml  Converta namespaces.add para @using  Migre todas as configurações para a configurações centrais da aplicação Scripts.Render e Styles.Render não existem  Troque as referencias de saída para o libman ou BundlerMinifier
  • 47.
    RECURSOS PARA IRALÉM Documentação official de migração https://aka.ms/aspnetmigrate21 Visual Studio Channel  https://twitch.tv/visualstudio  https://mixer.com/visualstudio ASP.NET Blog  https://blogs.msdn.microsoft.com/webdev
  • 48.

Notas do Editor

  • #11 .NET is an entire software development platform that takes care of a lot of the heavy lifting for you when you want to build an application. Applications frameworks help you build the specific types of apps or workloads and enable you to literally build any app for any platform with any operating system. Each .NET workload shares a common infrastructure and .NET Standard library. This means not only are your .NET skills portable, but your actual code is portable no matter what you’re building. This makes it easy to share reusable components (called libraries) across the breadth of applications people build. Additionally, there are a broad set of development tools that makes it really productive to write, debug, build and manage code bases. See: www.dot.net
  • #15 dotnet migrate Migrador do VS
  • #22 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-2.2 UseDeveloperExceptionPage: https://docs.microsoft.com/pt-br/dotnet/api/microsoft.aspnetcore.builder.developerexceptionpageextensions.usedeveloperexceptionpage?view=aspnetcore-2.2 UseExceptionHandler: https://docs.microsoft.com/pt-br/dotnet/api/microsoft.aspnetcore.builder.exceptionhandlerextensions.useexceptionhandler?view=aspnetcore-2.2
  • #23 https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.2
  • #24 https://codeopinion.com/wp-content/uploads/2018/01/out1-300x280.png https://codeopinion.com/wp-content/uploads/2018/01/out2-300x300.png
  • #25 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-2.2
  • #28 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-2.2
  • #30 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2 Transient: todos diferentes. Nova instância para todos controladores e serviços Scoped: mesma instância para a mesma request, porém diferente em requests diferentes Singleton: mesma instância. Para todos os objetos e requests
  • #40 https://docs.microsoft.com/en-us/aspnet/core/migration/http-modules?view=aspnetcore-2.2#migrating-to-the-new-httpcontext This section shows how to translate the most commonly used properties of System.Web.HttpContext to the new Microsoft.AspNetCore.Http.HttpContext.
  • #45 https://github.com/madskristensen/BundlerMinifier https://github.com/aspnet/LibraryManager/wiki/Using-LibMan-in-Visual-Studio https://www.ttmind.com/techpost/How-to-use-LibMan-ASP-NET-Core-With-Visual-Studio