Condividi tramite


Eseguire la migrazione dall'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 all'API Web ASP.NET 2 a ASP.NET Core.

Prerequisites

Creare il nuovo progetto API Web core ASP.NET

  1. Dal menu File, scegliere Nuovo>Progetto.
  2. Immettere Web API nella casella di ricerca.
  3. Selezionare il modello API Web ASP.NET Core 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. Confermare che il Framework è .NET 6.0 (supporto a lungo termine).
    2. Verificare che sia selezionata la casella di controllo Usa controller (deselezionare l'uso delle API minime).
    3. Deseleziona Abilita supporto OpenAPI.
    4. Fare clic su Crea.

Rimuovere il file modello Meteo

  1. Rimuovere i file di esempio WeatherForecast.cs e Controllers/WeatherForecastController.cs dal nuovo progetto ProductsCore.
  2. Aprire Proprietà\launchSettings.jsattiva.
  3. Modificare le proprietà di launchUrl 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 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

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto. Selezionare Aggiungi>Nuova cartella. Denominare la cartella Models.
  2. Fare clic con il pulsante destro del mouse sulla cartella Modelli. Selezionare Aggiungi classe>. Denominare la classe Product e selezionare Aggiungi.
  3. 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à Name e Category come 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

  1. Fare clic con il pulsante destro del mouse sulla cartella Controller.
  2. Seleziona Aggiungi > Controller....
  3. In finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare controller Mvc - Vuoto quindi selezionare Aggiungi.
  4. Denominare il controller 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 di ASP.NET 4.x seguenti che non esistono in ASP.NET Core.

    • Classe ApiController
    • spazio dei nomi System.Web.Http
    • interfaccia IHttpActionResult
  • Modifica l'istruzione using ProductsApp.Models; in using ProductsCore.Models;.

  • Imposta lo spazio dei nomi radice su ProductsCore.

  • Modifica ApiController in ControllerBase.

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

  • Modifica il tipo restituito dell'azione di GetProduct da IHttpActionResult a ActionResult<Product>. Per altre informazioni, vedere Controller action return types.

  • 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}")]

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 ProductController con gli attributi seguenti:

    • Attributo [HttpGet] applicato all'azione GetAllProducts.
    • Attributo [HttpGet("{id}")] 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. 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

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:

  1. Dal menu File, scegliere Nuovo>Progetto.
  2. Selezionare il modello soluzione vuota, quindi selezionare Avanti.
  3. Nomina la soluzione WebAPIMigration. Fare clic su Crea.
  4. Aggiungere il progetto esistente ProductsApp alla soluzione.

Aggiungere un nuovo progetto API per eseguire la migrazione a:

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

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:

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

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

  2. Eliminare using System.Web.Http;.

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

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

  1. Contrassegnare la classe ProductsController con 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.
  2. Abilitare le richieste HTTP Get verso le azioni ProductsController:

    • 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. Naviga verso /api/products/1. Viene visualizzato il primo prodotto.

Risorse aggiuntive