Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
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 all'API Web ASP.NET 2 a ASP.NET Core.
Prerequisites
- Visual Studio 2022 con il carico di lavoro Sviluppo ASP.NET e Web.
- .NET 6 SDK
Creare il nuovo progetto API Web core ASP.NET
- Dal menu File, scegliere Nuovo>Progetto.
- Immettere Web API nella casella di ricerca.
- Selezionare il modello API Web ASP.NET Core 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 :
- Confermare che il Framework è .NET 6.0 (supporto a lungo termine).
- Verificare che sia selezionata la casella di controllo Usa controller (deselezionare l'uso delle API minime).
- Deseleziona Abilita supporto OpenAPI.
- Fare clic su Crea.
Rimuovere il file modello Meteo
- Rimuovere i file di esempio
WeatherForecast.cseControllers/WeatherForecastController.csdal nuovo progetto ProductsCore. - Aprire Proprietà\launchSettings.jsattiva.
- Modificare le proprietà di
launchUrldaweatherforcastaproductscore.
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 web.config file.
File Program.cs:
- Sostituisce Global.asax.
- Gestisce tutte le attività di avvio dell'app.
Per altre informazioni, vedere Avvio dell'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 prodotto
- In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto. Selezionare Aggiungi>Nuova cartella. Denominare la cartella Models.
- Fare clic con il pulsante destro del mouse sulla cartella Modelli. Selezionare Aggiungi classe>. Denominare la classe Product e selezionare Aggiungi.
- Sostituire il codice del modello di template 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 le proprietàNameeCategorycome tipi riferimento nullable.
Usando la funzionalità Nullable introdotta in C# 8, ASP.NET Core può fornire un'ulteriore analisi del flusso di codice e la sicurezza in fase di compilazione nella gestione dei tipi di riferimento. Ad esempio, proteggere da eccezioni di riferimento null.
In questo caso, l'intento è che Name e Category possano essere tipi nullable.
ASP.NET Core nei progetti .NET 6 abilita i tipi di riferimento annullabili di default. Per ulteriori informazioni, vedere tipi di riferimento annullabile.
Copiare il ProductsController
- Fare clic con il pulsante destro del mouse sulla cartella Controller.
- Seleziona Aggiungi > Controller....
- In finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare controller Mvc - Vuoto quindi selezionare Aggiungi.
- Denominare il controller 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 di ASP.NET 4.x seguenti che non esistono in ASP.NET Core.
- Classe
ApiController - spazio dei nomi
System.Web.Http - interfaccia
IHttpActionResult
- Classe
Modifica l'istruzione
using ProductsApp.Models;inusing ProductsCore.Models;.Imposta lo spazio dei nomi radice su
ProductsCore.Modifica
ApiControllerin ControllerBase.Aggiunge
using Microsoft.AspNetCore.Mvc;per risolvere il riferimentoControllerBase.Modifica il tipo restituito dell'azione di
GetProductdaIHttpActionResultaActionResult<Product>. Per altre informazioni, vedere Controller action return types.Semplifica l'istruzione
GetProductdell'azionereturncon l'istruzione seguente:return product;Aggiunge gli attributi seguenti illustrati nelle sezioni successive:
[Route("api/[controller]")][ApiController][HttpGet][HttpGet("{id}")]
Routing
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 è possibile aggiungere route direttamente all'WebApplication senza una chiamata esplicita a UseEndpoints o UseRouting per registrare le route.
UseRouting può comunque essere usato per specificare dove si verifica la corrispondenza delle route, ma UseRouting non deve essere chiamato in modo esplicito se le route devono essere confrontate 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: Route aggiunte direttamente al WebApplication eseguito alla fine della pipeline.
Routing nel ProductsController migrato
Il ProductsController migrato 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.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 o eliminare la necessità di usare stringhe codificate manualmente per il percorso.
- Assicurarsi che le route rimangano sincronizzate con i controller e le azioni corrispondenti quando vengono applicate ridenominazioni automatiche.
Le richieste HTTP Get sono abilitate per le azioni
ProductControllercon gli attributi seguenti:- Attributo
[HttpGet]applicato all'azioneGetAllProducts. - Attributo
[HttpGet("{id}")]applicato all'azioneGetProduct.
- Attributo
Eseguire il progetto migrato e passare a /api/products. Ad esempio: https://localhost:<port>/api/products. Viene visualizzato un elenco completo di tre prodotti. Naviga verso /api/products/1. Viene visualizzato il primo prodotto.
Visualizzare o scaricare il codice di esempio (come scaricare)
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 (come scaricare)
Prerequisites
- Visual Studio 2019 16.4 o versione successiva con il carico di lavoro di sviluppo ASP.NET e Web
- .NET Core 3.1 SDK
Esaminare il progetto API Web ASP.NET 4.x
Questo articolo utilizza il progetto ProductsApp creato in Introduzione all'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.csviene 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 classe WebApiConfig si trova nella cartella App_Start e ha un metodo Register statico:
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 l'instradamento degli attributi , anche se non viene effettivamente utilizzato.
- Configura la tabella di routing.
Il codice di esempio prevede che gli URL corrispondano al formato
/api/{controller}/{id}, con{id}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:
- Dal menu File, scegliere Nuovo>Progetto.
- Selezionare il modello soluzione vuota, quindi selezionare Avanti.
- Nomina la soluzione WebAPIMigration. Fare clic su Crea.
- Aggiungere il progetto esistente ProductsApp alla soluzione.
Aggiungere un nuovo progetto API per eseguire la migrazione a:
- Aggiungere un nuovo progetto di ASP.NET Core Web Application alla soluzione.
- Nella finestra di dialogo Configura nuovo progetto assegnare al progetto il nome ProductsCoree selezionare Crea.
- Nella finestra di dialogo Crea una nuova applicazione Web 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 file di esempio
WeatherForecast.cseControllers/WeatherForecastController.csdal 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.
Classe Startup:
- Sostituisce Global.asax.
- Gestisce tutte le attività di avvio dell'app.
Per altre informazioni, vedere Avvio dell'app in ASP.NET Core.
Eseguire la migrazione di modelli e controller
Il codice seguente illustra il 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 il ProductsController per ASP.NET Core:
- Copiare
Controllers/ProductsController.cse la cartella modelli di dal progetto originale a quella nuova. - Modificare lo spazio dei nomi radice dei file copiati in
ProductsCore. - Aggiornare l'istruzione
using ProductsApp.Models;inusing ProductsCore.Models;.
I componenti seguenti non esistono in ASP.NET Core:
- Classe
ApiController - spazio dei nomi
System.Web.Http - interfaccia
IHttpActionResult
Apportare le modifiche seguenti:
Cambia
ApiControllerin ControllerBase. Aggiungereusing Microsoft.AspNetCore.Mvc;per risolvere il riferimentoControllerBase.Eliminare
using System.Web.Http;.Modificare il tipo restituito dell'azione
GetProductdaIHttpActionResultaActionResult<Product>.Semplificare l'istruzione
GetProductdell'azionereturnnel modo seguente:return product;
Configurare il routing
Il modello di progetto ASP.NET API core include la configurazione del routing degli endpoint nel codice generato.
Le chiamate UseRouting e UseEndpoints seguenti:
- Registrare la corrispondenza delle route e l'esecuzione degli endpoint nel middleware della pipeline.
- Sostituire il file del progetto ProductsApp
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();
});
}
Configurare il routing come segue:
Contrassegnare la classe
ProductsControllercon gli attributi seguenti:[Route("api/[controller]")] [ApiController]L'attributo
[Route]precedente 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 applicate ridenominazioni automatiche.
Abilitare le richieste HTTP Get verso le azioni
ProductsController:- 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. Naviga verso /api/products/1. Viene visualizzato il primo prodotto.