Migrace z webového rozhraní API ASP.NET na ASP.NET Core

ASP.NET Core kombinuje modely MVC a webového rozhraní API ASP.NET 4.x do jednoho programovacího modelu označovaného jako ASP.NET Core MVC.

Tento článek ukazuje, jak migrovat kontroler Products vytvořený v části Začínáme s webovým rozhraním API 2 ASP.NET do ASP.NET Core.

Předpoklady

Vytvoření nového projektu webového rozhraní API ASP.NET Core

  1. V nabídce Soubor vyberte Nový>projekt.
  2. Do vyhledávacího pole zadejte webové rozhraní API .
  3. Vyberte šablonu ASP.NET Základní webové rozhraní API a vyberte Další.
  4. V dialogovém okně Konfigurovat nový projekt pojmenujte projekt ProductsCore a vyberte Další.
  5. V dialogovém okně Další informace :
    1. Ověřte, že rozhraní je .NET 6.0 (dlouhodobá podpora).
    2. Ověřte, že je zaškrtnuté políčko Použít kontrolery (zrušení zaškrtnutí pro použití minimálních rozhraní API).
    3. Zrušte zaškrtnutí políčka Povolit podporu OpenAPI.
    4. Vyberte Vytvořit.

Odebrání souborů šablony WeatherForecast

  1. WeatherForecast.cs Odeberte z nového projektu ProductsCore soubory a Controllers/WeatherForecastController.cs ukázkové soubory.
  2. Otevřete vlastnosti\launch Nastavení.json.
  3. Změňte launchUrl vlastnosti z weatherforcast na productscore.

Konfigurace pro webové rozhraní API ASP.NET Core

ASP.NET Core nepoužívá složku App_Start ani soubor Global.asax . Soubor web.config se přidá při publikování. Další informace naleznete v souboru web.config.

Soubor Program.cs:

  • Nahradí Global.asax.
  • Zpracovává všechny úlohy po spuštění aplikace.

Další informace najdete v tématu Spuštění aplikace v ASP.NET Core.

Následuje příklad spouštěcího kódu aplikace v souboru 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();

Zkopírování modelu produktu

  1. V Průzkumník řešení klikněte pravým tlačítkem myši na projekt. Vyberte Přidat>novou složku. Pojmenujte složku Models.
  2. Klikněte pravým tlačítkem myši na složku Modely . Vyberte Přidat>třídu. Pojmenujte produkt třídy a vyberte Přidat.
  3. Nahraďte kód modelu šablony následujícím kódem:
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; }
    }
}

Předchozí zvýrazněný kód změní následující:

  • Poznámka ? byla přidána pro deklaraci a Category vlastnosti jako odkazové typy s možnou Name hodnotou null.

Díky použití funkce s možnou hodnotou Null zavedenou v jazyce C# 8 může ASP.NET Core poskytovat další analýzu toku kódu a bezpečnost kompilace při zpracování referenčních typů. Například ochrana před null výjimkami odkazu.

V tomto případě je záměrem, že jde Category o typy s možnou Name hodnotou null.

ASP.NET projekty Core 6.0 ve výchozím nastavení umožňují odkazové typy s možnou hodnotou null. Další informace naleznete v tématu Odkazové typy s možnou hodnotou Null.

Zkopírování controlleru ProductsController

  1. Klikněte pravým tlačítkem myši na složku Kontrolery .
  2. Vyberte Přidat > kontroler....
  3. V dialogovém okně Přidat novou vygenerovanou položku vyberte kontroler Mvc – prázdný a pak vyberte Přidat.
  4. Pojmenujte kontroler ProductsController a vyberte Přidat.
  5. Kód kontroleru šablony nahraďte následujícím kódem:
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;
    }
}

Předchozí zvýrazněný kód změní následující změny, aby se migrovali na ASP.NET Core:

  • Odebere příkazy using pro následující komponenty ASP.NET 4.x, které v ASP.NET Core neexistují:

    • Třída ApiController
    • System.Web.Http Obor názvů
    • IHttpActionResult Rozhraní
  • Změní příkaz using ProductsApp.Models; na using ProductsCore.Models;.

  • Nastaví kořenový obor názvů na ProductsCore.

  • Změny ApiController v souboru ControllerBase.

  • Přidá using Microsoft.AspNetCore.Mvc; k vyřešení ControllerBase odkazu.

  • Změní návratový GetProduct typ akce z IHttpActionResult na ActionResult<Product>. Další informace najdete v tématu Návratové typy akcí kontroleru.

  • GetProduct Zjednodušuje příkaz akce return na následující příkaz:

    return product;
    
  • Přidá následující atributy, které jsou vysvětleny v dalších částech:

    • [Route("api/[controller]")]
    • [ApiController]
    • [HttpGet]
    • [HttpGet("{id}")]

Směrování

ASP.NET Core poskytuje minimální model hostování, ve kterém middleware směrování koncového bodu zabalí celý kanál middlewaru, a proto je možné trasy přidat přímo do WebApplication bez explicitního volání UseEndpoints nebo UseRouting registrace tras.

UseRouting se dá i nadále použít k určení, kde se provádí porovnávání tras, ale UseRouting není nutné je explicitně volat, pokud by se trasy měly shodovat na začátku kanálu middlewaru.

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();

Poznámka: Trasy přidané přímo ke WebApplication spuštění na konci kanálu.

Směrování v migrovaném ProductsController

Migrovaný ProductsController soubor obsahuje následující zvýrazněné atributy:

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;
    }
}
  • Atribut [Route] konfiguruje model směrování atributů kontroleru.

  • Atribut [ApiController] zajišťuje směrování atributů jako požadavek na všechny akce v tomto kontroleru.

  • Směrování atributů podporuje tokeny, například [controller] a [action]. Za běhu se každý token nahradí názvem kontroleru nebo akce, na který byl atribut použit. Tokeny:

    • Snižuje nebo eliminuje potřebu používat pevně zakódované řetězce pro trasu.
    • Zajistěte, aby trasy zůstaly synchronizované s odpovídajícími řadiči a akcemi při použití automatického refaktoringu přejmenování.
  • Požadavky HTTP Get jsou povolené pro ProductController akce s následujícími atributy:

    • [HttpGet] atribut použitý na GetAllProducts akci.
    • [HttpGet("{id}")] atribut použitý na GetProduct akci.

Spusťte migrovaný projekt a přejděte na /api/products. Příklad: https://localhost:<port>/api/products. Zobrazí se úplný seznam tří produktů. Přejděte na /api/products/1. Zobrazí se první produkt.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Další materiály

Tento článek ukazuje kroky potřebné k migraci z webového rozhraní API ASP.NET 4.x na ASP.NET Core MVC.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Předpoklady

Kontrola projektu webového rozhraní API ASP.NET 4.x

Tento článek používá projekt ProductsApp vytvořený v části Začínáme s ASP.NET webového rozhraní API 2. V projektu je základní ASP.NET projekt webového rozhraní API 4.x nakonfigurovaný následujícím způsobem.

V Global.asax.cs, volání na 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);
        }
    }
}

Třída WebApiConfig se nachází ve složce App_Start a má statickou Register metodu:

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 }
            );
        }
    }
}

Předchozí třída:

  • Nakonfiguruje směrování atributů, i když se ve skutečnosti nepoužívá.
  • Nakonfiguruje směrovací tabulku. Vzorový kód očekává, že adresy URL budou odpovídat formátu /api/{controller}/{id}a {id} budou volitelné.

Následující části ukazují migraci projektu webového rozhraní API na ASP.NET Core MVC.

Vytvoření cílového projektu

Vytvořte nové prázdné řešení v sadě Visual Studio a přidejte projekt webového rozhraní API ASP.NET 4.x, který chcete migrovat:

  1. V nabídce Soubor vyberte Nový>projekt.
  2. Vyberte prázdnou šablonu řešení a vyberte Další.
  3. Pojmenujte řešení WebAPIMigration. Vyberte Vytvořit.
  4. Přidejte do řešení existující projekt ProductsApp .

Přidejte nový projekt rozhraní API pro migraci na:

  1. Do řešení přidejte nový projekt webové aplikace ASP.NET Core.
  2. V dialogovém okně Konfigurovat nový projekt pojmenujte projekt ProductsCore a vyberte Vytvořit.
  3. V dialogovém okně Vytvořit novou webovou aplikaci ASP.NET Core potvrďte, že jsou vybrané .NET Core a ASP.NET Core 3.1 . Vyberte šablonu projektu rozhraní API a vyberte Vytvořit.
  4. WeatherForecast.cs Odeberte z nového projektu ProductsCore soubory a Controllers/WeatherForecastController.cs ukázkové soubory.

Řešení teď obsahuje dva projekty. Následující části popisují migraci obsahu projektu ProductsApp do projektu ProductsCore .

Migrace konfigurace

ASP.NET Core nepoužívá složku App_Start ani soubor Global.asax . Kromě toho se soubor web.config přidá při publikování.

Třída Startup:

  • Nahradí Global.asax.
  • Zpracovává všechny úlohy po spuštění aplikace.

Další informace najdete v tématu Spuštění aplikace v ASP.NET Core.

Migrace modelů a kontrolerů

Následující kód ukazuje ProductsController aktualizaci pro 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);
        }
    }
}

ProductsController Aktualizujte ASP.NET Core:

  1. Zkopírujte Controllers/ProductsController.cs složku Models z původního projektu do nové.
  2. Změňte kořenový obor názvů zkopírovaných souborů na ProductsCore.
  3. Aktualizujte using ProductsApp.Models; příkaz na using ProductsCore.Models;.

V ASP.NET Core neexistují následující komponenty:

  • Třída ApiController
  • System.Web.Http Obor názvů
  • IHttpActionResult Rozhraní

Proveďte následující změny:

  1. Změňte ApiController na ControllerBase. Přidejte using Microsoft.AspNetCore.Mvc; k vyřešení ControllerBase odkazu.

  2. Odstraňte using System.Web.Http;.

  3. Změňte návratový GetProduct typ akce na IHttpActionResult ActionResult<Product>hodnotu .

  4. GetProduct Zjednodušte příkaz akce return následujícím postupem:

    return product;
    

Konfigurace směrování

Šablona projektu rozhraní ASP.NET Core API zahrnuje konfiguraci směrování koncového bodu ve vygenerovaném kódu.

Následující UseRouting volání a UseEndpoints volání:

  • Registrace porovnávání tras a spouštění koncových bodů v kanálu middlewaru
  • Nahraďte soubor projektu App_Start/WebApiConfig.cs ProductsApp.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Nakonfigurujte směrování následujícím způsobem:

  1. Označte ProductsController třídu následujícími atributy:

    [Route("api/[controller]")]
    [ApiController]
    

    Předchozí [Route] atribut konfiguruje model směrování atributů kontroleru. Atribut [ApiController] zajišťuje směrování atributů jako požadavek na všechny akce v tomto kontroleru.

    Směrování atributů podporuje tokeny, například [controller] a [action]. Za běhu se každý token nahradí názvem kontroleru nebo akce, na který byl atribut použit. Tokeny:

    • Snižte počet magických řetězců v projektu.
    • Zajistěte, aby trasy zůstaly synchronizované s odpovídajícími řadiči a akcemi při použití automatického refaktoringu přejmenování.
  2. Povolte požadavky HTTP Get na ProductsController akce:

    • [HttpGet] Použijte atribut na GetAllProducts akci.
    • [HttpGet("{id}")] Použijte atribut na GetProduct akci.

Spusťte migrovaný projekt a přejděte na /api/products. Zobrazí se úplný seznam tří produktů. Přejděte na /api/products/1. Zobrazí se první produkt.

Další materiály