Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
ASP.NET Core combina os modelos de aplicativo MVC e API Web do ASP.NET 4.x em um único modelo de programação conhecido como ASP.NET Core MVC.
Este artigo mostra como migrar o controlador de Produtos criado em Introdução ao ASP.NET da API Web 2 para o ASP.NET Core.
Prerequisites
- Visual Studio 2022 com a carga de trabalho de ASP.NET e desenvolvimento web .
- SDK do .NET 6
Criar o novo projeto ASP.NET Core Web API
- No menu Arquivo, selecione Novo>Projeto.
- Digite Web API na caixa de pesquisa.
- Selecione o modelo
ASP.NET Core Web API e selecione Next . - Na caixa de diálogo Configurar o novo projeto, nomeie o projeto ProductsCore e selecione Seguinte.
- No caixa de diálogo de Informações adicionais :
- Confirme se o Framework é .NET 6.0 (suporte a longo prazo).
- Confirma que a caixa de seleção para Usar controladores (desmarcar para usar APIs Mínimas) está assinalada.
- Desmarque a opção "Ativar o suporte a OpenAPI".
- Selecione Criar.
Remova os ficheiros de modelo WeatherForecast
- Remova os ficheiros de exemplo
WeatherForecast.cseControllers/WeatherForecastController.csdo novo projeto ProductsCore. - Abra Propriedades\launchSettings.json.
- Altere
launchUrlpropriedades deweatherforcastparaproductscore.
A configuração para ASP.NET Core Web API
ASP.NET Core não usa a pasta App_Start ou o arquivo Global.asax. O arquivo web.config é adicionado no momento da publicação. Para obter mais informações, consulte web.config arquivo.
O ficheiro Program.cs
- Substitui Global.asax.
- Lida com todas as tarefas de inicialização do aplicativo.
Para obter mais informações, consulte arranque da aplicação no ASP.NET Core.
A seguir mostra o código de inicialização do aplicativo no arquivo ASP.NET Core Program.cs:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Copie o modelo Produto
- No Gerenciador de Soluções , clique com o botão direito do mouse no projeto. Selecione Adicionar>Nova Pasta. Nomeie a pasta Modelos.
- Clique com o botão direito do rato na pasta Modelos. Selecione Adicionar>classe. Nomeie a classe Product e selecione Adicionar.
- Substitua o código do modelo pelo seguinte:
namespace ProductsCore.Models
{
public class Product
{
public int Id { get; set; }
public string? Name { get; set; }
public string? Category { get; set; }
public decimal Price { get; set; }
}
}
O código realçado anterior altera o seguinte:
- A anotação
?foi adicionada para declarar as propriedadesNameeCategorycomo tipos de referência anuláveis.
Ao utilizar o recurso Nullable introduzido no C# 8, ASP.NET Core pode fornecer análise de fluxo de código adicional e segurança em tempo de compilação no processamento de tipos de referência. Por exemplo, protegendo contra exceções de referência null.
Neste caso, a intenção é que os Name e Category possam ser tipos anuláveis.
ASP.NET Core em projetos .NET 6 habilita tipos de referência anuláveis por defeito. Para obter mais informações, consulte Tipos de referência anuláveis.
Copie o ProductsController
- Clique com o botão direito do rato na pasta Controllers.
- Selecione Adicionar > controlador....
- Na caixa de diálogo Adicionar Novo Item Andaime, selecione Controlador Mvc - Esvaziar e, em seguida, selecione Adicionar.
- Nomeie o controlador ProductsController e selecione Adicionar.
- Substitua o código do controlador de modelo pelo seguinte:
using Microsoft.AspNetCore.Mvc;
using ProductsCore.Models;
namespace ProductsCore.Controllers;
[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
Product[] products = new Product[]
{
new Product
{
Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1
},
new Product
{
Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M
},
new Product
{
Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M
}
};
[HttpGet]
public IEnumerable<Product> GetAllProducts()
{
return products;
}
[HttpGet("{id}")]
public ActionResult<Product> GetProduct(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return product;
}
}
O código destacado anterior altera o seguinte, para migrar para ASP.NET Core:
Remova as instruções de uso para os seguintes componentes ASP.NET 4.x que não existem no ASP.NET Core.
-
ApiControllerclasse -
System.Web.Httpespaço de nomes -
IHttpActionResultInterface
-
Altera a declaração
using ProductsApp.Models;parausing ProductsCore.Models;.Define o namespace raiz como
ProductsCore.Altera
ApiControllerpara ControllerBase.Adiciona
using Microsoft.AspNetCore.Mvc;para resolver a referênciaControllerBase.Altera o tipo de retorno da ação
GetProductdeIHttpActionResultparaActionResult<Product>. Para mais informações, veja Tipos de retorno de ação do controlador.Simplifica a instrução
GetProductda açãoreturnpara a seguinte declaração:return product;Adiciona os seguintes atributos que são explicados nas próximas seções:
[Route("api/[controller]")][ApiController][HttpGet][HttpGet("{id}")]
Routing
O ASP.NET Core oferece um modelo de hospedagem simplificado, no qual o middleware de roteamento de endpoints envolve todo o pipeline de middleware. Assim, as rotas podem ser adicionadas diretamente ao WebApplication sem a necessidade de uma chamada explícita para UseEndpoints ou UseRouting para registrar rotas.
UseRouting ainda pode ser usado para especificar onde a combinação de rotas ocorre, mas UseRouting não precisa ser explicitamente chamada se as rotas devem ser combinadas no início do pipeline de middleware.
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Nota: Rotas adicionadas diretamente ao WebApplication são executadas no final do pipeline.
Roteamento no ProductsController migrado
O ProductsController migrado contém os seguintes atributos realçados:
using Microsoft.AspNetCore.Mvc;
using ProductsCore.Models;
namespace ProductsCore.Controllers;
[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
Product[] products = new Product[]
{
new Product
{
Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1
},
new Product
{
Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M
},
new Product
{
Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M
}
};
[HttpGet]
public IEnumerable<Product> GetAllProducts()
{
return products;
}
[HttpGet("{id}")]
public ActionResult<Product> GetProduct(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return product;
}
}
O atributo
[Route]configura o padrão de roteamento de atributos do controlador.O atributo
[ApiController]torna o roteamento de atributos um requisito para todas as ações neste controlador.Roteamento de atributos suporta tokens, como
[controller]e[action]. No tempo de execução, cada token é substituído pelo nome do controlador ou ação, respectivamente, ao qual o atributo foi aplicado. Os tokens:- Reduz ou elimina a necessidade de usar cadeias de caracteres codificadas para a rota.
- Certifique-se de que, ao aplicar refatorações automáticas de renomeação, as rotas permaneçam sincronizadas com os controladores e ações correspondentes.
As solicitações HTTP Get são habilitadas para ações
ProductControllercom os seguintes atributos:-
[HttpGet]atributo aplicado à açãoGetAllProducts. -
[HttpGet("{id}")]atributo aplicado à açãoGetProduct.
-
Execute o projeto migrado e navegue até /api/products. Por exemplo: https://localhost:<port>/api/products. É apresentada uma lista completa de três produtos. Navegue até /api/products/1. Aparece o primeiro produto.
Visualizar ou descarregar amostra de código (como descarregar)
Recursos adicionais
Este artigo demonstra as etapas necessárias para migrar da API Web ASP.NET 4.x para ASP.NET MVC principal.
Visualizar ou descarregar amostra de código (como descarregar)
Prerequisites
- Visual Studio 2019 16.4 ou posterior com a carga de trabalho de desenvolvimento Web e ASP.NET
- SDK do .NET Core 3.1
Revisão do projeto de API Web ASP.NET 4.x
Este artigo usa o projeto ProductsApp criado em Introdução ao ASP.NET Web API 2. Nesse projeto, um projeto básico de API Web ASP.NET 4.x é configurado da seguinte maneira.
Em Global.asax.cs, é feita uma chamada para WebApiConfig.Register:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Routing;
namespace ProductsApp
{
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
}
A classe WebApiConfig é encontrada na pasta App_Start e tem um método Register estático:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace ProductsApp
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
A classe anterior:
- Configura roteamento de atributos, embora ele não esteja sendo usado na verdade.
- Configura a tabela de roteamento.
O código de exemplo espera que as URLs correspondam ao formato
/api/{controller}/{id}, com{id}sendo opcional.
As seções a seguir demonstram a migração do projeto de API da Web para ASP.NET MVC principal.
Criar o projeto de destino
Crie uma nova solução em branco no Visual Studio e adicione o projeto de API Web ASP.NET 4.x para migrar:
- No menu Arquivo, selecione Novo>Projeto.
- Selecione o modelo Solução em Branco e selecione Avançar.
- Dê um nome à solução WebAPIMigration. Selecione Criar.
- Adicione o projeto ProductsApp existente à solução.
Adicione um novo projeto de API para migrar para:
- Adicione um novo projeto ASP.NET Core Web Application à solução.
- Na caixa de diálogo Configurar seu novo projeto, nomeie o projeto ProductsCoree selecione Criar.
- Na caixa de diálogo Criar um novo aplicativo Web ASP.NET Core, certifique-se de que .NET Core e ASP.NET Core 3.1 estejam selecionados. Selecione o modelo de projeto de API e selecione Criar.
- Remova os ficheiros de exemplo
WeatherForecast.cseControllers/WeatherForecastController.csdo novo projeto ProductsCore.
A solução agora contém dois projetos. As seções a seguir explicam a migração do conteúdo do projeto ProductsApp para o projeto ProductsCore.
Migrar configuração
ASP.NET Core não usa a pasta App_Start ou o arquivo Global.asax. Além disso, o arquivo web.config é adicionado no momento da publicação.
A classe Startup:
- Substitui Global.asax.
- Lida com todas as tarefas de inicialização do aplicativo.
Para obter mais informações, consulte arranque da aplicação no ASP.NET Core.
Migrar modelos e controladores
O código a seguir mostra o ProductsController a ser atualizado para ASP.NET Core:
using ProductsApp.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;
namespace ProductsApp.Controllers
{
public class ProductsController : ApiController
{
Product[] products = new Product[]
{
new Product
{
Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1
},
new Product
{
Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M
},
new Product
{
Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M
}
};
public IEnumerable<Product> GetAllProducts()
{
return products;
}
public IHttpActionResult GetProduct(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}
}
}
Atualize o ProductsController para ASP.NET Core:
- Copie
Controllers/ProductsController.cse a pasta Modelos do projeto original para o novo. - Altere o namespace raiz dos arquivos copiados para
ProductsCore. - Atualize a instrução
using ProductsApp.Models;parausing ProductsCore.Models;.
Os seguintes componentes não existem no ASP.NET Core:
-
ApiControllerclasse -
System.Web.Httpespaço de nomes -
IHttpActionResultInterface
Faça as seguintes alterações:
Altere
ApiControllerpara ControllerBase. Adicioneusing Microsoft.AspNetCore.Mvc;para resolver a referênciaControllerBase.Excluir
using System.Web.Http;.Altere o tipo de retorno da ação
GetProductdeIHttpActionResultparaActionResult<Product>.Simplifique a declaração
GetProductda açãoreturnpara o seguinte:return product;
Configurar roteamento
O modelo de projeto ASP.NET Core API inclui a configuração de roteamento de endpoints no código gerado.
As seguintes chamadas UseRouting e UseEndpoints:
- Registe a correspondência de rotas e a execução de pontos finais no pipeline de middleware .
- Substitua o ficheiro do projecto
App_Start/WebApiConfig.cs.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Configure o roteamento da seguinte maneira:
Marque a classe
ProductsControllercom os seguintes atributos:[Route("api/[controller]")] [ApiController]O atributo
[Route]anterior configura o padrão de roteamento de atributos do controlador. O atributo[ApiController]torna o roteamento de atributos um requisito para todas as ações neste controlador.O roteamento de atributos suporta tokens, como
[controller]e[action]. No tempo de execução, cada token é substituído pelo nome do controlador ou ação, respectivamente, ao qual o atributo foi aplicado. Os tokens:- Reduza o número de cadeias mágicas no projeto.
- Certifique-se de que, ao aplicar refatorações automáticas de renomeação, as rotas permaneçam sincronizadas com os controladores e ações correspondentes.
Habilite solicitações HTTP Get para ações
ProductsController- Aplique o atributo
[HttpGet]à açãoGetAllProducts. - Aplique o atributo
[HttpGet("{id}")]à açãoGetProduct.
- Aplique o atributo
Execute o projeto migrado e navegue até /api/products. É apresentada uma lista completa de três produtos. Navegue até /api/products/1. Aparece o primeiro produto.