Eseguire la migrazione da API Web ASP.NET a ASP.NET Core
ASP.NET Core combina i modelli di app MVC e Web di ASP.NET 4.x in un singolo modello di programmazione noto come ASP.NET Core MVC.
Questo articolo illustra come eseguire la migrazione del controller Products creato in Introduzione a API Web ASP.NET 2 a ASP.NET Core.
Prerequisiti
- Visual Studio 2022 con il carico di lavoro Sviluppo ASP.NET e Web.
- .NET 6.0 SDK
Creare il nuovo progetto API Web core ASP.NET
- Scegliere Nuovo>Progetto dal menu File.
- Immettere l'API Web nella casella di ricerca.
- Selezionare il modello api Web core ASP.NET e selezionare Avanti.
- Nella finestra di dialogo Configura il nuovo progetto assegnare al progetto il nome ProductsCore e selezionare Avanti.
- Nella finestra di dialogo Informazioni aggiuntive:
- Verificare che Framework sia .NET 6.0 (supporto a lungo termine).
- Verificare che la casella di controllo Usa controller (deselezionare per usare le API minime) sia selezionata.
- Deselezionare Abilita supporto OpenAPI.
- Seleziona Crea.
Rimuovere i file del modello WeatherForecast
- Rimuovere i
WeatherForecast.cs
file di esempio eControllers/WeatherForecastController.cs
dal nuovo progetto ProductsCore . - Aprire Properties\launchSettings.json.
- Modificare
launchUrl
le proprietà daweatherforcast
aproductscore
.
Configurazione per l'API Web core di ASP.NET
ASP.NET Core non usa la cartella App_Start o il file Global.asax . Il file web.config viene aggiunto in fase di pubblicazione. Per altre informazioni, vedere il file web.config.
Ecco il file Program.cs
:
- Sostituisce Global.asax.
- Gestisce tutte le attività di avvio dell'app.
Per altre informazioni, vedere Avvio delle app in ASP.NET Core.
Di seguito viene illustrato il codice di avvio dell'applicazione nel file 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();
Copiare il modello Product
- In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto. Selezionare Aggiungi>Nuova cartella. Assegnare il nome Modelli alla cartella.
- Fare clic con il pulsante destro del mouse sulla cartella Modelli . Selezionare Aggiungi>Classe. Assegnare alla classe il nome Product e selezionare Aggiungi.
- Sostituire il codice del modello di modello con il codice seguente:
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; }
}
}
Il codice evidenziato precedente modifica quanto segue:
- L'annotazione
?
è stata aggiunta per dichiarare leName
proprietà eCategory
come tipi riferimento nullable.
Usando la funzionalità Nullable introdotta in C# 8, ASP.NET Core può fornire ulteriore analisi del flusso di codice e sicurezza in fase di compilazione nella gestione dei tipi di riferimento. Ad esempio, la protezione da null
eccezioni di riferimento.
In questo caso, la finalità è che Name
e Category
può essere tipi nullable.
ASP.NET progetti Core 6.0 abilitano i tipi riferimento nullable per impostazione predefinita. Per altre informazioni, vedere Tipi di riferimento Nullable.
Copiare ProductsController
- Fare clic con il pulsante destro del mouse sulla cartella Controllers.
- Selezionare Aggiungi > controller....
- Nella finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Controller Mvc - Vuoto e quindi selezionare Aggiungi.
- Assegnare al controller il nome ProductsController e selezionare Aggiungi.
- Sostituire il codice del controller modello con quanto segue:
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;
}
}
Il codice evidenziato precedente modifica quanto segue per eseguire la migrazione a ASP.NET Core:
Rimuove le istruzioni using per i componenti seguenti ASP.NET 4.x che non esistono in ASP.NET Core:
- Classe
ApiController
- Spazio dei nomi
System.Web.Http
IHttpActionResult
Interfaccia
- Classe
Modifica l'istruzione
using ProductsApp.Models;
inusing ProductsCore.Models;
.Imposta lo spazio dei nomi radice su
ProductsCore
.Cambia
ApiController
in ControllerBase.Aggiunge
using Microsoft.AspNetCore.Mvc;
per risolvere ilControllerBase
riferimento.Modifica il
GetProduct
tipo restituito dell'azione daIHttpActionResult
aActionResult<Product>
. Per altre info, vedi Tipi restituiti di azioni del controller.Semplifica l'istruzione
GetProduct
dell'azionereturn
con l'istruzione seguente:return product;
Aggiunge gli attributi seguenti illustrati nelle sezioni successive:
[Route("api/[controller]")]
[ApiController]
[HttpGet]
[HttpGet("{id}")]
Definizione dei percorsi di trasferimento
ASP.NET Core fornisce un modello di hosting minimo in cui il middleware di routing degli endpoint esegue il wrapping dell'intera pipeline middleware, pertanto le route possono essere aggiunte direttamente a WebApplication senza una chiamata esplicita a UseEndpoints o UseRouting per registrare le route.
UseRouting
può comunque essere usato per specificare dove avviene la corrispondenza delle route, ma UseRouting
non deve essere chiamato in modo esplicito se le route devono essere abbinate all'inizio della pipeline 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: le route aggiunte direttamente all'esecuzione WebApplication alla fine della pipeline.
Routing nell'oggetto migrato ProductsController
La migrazione ProductsController
contiene gli attributi evidenziati seguenti:
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;
}
}
L'attributo
[Route]
configura il modello di routing degli attributi del controller.L'attributo
[ApiController]
rende il routing degli attributi un requisito per tutte le azioni in questo controller.Il routing degli attributi supporta i token, ad esempio
[controller]
e[action]
. In fase di esecuzione, ogni token viene sostituito rispettivamente con il nome del controller o dell'azione a cui è stato applicato l'attributo. I token:- Riduce o elimina la necessità di usare stringhe hardcoded per la route.
- Assicurarsi che le route rimangano sincronizzate con i controller e le azioni corrispondenti quando vengono applicati i refactoring di ridenominazione automatica.
Le richieste HTTP Get sono abilitate per
ProductController
le azioni con gli attributi seguenti:[HttpGet]
attributo applicato all'azioneGetAllProducts
.[HttpGet("{id}")]
attributo applicato all'azioneGetProduct
.
Eseguire il progetto migrato e passare a /api/products
. Ad esempio: https://localhost:<port>
/api/products. Viene visualizzato un elenco completo di tre prodotti. Passa a /api/products/1
. Viene visualizzato il primo prodotto.
Visualizzare o scaricare il codice di esempio (procedura per il download)
Risorse aggiuntive
Questo articolo illustra i passaggi necessari per eseguire la migrazione da ASP.NET API Web 4.x a ASP.NET Core MVC.
Visualizzare o scaricare il codice di esempio (procedura per il download)
Prerequisiti
- Visual Studio 2019 16.4 o versione successiva con il carico di lavoro Sviluppo ASP.NET e Web
- .NET Core 3.1 SDK
Esaminare ASP.NET progetto API Web 4.x
Questo articolo usa il progetto ProductsApp creato in Introduzione a API Web ASP.NET 2. In tale progetto viene configurato un progetto API Web di base ASP.NET 4.x come indicato di seguito.
In Global.asax.cs
viene eseguita una chiamata a 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);
}
}
}
La WebApiConfig
classe si trova nella cartella App_Start e ha un metodo statico Register
:
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 }
);
}
}
}
La classe precedente:
- Configura il routing degli attributi, anche se non viene effettivamente usato.
- Configura la tabella di routing.
Il codice di esempio prevede che gli URL corrispondano al formato
/api/{controller}/{id}
, con{id}
l'essere facoltativo.
Le sezioni seguenti illustrano la migrazione del progetto API Web a ASP.NET Core MVC.
Creare il progetto di destinazione
Creare una nuova soluzione vuota in Visual Studio e aggiungere il progetto API Web ASP.NET 4.x per eseguire la migrazione:
- Scegliere Nuovo>Progetto dal menu File.
- Selezionare il modello Soluzione vuota e selezionare Avanti.
- Assegnare alla soluzione il nome WebAPIMigration. Seleziona Crea.
- Aggiungere il progetto ProductsApp esistente alla soluzione.
Aggiungere un nuovo progetto API per eseguire la migrazione a:
- Aggiungere alla soluzione un nuovo progetto di ASP.NET Core Web Application .
- Nella finestra di dialogo Configura il nuovo progetto assegnare al progetto il nome ProductsCore e selezionare Crea.
- Nella finestra di dialogo Crea una nuova applicazione Web di ASP.NET Core verificare che siano selezionati .NET Core e ASP.NET Core 3.1. Selezionare il modello di progetto API e scegliere Crea.
- Rimuovere i
WeatherForecast.cs
file di esempio eControllers/WeatherForecastController.cs
dal nuovo progetto ProductsCore .
La soluzione contiene ora due progetti. Le sezioni seguenti illustrano la migrazione del contenuto del progetto ProductsApp al progetto ProductsCore .
Eseguire la migrazione della configurazione
ASP.NET Core non usa la cartella App_Start o il file Global.asax . Inoltre, il file web.config viene aggiunto in fase di pubblicazione.
La classe Startup
:
- Sostituisce Global.asax.
- Gestisce tutte le attività di avvio dell'app.
Per altre informazioni, vedere Avvio delle app in ASP.NET Core.
Eseguire la migrazione di modelli e controller
Il codice seguente mostra l'elemento ProductsController
da aggiornare per 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);
}
}
}
Aggiornare per ProductsController
ASP.NET Core:
- Copiare
Controllers/ProductsController.cs
e la cartella Models dal progetto originale a quella nuova. - Modificare lo spazio dei nomi radice dei file copiato in
ProductsCore
. - Aggiornare l'istruzione
using ProductsApp.Models;
ausing ProductsCore.Models;
.
I componenti seguenti non esistono in ASP.NET Core:
- Classe
ApiController
- Spazio dei nomi
System.Web.Http
IHttpActionResult
Interfaccia
Apportare le modifiche seguenti:
Cambia
ApiController
in ControllerBase. Aggiungereusing Microsoft.AspNetCore.Mvc;
per risolvere ilControllerBase
riferimento.Eliminare
using System.Web.Http;
.Modificare il
GetProduct
tipo restituito dell'azione daIHttpActionResult
aActionResult<Product>
.Semplificare l'istruzione
GetProduct
dell'azionereturn
come segue:return product;
Configurare il routing
Il modello di progetto API core ASP.NET include la configurazione del routing degli endpoint nel codice generato.
Di seguito sono riportate le chiamate e UseEndpoints :UseRouting
- Registrare la corrispondenza della route e l'esecuzione dell'endpoint nella pipeline middleware .
- Sostituire il file del
App_Start/WebApiConfig.cs
progetto ProductsApp.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Configurare il routing come segue:
Contrassegnare la
ProductsController
classe con gli attributi seguenti:[Route("api/[controller]")] [ApiController]
L'attributo precedente
[Route]
configura il modello di routing degli attributi del controller. L'attributo[ApiController]
rende il routing degli attributi un requisito per tutte le azioni in questo controller.Il routing degli attributi supporta i token, ad esempio
[controller]
e[action]
. In fase di esecuzione, ogni token viene sostituito rispettivamente con il nome del controller o dell'azione a cui è stato applicato l'attributo. I token:- Ridurre il numero di stringhe magiche nel progetto.
- Assicurarsi che le route rimangano sincronizzate con i controller e le azioni corrispondenti quando vengono applicati i refactoring di ridenominazione automatica.
Abilitare le richieste HTTP Get per le
ProductsController
azioni:- Applicare l'attributo
[HttpGet]
all'azioneGetAllProducts
. - Applicare l'attributo
[HttpGet("{id}")]
all'azioneGetProduct
.
- Applicare l'attributo
Eseguire il progetto migrato e passare a /api/products
. Viene visualizzato un elenco completo di tre prodotti. Passa a /api/products/1
. Viene visualizzato il primo prodotto.