Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
ASP.NET Core łączy modele MVC i Web API z ASP.NET 4.x w jeden model programowania znany jako ASP.NET Core MVC.
W tym artykule pokazano, jak przeprowadzić migrację kontrolera Products utworzonego w Getting Started with ASP.NET Web API 2 do ASP.NET Core.
Wymagania wstępne
- Program Visual Studio 2022 z obciążeniem tworzenia ASP.NET i aplikacji webowych.
- SDK .NET 6
Tworzenie nowego projektu internetowego interfejsu API platformy ASP.NET Core
- W menu Plik wybierz pozycję Nowy>projekt.
- Wprowadź Web API w polu wyszukiwania.
- Wybierz szablon ASP.NET Core Web API i następnie wybierz Dalej.
- W oknie dialogowym Konfigurowanie nowego projektu nadaj projektowi nazwę ProductsCore i kliknij Dalej.
- W oknie dialogowym Dodatkowe informacje :
- Upewnij się, że Framework jest .NET 6.0 (wsparcie długoterminowe).
- Upewnij się, że pole wyboru Użyj kontrolerów (usuń zaznaczenie pola wyboru, aby używać minimalnych interfejsów API) jest zaznaczone.
- Usuń zaznaczenie Włącz obsługę interfejsu OpenAPI.
- Wybierz Utwórz.
Usuń pliki szablonów WeatherForecast
- Usuń przykładowe pliki
WeatherForecast.cs
iControllers/WeatherForecastController.cs
z nowego projektu ProductsCore. - Otwórz właściwości \launchSettings.jsna.
- Zmień właściwości
launchUrl
zweatherforcast
naproductscore
.
Konfiguracja internetowego interfejsu API platformy ASP.NET Core
ASP.NET Core nie używa folderu App_Start ani pliku Global.asax. Plik web.config jest dodawany w czasie publikowania. Aby uzyskać więcej informacji, zobacz plik web.config.
Plik Program.cs
:
- Zastępuje Global.asax.
- Obsługuje wszystkie zadania uruchamiania aplikacji.
Aby uzyskać więcej informacji, zobacz Uruchamianie aplikacji w programie ASP.NET Core.
Poniżej przedstawiono kod uruchamiania aplikacji w pliku Program.cs
core ASP.NET:
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();
Skopiuj model produktu
- W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt. Wybierz pozycję Dodaj>nowy folder. Nadaj folderowi nazwę Models.
- Kliknij prawym przyciskiem myszy folder Models. Wybierz Dodaj>klasę. Nadaj klasie nazwę Product i wybierz pozycję Dodaj.
- Zastąp kod modelu szablonu następującym kodem:
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; }
}
}
Powyższy wyróżniony kod zmienia następujące elementy:
- Dodano adnotację
?
w celu zadeklarowania właściwościName
iCategory
jako typów odwołań nieprzechowujących wartości null.
Dzięki wykorzystaniu funkcji Nullable wprowadzonej w języku C# 8program ASP.NET Core może zapewnić dodatkową analizę przepływu kodu i bezpieczeństwo czasu kompilacji w obsłudze typów odwołań. Na przykład ochrona przed null
wyjątkami referencyjnymi.
W tym przypadku zamierzeniem jest, aby Name
i Category
mogły być typami dopuszczającymi wartości null.
ASP.NET Core w projektach .NET 6 domyślnie włącza typy referencyjne dopuszczające wartość null. Aby uzyskać więcej informacji, zobacz Typy referencyjne dopuszczane do wartości null.
Skopiuj ProductsController
- Kliknij prawym przyciskiem myszy folder kontrolery .
- Wybierz pozycję Dodaj kontroler >....
- W oknie dialogowym Dodawanie nowego szkieletu elementu wybierz pozycję kontroler mvc — pusty a następnie wybierz pozycję Dodaj.
- Nadaj kontrolerowi nazwę ProductsController i wybierz pozycję Dodaj.
- Zastąp kod kontrolera szablonu następującym kodem:
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;
}
}
Poprzedni wyróżniony kod zmienia następujący kod, aby przeprowadzić migrację do ASP.NET Core:
Usuwa instrukcje using dla następujących składników ASP.NET 4.x, które nie istnieją w ASP.NET Core:
-
ApiController
klasa - przestrzeń nazw
System.Web.Http
- interfejs
IHttpActionResult
-
Zmienia instrukcję
using ProductsApp.Models;
nausing ProductsCore.Models;
.Ustawia przestrzeń nazw katalogu głównego na
ProductsCore
.Zmienia
ApiController
na ControllerBase.Dodaje
using Microsoft.AspNetCore.Mvc;
, aby rozwiązać odwołanieControllerBase
.Zmienia typ zwracany akcji
GetProduct
zIHttpActionResult
naActionResult<Product>
. Aby uzyskać więcej informacji, zobacz zwracane typy akcji kontrolera .Upraszcza zdanie akcji
GetProduct
do następującego zdaniareturn
:return product;
Dodaje następujące atrybuty, które zostały wyjaśnione w następnych sekcjach:
[Route("api/[controller]")]
[ApiController]
[HttpGet]
[HttpGet("{id}")]
Trasowanie
ASP.NET Core zapewnia minimalny model hostingu, w którym oprogramowanie pośredniczące do routingu punktów końcowych otacza cały potok pośredniczący, dzięki czemu trasy można bezpośrednio dodawać do WebApplication bez konieczności jawnego wywoływania UseEndpoints lub UseRouting w celu ich rejestracji.
UseRouting
nadal można użyć do określenia, gdzie odbywa się dopasowywanie tras, ale UseRouting
nie musi być jawnie wywoływana, jeśli trasy powinny być dopasowane na początku potoku oprogramowania pośredniczącego.
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();
Uwaga: Trasy dodane bezpośrednio do WebApplication są wykonywane na końcu potoku.
Routowanie w zmigrowanym ProductsController
Zmigrowany ProductsController
zawiera następujące wyróżnione atrybuty:
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;
}
}
Atrybut
[Route]
konfiguruje wzorzec routingu atrybutów kontrolera.Atrybut
[ApiController]
sprawia, że routing atrybutów jest wymogiem dla wszystkich akcji w tym kontrolerze.Routing atrybutów obsługuje tokeny, takie jak
[controller]
i[action]
. W czasie wykonywania każdy token jest zastępowany odpowiednio nazwą kontrolera lub akcji, do której zastosowano atrybut. Tokeny:- Zmniejsza lub eliminuje konieczność używania ciągów zakodowanych w kodzie dla trasy.
- Upewnij się, że trasy pozostają zsynchronizowane z odpowiednimi kontrolerami i akcjami po zastosowaniu automatycznej refaktoryzacji zmiany nazwy.
Żądania HTTP Get są włączone dla działań
ProductController
z następującymi atrybutami:-
[HttpGet]
atrybut zastosowany do akcjiGetAllProducts
. -
[HttpGet("{id}")]
atrybut zastosowany do akcjiGetProduct
.
-
Uruchom zmigrowany projekt i przejdź do /api/products
. Na przykład: https://localhost:<port>
/api/products. Zostanie wyświetlona pełna lista trzech produktów. Przejdź do /api/products/1
. Pojawia się pierwszy produkt.
Wyświetl lub pobierz przykładowy kod (jak pobrać)
Dodatkowe zasoby
W tym artykule przedstawiono kroki wymagane do migracji z internetowego interfejsu API ASP.NET 4.x do ASP.NET Core MVC.
Wyświetl lub pobierz przykładowy kod (jak pobrać)
Wymagania wstępne
- Program Visual Studio 2019 16.4 lub nowsza wersja z pakietem roboczym tworzenia aplikacji ASP.NET i webowych
- Zestaw SDK platformy .NET Core 3.1
Zapoznaj się z projektem internetowego interfejsu API ASP.NET 4.x
W tym artykule użyto projektu ProductsApp utworzonego w Wprowadzenie do internetowego interfejsu API 2 ASP.NET. W tym projekcie skonfigurowano podstawowy projekt internetowego interfejsu API ASP.NET 4.x w następujący sposób.
W Global.asax.cs
wykonywane jest wywołanie do 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);
}
}
}
Klasa WebApiConfig
znajduje się w folderze App_Start i ma statyczną metodę 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 }
);
}
}
}
Poprzednia klasa:
- Konfiguruje routing atrybutowy, chociaż nie jest on faktycznie używany.
- Konfiguruje tabelę routingu.
Przykładowy kod oczekuje, że adresy URL będą zgodne z formatem
/api/{controller}/{id}
, a{id}
jest opcjonalny.
W poniższych sekcjach przedstawiono migrację projektu Web API do ASP.NET Core MVC.
Tworzenie projektu docelowego
Utwórz nowe puste rozwiązanie w programie Visual Studio i dodaj projekt internetowego interfejsu API ASP.NET 4.x, aby przeprowadzić migrację:
- W menu Plik wybierz pozycję Nowy>projekt.
- Wybierz szablon Puste rozwiązanie i kliknij Dalej.
- Nadaj rozwiązaniu nazwę WebAPIMigration. Wybierz Utwórz.
- Dodaj istniejący projekt ProductsApp do rozwiązania.
Dodaj nowy projekt interfejsu API, aby przeprowadzić migrację do:
- Dodaj nowy projekt ASP.NET Core Web Application do rozwiązania.
- W oknie dialogowym Konfigurowanie nowego projektu nadaj projektowi nazwę ProductsCorei wybierz pozycję Utwórz.
- W oknie dialogowym Tworzenie nowej aplikacji internetowej ASP.NET Core upewnij się, że zaznaczone są .NET Core i ASP.NET Core 3.1. Wybierz szablon projektu interfejsu API , a następnie wybierz pozycję Utwórz.
- Usuń przykładowe pliki
WeatherForecast.cs
iControllers/WeatherForecastController.cs
z nowego projektu ProductsCore.
Rozwiązanie zawiera teraz dwa projekty. W poniższych sekcjach opisano migrację zawartości projektu ProductsApp do projektu ProductsCore.
Migrowanie konfiguracji
ASP.NET Core nie używa folderu App_Start ani pliku Global.asax. Ponadto plik web.config jest dodawany w czasie publikowania.
Klasa Startup
:
- Zastępuje Global.asax.
- Obsługuje wszystkie zadania uruchamiania aplikacji.
Aby uzyskać więcej informacji, zobacz Uruchamianie aplikacji w programie ASP.NET Core.
Migrowanie modeli i kontrolerów
Poniższy kod przedstawia ProductsController
, który należy zaktualizować dla 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);
}
}
}
Zaktualizuj ProductsController
dla ASP.NET Core:
- Skopiuj
Controllers/ProductsController.cs
i folder Models z oryginalnego projektu do nowego. - Zmień przestrzeń nazw katalogu głównego skopiowanych plików na
ProductsCore
. - Zaktualizuj instrukcję
using ProductsApp.Models;
, aby odpowiadałausing ProductsCore.Models;
.
Następujące składniki nie istnieją w ASP.NET Core:
-
ApiController
klasa - przestrzeń nazw
System.Web.Http
- interfejs
IHttpActionResult
Wprowadź następujące zmiany:
Zmień
ApiController
na ControllerBase. Dodajusing Microsoft.AspNetCore.Mvc;
, aby rozwiązać referencjęControllerBase
.Usuń
using System.Web.Http;
.Zmień typ zwracany akcji
GetProduct
zIHttpActionResult
naActionResult<Product>
.Uprość instrukcję akcji
GetProduct
return
do następującej:return product;
Konfigurowanie routingu
Szablon projektu ASP.NET Core API zawiera konfigurację routingu punktu końcowego w wygenerowanym kodzie.
Następujące wywołania UseRouting i UseEndpoints:
- Zarejestruj dopasowywanie tras i wykonywanie punktu końcowego w potoku oprogramowania pośredniczącego .
- Zastąp plik projektu ProductsApp
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();
});
}
Skonfiguruj routing w następujący sposób:
Oznacz klasę
ProductsController
następującymi atrybutami:[Route("api/[controller]")] [ApiController]
Poprzedni atrybut
[Route]
konfiguruje wzorzec routingu atrybutów kontrolera. Atrybut[ApiController]
sprawia, że routing atrybutów jest wymogiem dla wszystkich akcji w tym kontrolerze.Routing atrybutów obsługuje tokeny, takie jak
[controller]
i[action]
. W czasie wykonywania każdy token jest zastępowany odpowiednio nazwą kontrolera lub akcji, do której zastosowano atrybut. Tokeny:- Zmniejsz liczbę ciągów magicznych w projekcie.
- Upewnij się, że trasy pozostają zsynchronizowane z odpowiednimi kontrolerami i akcjami po zastosowaniu automatycznej refaktoryzacji zmiany nazwy.
Włącz żądania HTTP Get do akcji
ProductsController
:- Zastosuj atrybut
[HttpGet]
do akcjiGetAllProducts
. - Zastosuj atrybut
[HttpGet("{id}")]
do akcjiGetProduct
.
- Zastosuj atrybut
Uruchom zmigrowany projekt i przejdź do /api/products
. Zostanie wyświetlona pełna lista trzech produktów. Przejdź do /api/products/1
. Pojawia się pierwszy produkt.