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

Creare il nuovo progetto API Web core ASP.NET

  1. Scegliere Nuovo>Progetto dal menu File.
  2. Immettere l'API Web nella casella di ricerca.
  3. Selezionare il modello api Web core ASP.NET e selezionare Avanti.
  4. Nella finestra di dialogo Configura il nuovo progetto assegnare al progetto il nome ProductsCore e selezionare Avanti.
  5. Nella finestra di dialogo Informazioni aggiuntive:
    1. Verificare che Framework sia .NET 6.0 (supporto a lungo termine).
    2. Verificare che la casella di controllo Usa controller (deselezionare per usare le API minime) sia selezionata.
    3. Deselezionare Abilita supporto OpenAPI.
    4. Seleziona Crea.

Rimuovere i file del modello WeatherForecast

  1. Rimuovere i WeatherForecast.cs file di esempio e Controllers/WeatherForecastController.cs dal nuovo progetto ProductsCore .
  2. Aprire Properties\launchSettings.json.
  3. Modificare launchUrl le proprietà da weatherforcast a productscore.

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

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto. Selezionare Aggiungi>Nuova cartella. Assegnare il nome Modelli alla cartella.
  2. Fare clic con il pulsante destro del mouse sulla cartella Modelli . Selezionare Aggiungi>Classe. Assegnare alla classe il nome Product e selezionare Aggiungi.
  3. 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 le Name proprietà e Category 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

  1. Fare clic con il pulsante destro del mouse sulla cartella Controllers.
  2. Selezionare Aggiungi > controller....
  3. Nella finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Controller Mvc - Vuoto e quindi selezionare Aggiungi.
  4. Assegnare al controller il nome ProductsController e selezionare Aggiungi.
  5. 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
  • Modifica l'istruzione using ProductsApp.Models; in using ProductsCore.Models;.

  • Imposta lo spazio dei nomi radice su ProductsCore.

  • Cambia ApiController in ControllerBase.

  • Aggiunge using Microsoft.AspNetCore.Mvc; per risolvere il ControllerBase riferimento.

  • Modifica il GetProduct tipo restituito dell'azione da IHttpActionResult a ActionResult<Product>. Per altre info, vedi Tipi restituiti di azioni del controller.

  • Semplifica l'istruzione GetProduct dell'azione return 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'azione GetAllProducts .
    • [HttpGet("{id}")] attributo applicato all'azione GetProduct .

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

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.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 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:

  1. Scegliere Nuovo>Progetto dal menu File.
  2. Selezionare il modello Soluzione vuota e selezionare Avanti.
  3. Assegnare alla soluzione il nome WebAPIMigration. Seleziona Crea.
  4. Aggiungere il progetto ProductsApp esistente alla soluzione.

Aggiungere un nuovo progetto API per eseguire la migrazione a:

  1. Aggiungere alla soluzione un nuovo progetto di ASP.NET Core Web Application .
  2. Nella finestra di dialogo Configura il nuovo progetto assegnare al progetto il nome ProductsCore e selezionare Crea.
  3. 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.
  4. Rimuovere i WeatherForecast.cs file di esempio e Controllers/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:

  1. Copiare Controllers/ProductsController.cs e la cartella Models dal progetto originale a quella nuova.
  2. Modificare lo spazio dei nomi radice dei file copiato in ProductsCore.
  3. Aggiornare l'istruzione using ProductsApp.Models; a using 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:

  1. Cambia ApiController in ControllerBase. Aggiungere using Microsoft.AspNetCore.Mvc; per risolvere il ControllerBase riferimento.

  2. Eliminare using System.Web.Http;.

  3. Modificare il GetProduct tipo restituito dell'azione da IHttpActionResult a ActionResult<Product>.

  4. Semplificare l'istruzione GetProduct dell'azione return 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:

  1. 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.
  2. Abilitare le richieste HTTP Get per le ProductsController azioni:

    • Applicare l'attributo [HttpGet] all'azione GetAllProducts .
    • Applicare l'attributo [HttpGet("{id}")] all'azione GetProduct .

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.

Risorse aggiuntive