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
- Visual Studio 2022 med arbetsbelastningen ASP.NET och webbutveckling.
- .NET 6.0 SDK
Skapa det nya ASP.NET Core Web API-projektet
- På menyn Arkiv väljer du Nytt>Projekt.
- Ange Web API i sökrutan.
- Välj mallen ASP.NET Core Web API och välj Nästa.
- I dialogrutan Konfigurera ditt nya projekt namnger du projektet ProductsCore och väljer Nästa.
- I dialogrutan Ytterligare information:
- Bekräfta att Framework är .NET 6.0 (Långsiktigt stöd).
- Bekräfta kryssrutan för Använd kontrollanter (avmarkera om du vill använda minimala API:er) är markerad.
- Avmarkera Aktivera OpenAPI-stöd.
- Välj Skapa.
Ta bort mallfilerna WeatherForecast
- Ta bort
WeatherForecast.cs
- ochControllers/WeatherForecastController.cs
exempelfilerna från det nya ProductsCore--projektet. - Öppna egenskaper\launchSettings.jspå.
- Ändra
launchUrl
egenskaper frånweatherforcast
tillproductscore
.
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
- Högerklicka på projektet i Solution Explorer. Välj Lägg till>ny mapp. Ge mappen namnet Models.
- Högerklicka på mappen Models. Välj Lägg till>class. Ge klassen namnet Product och välj Lägg till.
- 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 egenskapernaName
ochCategory
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-
- Högerklicka på mappen Controllers.
- Välj Lägg till > controller....
- I dialogrutan Lägg till nytt autogenererat objekt, välj Mvc Controller - Empty och välj sedan Lägg till.
- Ge kontrollanten namnet ProductsController och välj Lägg till.
- 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 tillusing ProductsCore.Models;
.Anger rotnamnområdet till
ProductsCore
.Ändrar
ApiController
till ControllerBase.Lägger till
using Microsoft.AspNetCore.Mvc;
för att matcha referensen förControllerBase
.Ändrar
GetProduct
-åtgärdens returtyp frånIHttpActionResult
tillActionResult<Product>
. Mer information finns i kontrollantåtgärdens returtyper.Förenklar
GetProduct
-åtgärdensreturn
-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ärdenGetAllProducts
. -
[HttpGet("{id}")]
attribut som tillämpas på åtgärdenGetProduct
.
-
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
- Visual Studio 2019 16.4 eller senare med arbetsbelastningen ASP.NET och webbutveckling
- .NET Core 3.1 SDK
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.cs
gö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:
- På menyn Arkiv väljer du Nytt>Projekt.
- Välj mallen tom lösning och välj Nästa.
- Ge lösningen namnet WebAPIMigration. Välj Skapa.
- Lägg till det befintliga projektet ProductsApp i lösningen.
Lägg till ett nytt API-projekt att migrera till:
- Lägg till ett nytt ASP.NET Core Web Application-projekt i lösningen.
- I dialogrutan Konfigurera ditt nya projekt namnger du projektet ProductsCoreoch väljer Skapa.
- 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.
- Ta bort
WeatherForecast.cs
- ochControllers/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:
- Kopiera
Controllers/ProductsController.cs
och mappen Models från det ursprungliga projektet till det nya. - Ändra de kopierade filernas rotnamnområde till
ProductsCore
. - Uppdatera
using ProductsApp.Models;
-instruktionen tillusing 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:
Ändra
ApiController
till ControllerBase. Lägg tillusing Microsoft.AspNetCore.Mvc;
för att matcha referensen förControllerBase
.Ta bort
using System.Web.Http;
.Ändra
GetProduct
-åtgärdens returtyp frånIHttpActionResult
tillActionResult<Product>
.Gör
GetProduct
-åtgärdensreturn
-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:
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.
Aktivera HTTP Get-begäranden till
ProductsController
åtgärder:- Använd attributet
[HttpGet]
för åtgärdenGetAllProducts
. - Använd attributet
[HttpGet("{id}")]
för åtgärdenGetProduct
.
- Använd attributet
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
ASP.NET Core