Dela via


Migrera från ASP.NET webb-API till ASP.NET Core

ASP.NET Core kombinerar ASP.NET 4.x:s MVC- och webb-API-appmodeller till en enda programmeringsmodell som kallas ASP.NET Core MVC.

Den här artikeln visar hur du migrerar produktkontrollanten som skapats i Komma igång med ASP.NET Web API 2 till ASP.NET Core.

Förutsättningar

Skapa det nya ASP.NET Core Web API-projektet

  1. På menyn Arkiv väljer du Nytt>Projekt.
  2. Ange Web API i sökrutan.
  3. Välj mallen ASP.NET Core Web API och välj Nästa.
  4. I dialogrutan Konfigurera ditt nya projekt namnger du projektet ProductsCore och väljer Nästa.
  5. I dialogrutan Ytterligare information:
    1. Bekräfta att Framework är .NET 6.0 (Långsiktigt stöd).
    2. Bekräfta kryssrutan för Använd kontrollanter (avmarkera om du vill använda minimala API:er) är markerad.
    3. Avmarkera Aktivera OpenAPI-stöd.
    4. Välj Skapa.

Ta bort mallfilerna WeatherForecast

  1. Ta bort WeatherForecast.cs- och Controllers/WeatherForecastController.cs exempelfilerna från det nya ProductsCore--projektet.
  2. Öppna egenskaper\launchSettings.jspå.
  3. Ändra launchUrl egenskaper från weatherforcast till productscore.

Konfigurationen för ASP.NET Core Web API

ASP.NET Core använder inte mappen App_Start eller filen Global.asax. Filen web.config läggs till vid publiceringstillfället. Mer information finns i web.config filen.

Filen Program.cs:

  • Ersätter Global.asax.
  • Hanterar alla startuppgifter för appar.

För mer information, se appstart i i ASP.NET Core.

Följande visar programmets startkod i filen 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();

Kopiera modellen Product

  1. Högerklicka på projektet i Solution Explorer. Välj Lägg till>ny mapp. Ge mappen namnet Models.
  2. Högerklicka på mappen Models. Välj Lägg till>class. Ge klassen namnet Product och välj Lägg till.
  3. Ersätt mallmodellkoden med följande:
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; }
    }
}

Föregående markerade kod ändrar följande:

  • Den ? kommentaren har lagts till för att deklarera egenskaperna Name och Category som nullbara referenstyper.

Genom att använda funktionen Nullable som introducerades i C# 8kan ASP.NET Core tillhandahålla ytterligare kodflödesanalys och kompileringstidssäkerhet i hanteringen av referenstyper. Till exempel skydd mot null referensundantag.

I det här fallet är avsikten att Name och Category kan vara nullbara typer.

ASP.NET Core 6.0-projekt aktiverar som standard null-referenstyper. För mer information, se nullbara referenstyper.

Kopiera ProductsController-

  1. Högerklicka på mappen Controllers.
  2. Välj Lägg till > controller....
  3. I dialogrutan Lägg till nytt autogenererat objekt, välj Mvc Controller - Empty och välj sedan Lägg till.
  4. Ge kontrollanten namnet ProductsController och välj Lägg till.
  5. Ersätt mallkontrollantkoden med följande:
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;
    }
}

Föregående markerade kod ändrar följande för att migrera till ASP.NET Core:

  • Tar bort med hjälp av instruktioner för följande ASP.NET 4.x-komponenter som inte finns i ASP.NET Core:

    • ApiController klass
    • System.Web.Http namnrymd
    • IHttpActionResult gränssnitt
  • Ändrar using ProductsApp.Models;-uttalandet till using ProductsCore.Models;.

  • Anger rotnamnområdet till ProductsCore.

  • Ändrar ApiController till ControllerBase.

  • Lägger till using Microsoft.AspNetCore.Mvc; för att matcha referensen för ControllerBase.

  • Ändrar GetProduct-åtgärdens returtyp från IHttpActionResult till ActionResult<Product>. Mer information finns i kontrollantåtgärdens returtyper.

  • Förenklar GetProduct-åtgärdens return-instruktion till följande instruktion:

    return product;
    
  • Lägger till följande attribut som beskrivs i nästa avsnitt:

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

Routning

ASP.NET Core har en minimal värdmodell där slutpunktsdirigeringsdirigeringen omsluter hela mellanprogramspipelinen. Därför kan vägar läggas till direkt i WebApplication utan ett explicit anrop till UseEndpoints eller UseRouting för att registrera vägar.

UseRouting kan fortfarande användas för att ange var routningsmatchning ska ske, men UseRouting behöver inte anropas uttryckligen om vägar ska matchas i början av pipelinen för mellanprogram.

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

Obs! Rutterna som läggs till direkt i WebApplication utförs vid slutet av pipelinen.

Routning i den migrerade ProductsController

Den migrerade ProductsController innehåller följande markerade attribut:

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;
    }
}
  • Attributet [Route]konfigurerar kontrollantens attributdirigeringsmönster.

  • Attributet [ApiController] gör attributroutning till ett krav för alla åtgärder i den här kontrollanten.

  • Attributdirigering stöder token, såsom [controller] och [action]. Vid körning ersätts varje token med namnet på kontrollanten eller åtgärden som attributet har tillämpats på. Token:

    • Minskar eller eliminerar behovet av att använda hårdkodade strängar för vägen.
    • Se till att vägarna förblir synkroniserade med motsvarande kontrollanter och åtgärder när automatiska refaktorbyten tillämpas.
  • HTTP Get-begäranden är aktiverade för ProductController åtgärder med följande attribut:

    • [HttpGet] attribut som tillämpas på åtgärden GetAllProducts.
    • [HttpGet("{id}")] attribut som tillämpas på åtgärden GetProduct.

Kör det migrerade projektet och bläddra till /api/products. Till exempel: https://localhost:<port>/api/products. En fullständig lista över tre produkter visas. Bläddra till /api/products/1. Den första produkten visas.

Visa eller ladda ned exempelkod (hur du laddar ned)

Ytterligare resurser

Den här artikeln visar de steg som krävs för att migrera från ASP.NET 4.x-webb-API till ASP.NET Core MVC.

Visa eller ladda ned exempelkod (hur du laddar ned)

Förutsättningar

Granska ASP.NET 4.x Web API-projekt

Den här artikeln använder projektet ProductsApp som skapades i Komma igång med ASP.NET Web API 2. I det projektet konfigureras ett grundläggande ASP.NET 4.x Web API-projekt på följande sätt.

I Global.asax.csgörs ett anrop till 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);
        }
    }
}

Klassen WebApiConfig finns i mappen App_Start och har en statisk Register-metod:

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

Föregående klass:

  • Konfigurerar attributdirigering, även om det faktiskt inte används.
  • Konfigurerar routningstabellen. Exempelkoden förväntar sig att URL:er matchar formatet /api/{controller}/{id}, där {id} är valfritt.

Följande avsnitt visar migrering av webb-API-projektet till ASP.NET Core MVC.

Skapa målprojektet

Skapa en ny tom lösning i Visual Studio och lägg till ASP.NET 4.x Web API-projekt för migrering:

  1. På menyn Arkiv väljer du Nytt>Projekt.
  2. Välj mallen tom lösning och välj Nästa.
  3. Ge lösningen namnet WebAPIMigration. Välj Skapa.
  4. Lägg till det befintliga projektet ProductsApp i lösningen.

Lägg till ett nytt API-projekt att migrera till:

  1. Lägg till ett nytt ASP.NET Core Web Application-projekt i lösningen.
  2. I dialogrutan Konfigurera ditt nya projekt namnger du projektet ProductsCoreoch väljer Skapa.
  3. I dialogrutan Skapa ett nytt ASP.NET Core-webbprogram kontrollerar du att .NET Core och ASP.NET Core 3.1 är markerade. Välj projektmallen API och välj Skapa.
  4. Ta bort WeatherForecast.cs- och Controllers/WeatherForecastController.cs exempelfilerna från det nya ProductsCore--projektet.

Lösningen innehåller nu två projekt. I följande avsnitt beskrivs hur du migrerar ProductsApp-projektets innehåll till projektet ProductsCore.

Migrera konfiguration

ASP.NET Core använder inte mappen App_Start eller filen Global.asax. Dessutom läggs web.config-filen till vid publiceringstillfället.

Klassen Startup:

  • Ersätter Global.asax.
  • Hanterar alla startuppgifter för appar.

För mer information, se App-start i ASP.NET Core.

Migrera modeller och styrenheter

Följande kod visar ProductsController som ska uppdateras för 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);
        }
    }
}

Uppdatera ProductsController för ASP.NET Core:

  1. Kopiera Controllers/ProductsController.cs och mappen Models från det ursprungliga projektet till det nya.
  2. Ändra de kopierade filernas rotnamnområde till ProductsCore.
  3. Uppdatera using ProductsApp.Models;-instruktionen till using ProductsCore.Models;.

Följande komponenter finns inte i ASP.NET Core:

  • ApiController klass
  • System.Web.Http namnområde
  • IHttpActionResult gränssnitt

Gör följande ändringar:

  1. Ändra ApiController till ControllerBase. Lägg till using Microsoft.AspNetCore.Mvc; för att matcha referensen för ControllerBase.

  2. Ta bort using System.Web.Http;.

  3. Ändra GetProduct-åtgärdens returtyp från IHttpActionResult till ActionResult<Product>.

  4. Gör GetProduct-åtgärdens return-del enkelt till följande:

    return product;
    

Konfigurera routning

ASP.NET Core API-projektmallen innehåller konfiguration av slutpunktsroutning i den genererade koden.

Följande anrop UseRouting och UseEndpoints:

  • Registrera routningsmatchning och slutpunktskörning i -mellanprogramspipelinen.
  • Ersätt ProductsApp projektets App_Start/WebApiConfig.cs fil.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

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

Konfigurera routning enligt följande:

  1. Markera klassen ProductsController med följande attribut:

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

    Det föregående [Route]-attributet konfigurerar kontrollantens attributroutningsmönster. Attributet [ApiController] gör attributroutning till ett krav för alla åtgärder i den här kontrollanten.

    Attributruttning stöder symboler, som [controller] och [action]. Vid körning ersätts varje token med namnet på kontrollanten eller åtgärden som attributet har tillämpats på. Token:

    • Minska antalet magiska strängar i projektet.
    • Se till att rutterna förblir synkroniserade med motsvarande kontrollanter och åtgärder när automatiska omdöpningar vid refaktoreringar tillämpas.
  2. Aktivera HTTP Get-begäranden till ProductsController åtgärder:

    • Använd attributet [HttpGet] för åtgärden GetAllProducts.
    • Använd attributet [HttpGet("{id}")] för åtgärden GetProduct.

Kör det migrerade projektet och bläddra till /api/products. En fullständig lista över tre produkter visas. Bläddra till /api/products/1. Den första produkten visas.

Ytterligare resurser