Sdílet prostřednictvím


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 Začínáme s ASP.NET Web API 2 do ASP.NET Core.

Prerequisites

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ě Konfigurace nového projektu pojmenujte projekt ProductsCore a vyberte Další.
  5. V dialogovém okně Další informace :
    1. Ověřte, že Framework je .NET 6.0 (dlouhodobá podpora).
    2. Ověřte, že je zaškrtnuté políčko Použít kontrolery (zrušte zaškrtnutí políčka Používat minimální rozhraní API ).
    3. Zrušte zaškrtnutí u možnosti Povolit podporu OpenAPI.
    4. Vyberte Vytvořit.

Odstraňte soubory šablony WeatherForecast

  1. Odeberte WeatherForecast.cs a Controllers/WeatherForecastController.cs ukázkové soubory z nového projektu ProductsCore.
  2. Otevřete \launchSettings.jsVlastnosti.
  3. Změňte vlastnosti launchUrl 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 viz soubor 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 Product

  1. V Průzkumníku řešeníklikněte pravým tlačítkem na projekt. Vyberte Přidat>novou složku. Pojmenujte složku Models.
  2. Klikněte pravým tlačítkem na složku Models. Vyberte Přidat>třídu. Pojmenujte třídu Product 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í:

  • Byla přidána ? poznámka, která deklaruje vlastnosti Name a Category jako odkazové typy s možnou hodnotou null.

Díky použití funkce s možnou hodnotou Null zavedenou v jazyce C# 8můž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 při referencích.

V tomto případě je záměrem, že Name a Category mohou být typy s možnou hodnotou null.

ASP.NET Core v projektech .NET 6 standardně aktivuje odkazové typy s možnou hodnotou null. Pro více informací viz Nullable reference types.

Zkopírujte ProductsController.

  1. Klikněte pravým tlačítkem na složku Controllers.
  2. Vyberte Přidat řadič >....
  3. V dialogovém okně Přidat novou vygenerovanou položku vyberte MVC kontroler – Prázdný, a potom 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í, abyste přešli 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 jmenný prostor
    • rozhraní IHttpActionResult
  • Změní příkaz using ProductsApp.Models; na using ProductsCore.Models;.

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

  • Změní ApiController na ControllerBase.

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

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

  • Zjednodušuje příkaz GetProduct z 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}")]

Routing

ASP.NET Core poskytuje minimální model hostování, ve kterém middleware směrování koncových bodů obklopuje celý kanál zpracování, a proto je možné přidávat trasy přímo do WebApplication bez explicitního volání UseEndpoints nebo UseRouting pro registraci tras.

UseRouting se dá i nadále použít k určení, kde se provádí porovnávání tras, ale UseRouting nemusí být explicitně volána, pokud se trasy mají shodovat na začátku řetězce 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 do WebApplication se spouštějí na konci kanálu.

Směrování v migrovaném ProductsController

Migrovaný ProductsController 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] vytváří směrování atributů jako požadavek na všechny akce v tomto kontroleru.

  • Směrování atributů podporuje tokeny, jako jsou [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.
    • Je nutné zajistit, aby trasy zůstaly synchronizované s odpovídajícími řadiči a akcemi při použití automatických refaktorací přejmenování.
  • Požadavky HTTP Get jsou povolené pro akce ProductController s následujícími atributy:

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

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í)

Dodatečné zdroje

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í)

Prerequisites

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

Tento článek používá projekt ProductsApp vytvořený v Začínáme s ASP.NET Web 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.csse volá 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 metodu 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 }
            );
        }
    }
}

Předchozí třída:

  • Konfiguruje směrování atributů, ačkoliv se ve skutečnosti nepoužívá.
  • Nakonfiguruje směrovací tabulku. Vzorový kód očekává, že adresy URL odpovídají formátu /api/{controller}/{id}, přičemž {id} je 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 šablonu Prázdné řešení a vyberte Další.
  3. Pojmenujte řešení WebAPIMigration. Vyberte Vytvořit.
  4. Do řešení přidejte existující projekt ProductsApp.

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

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

Řešení teď obsahuje dva projekty. Následující části vysvětlují 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 při publikování přidá soubor web.config.

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, které má být aktualizováno 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);
        }
    }
}

Aktualizujte ProductsController pro ASP.NET Core:

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

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

  • Třída ApiController
  • System.Web.Http jmenný prostor
  • rozhraní IHttpActionResult

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

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

  2. Odstranit using System.Web.Http;.

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

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

    return product;
    

Konfigurace směrování

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

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

  • Registrace porovnávání tras a spouštění koncových bodů v middlewaru kanálu
  • Nahraďte soubor projektu 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();
    });
}

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

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

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

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

    Směrování atributů podporuje tokeny, jako jsou [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.
    • Je nutné zajistit, aby trasy zůstaly synchronizované s odpovídajícími řadiči a akcemi při použití automatických refaktorací přejmenování.
  2. Povolte požadavky HTTP Get na akce ProductsController:

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

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.

Dodatečné zdroje