Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
ASP.NET Core kombiniert ASP.NET MVC- und Web-API-App-Modelle von 4.x in einem einzigen Programmiermodell, das als ASP.NET Core MVC bezeichnet wird.
In diesem Artikel wird gezeigt, wie Sie den in "Erste Schritte" erstellten Produktcontroller mit ASP.NET Web-API 2 zu ASP.NET Core migrieren.
Prerequisites
- Visual Studio 2022 mit der Arbeitslast für ASP.NET und Webentwicklung
- .NET 6 SDK
Erstellen des neuen ASP.NET Core Web API-Projekts
- Klicken Sie im Menü Datei auf Neu>Projekt.
- Geben Sie Web-API in das Suchfeld ein.
- Wählen Sie die ASP.NET Core-Web-API-Vorlage aus, und klicken Sie auf Weiter.
- Geben Sie im Dialogfeld Neues Projekt konfigurieren dem Projekt den Namen ProductsCore, und wählen Sie dann Weiter aus.
- Im Dialogfeld Zusätzliche Informationen:
- Vergewissern Sie sich, dass das Framework auf .NET 6.0 (Langfristiger Support) festgelegt ist.
- Bestätigen Sie, dass das Kontrollkästchen für "Controller verwenden" aktiviert ist (deaktivieren, um minimale APIs zu verwenden).
- Deaktivieren Sie OpenAPI-Unterstützung aktivieren.
- Wählen Sie "Erstellen" aus.
Entfernen Sie die Vorlagendateien WeatherForecast
- Entfernen Sie die beispieldateien
WeatherForecast.csundControllers/WeatherForecastController.csaus dem neuen ProductsCore Projekt. - Öffnen Sie "Eigenschaften",\launchSettings.jsaktiviert ist.
- Ändern Sie
launchUrlEigenschaften vonweatherforcastinproductscore.
Die Konfiguration für ASP.NET Core Web API
ASP.NET Core verwendet nicht den ordner App_Start oder die datei Global.asax. Die Datei web.config wird zur Veröffentlichungszeit hinzugefügt. Weitere Informationen finden Sie unter web.config Datei.
Die datei Program.cs:
- Ersetzt "Global.asax".
- Behandelt alle App-Startaufgaben.
Weitere Informationen finden Sie unter Anwendungsstart in ASP.NET Core.
Im Folgenden sehen Sie den Anwendungsstartcode in der Datei 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();
Kopieren des Product-Modells
- Klicken Sie im Projektmappen-Explorermit der rechten Maustaste auf das Projekt. Klicken Sie auf Hinzufügen>Neuer Ordner. Benennen Sie den Ordner Models.
- Klicken Sie mit der rechten Maustaste auf den Ordner Modelle. Wählen Sie Hinzufügen>Klasse aus. Nennen Sie die Klasse Product, und wählen Sie Hinzufügen aus.
- Ersetzen Sie den Vorlagenmodellcode durch Folgendes:
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; }
}
}
Der oben hervorgehobene Code ändert Folgendes:
- Die
?Anmerkung wurde hinzugefügt, um die eigenschaftenNameundCategoryals nullwerte Referenztypen zu deklarieren.
Durch die Verwendung der in C# 8 eingeführtenNullable-Funktion kann ASP.NET Core zusätzliche Codeflussanalyse und Kompilierungszeitsicherheit bei der Behandlung von Verweistypen bereitstellen. Dazu gehört beispielsweise der Schutz vor null-Verweisausnahmen.
In diesem Fall ist die Absicht, dass die Name und Category nullable Typen sein können.
ASP.NET Core in .NET 6-Projekten standardmäßig nullfähige Verweistypen aktivieren. Weitere Informationen finden Sie unter Nullable-Verweistypen.
Kopieren Sie den ProductsController
- Klicken Sie mit der rechten Maustaste auf den Ordner Controller.
- Wählen Sie Hinzufügen > Controller... aus.
- Wählen Sie im Dialogfeld Neues Gerüstelement hinzufügen die Option MVC-Controller – leer und anschließend Hinzufügen aus.
- Nennen Sie den Controller ProductsController, und wählen Sie Hinzufügen aus.
- Ersetzen Sie den Code des Vorlagencontrollers durch Folgendes:
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;
}
}
Der oben hervorgehobene Code ändert Folgendes, um zu ASP.NET Core zu migrieren:
Entfernt die Verwendung von Anweisungen für die folgenden ASP.NET 4.x-Komponenten, die in ASP.NET Core nicht vorhanden sind:
-
ApiController-Klasse -
System.Web.Http-Namespace -
IHttpActionResult-Schnittstelle
-
Er ändert die
using ProductsApp.Models;-Anweisung inusing ProductsCore.Models;.Legt den Stammnamespace auf
ProductsCorefest.Ändert
ApiControllerin ControllerBase.Fügt
using Microsoft.AspNetCore.Mvc;hinzu, um denControllerBaseVerweis aufzulösen.Ändert den Rückgabetyp der
GetProductAktion vonIHttpActionResultinActionResult<Product>. Weitere Informationen finden Sie unter Controller-Aktionsrückgabetypen.Er vereinfacht die
GetProduct-Anweisung derreturn-Aktion wie folgt:return product;Fügt die folgenden Attribute hinzu, die in den nächsten Abschnitten erläutert werden:
[Route("api/[controller]")][ApiController][HttpGet][HttpGet("{id}")]
Routing
ASP.NET Core bietet ein minimales Hostingmodell, in dem die Endpunktrouting-Middleware die gesamte Middlewarepipeline umschließt. Daher können Routen direkt zur WebApplication hinzugefügt werden, ohne dass ein expliziter Aufruf von UseEndpoints oder UseRouting zum Registrieren von Routen erforderlich ist.
UseRouting kann weiterhin verwendet werden, um anzugeben, wo der Routenabgleich erfolgt, aber UseRouting muss nicht explizit aufgerufen werden, wenn Routen zu Beginn der Middleware-Pipeline abgeglichen werden sollen.
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();
Hinweis: Routen, die WebApplication direkt hinzugefügt werden, werden am Ende der Pipeline ausgeführt.
Routing im migrierten Controller ProductsController
Die migrierte ProductsController enthält die folgenden hervorgehobenen Attribute:
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;
}
}
Das
[Route]-Attribut konfiguriert das Attributroutingmuster des Controllers.Das attribut
[ApiController]macht das Attributrouting für alle Aktionen in diesem Controller erforderlich.Attributrouting unterstützt Token wie
[controller]und[action]. Zur Laufzeit wird jedes Token durch den Namen des Controllers oder der Aktion ersetzt, auf den das Attribut angewendet wurde. Die Token:- Reduziert oder beseitigt die Notwendigkeit, hartcodierte Zeichenfolgen für die Route zu verwenden.
- Stellen Sie sicher, dass Routen mit den entsprechenden Controllern und Aktionen synchronisiert bleiben, wenn automatische Umbenennungen angewendet werden.
HTTP Get-Anforderungen sind für
ProductControllerAktionen mit den folgenden Attributen aktiviert:-
[HttpGet]Attribut, das auf die aktionGetAllProductsangewendet wird. -
[HttpGet("{id}")]Attribut, das auf die aktionGetProductangewendet wird.
-
Führen Sie das migrierte Projekt aus, und navigieren Sie zu /api/products. Beispiel: https://localhost:<port>/api/products. Es wird eine vollständige Liste mit drei Produkten angezeigt. Navigieren Sie zu /api/products/1. Das erste Produkt wird angezeigt.
Anzeigen oder Herunterladen von Beispielcode (Anleitung zum Herunterladen)
Weitere Ressourcen
In diesem Artikel werden die Schritte veranschaulicht, die erforderlich sind, um von ASP.NET 4.x Web-API zu ASP.NET Core MVC zu migrieren.
Anzeigen oder Herunterladen von Beispielcode (Anleitung zum Herunterladen)
Prerequisites
- Visual Studio 2019 16.4 oder höher mit der Arbeitsauslastung für ASP.NET und Webentwicklung
- .NET Core 3.1 SDK
Überprüfung des ASP.NET 4.x Web-API-Projekts
In diesem Artikel wird das ProductsApp Projekt verwendet, das in Erste Schritte mit ASP.NET Web-API 2erstellt wurde. In diesem Projekt wird ein grundlegendes ASP.NET 4.x Web API-Projekt wie folgt konfiguriert.
In Global.asax.cswird ein Anruf an WebApiConfig.Registergestellt:
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);
}
}
}
Die WebApiConfig-Klasse befindet sich im Ordner App_Start und verfügt über eine statische Register Methode:
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 }
);
}
}
}
Die vorangehende Klasse:
- Sie konfiguriert das Attributrouting (auch wenn es eigentlich gar nicht verwendet wird).
- Konfiguriert die Routingtabelle.
Der Beispielcode erwartet, dass URLs mit dem Format
/api/{controller}/{id}übereinstimmen, wobei{id}optional sind.
In den folgenden Abschnitten wird die Migration des Web-API-Projekts zu ASP.NET Core MVC veranschaulicht.
Erstellen des Zielprojekts
Erstellen Sie eine neue leere Projektmappe in Visual Studio, und fügen Sie das ASP.NET 4.x-Web-API-Projekt hinzu, das migriert werden soll:
- Klicken Sie im Menü Datei auf Neu>Projekt.
- Wählen Sie die Vorlage Leere Projektmappe und anschließend Weiter aus.
- Benennen Sie die Lösung WebAPIMigration. Wählen Sie "Erstellen" aus.
- Fügen Sie der Projektmappe das vorhandene Projekt ProductsApp hinzu.
Fügen Sie ein neues API-Projekt zum Migrieren zu:
- Fügen Sie der Lösung ein neues ASP.NET Core Web Application Projekt hinzu.
- Geben Sie im Dialogfeld "Neues Projekt konfigurieren" den Projektnamen ProductsCorean und wählen Sie "Erstellen".
- Vergewissern Sie sich im Dialogfeld Erstellen eines neuen ASP.NET Core-Webanwendungs-, dass .NET Core und ASP.NET Core 3.1- ausgewählt sind. Wählen Sie die Projektvorlage API aus, und klicken Sie auf Erstellen.
- Entfernen Sie die beispieldateien
WeatherForecast.csundControllers/WeatherForecastController.csaus dem neuen ProductsCore Projekt.
Die Projektmappe enthält nun zwei Projekte. In den folgenden Abschnitten wird die Migration der Inhalte des ProjectsApp--Projekts zum ProductsCore--Projekt erläutert.
Migrieren der Konfiguration
ASP.NET Core verwendet nicht den ordner App_Start oder die datei Global.asax. Darüber hinaus wird die web.config Datei bei der Veröffentlichung hinzugefügt.
Die Startup Klasse:
- Ersetzt "Global.asax".
- Behandelt alle App-Startaufgaben.
Weitere Informationen finden Sie unter Anwendungsstart in ASP.NET Core.
Migrieren von Modellen und Controllern
Der folgende Code zeigt die ProductsController, die für ASP.NET Core aktualisiert werden soll:
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);
}
}
}
Aktualisieren Sie die ProductsController für ASP.NET Core:
- Kopieren Sie
Controllers/ProductsController.csund den Ordner Models aus dem ursprünglichen Projekt in den neuen Ordner. - Ändern Sie den Stammnamespace der kopierten Dateien in
ProductsCore. - Aktualisieren Sie die
using ProductsApp.Models;-Erklärung aufusing ProductsCore.Models;.
Die folgenden Komponenten sind in ASP.NET Core nicht vorhanden:
-
ApiController-Klasse -
System.Web.Http-Namespace -
IHttpActionResult-Schnittstelle
Nehmen Sie die folgenden Änderungen vor:
Ändern Sie
ApiControllerin ControllerBase. Fügen Sieusing Microsoft.AspNetCore.Mvc;hinzu, um denControllerBaseVerweis aufzulösen.using System.Web.Http;löschen .Ändern Sie den Rückgabetyp der
GetProductAktion vonIHttpActionResultinActionResult<Product>.Vereinfachen Sie die
GetProduct-Anweisung derreturn-Aktion wie folgt:return product;
Konfigurieren des Routings
Die ASP.NET Core -API- Projektvorlage enthält die Endpunktroutingkonfiguration im generierten Code.
Die folgenden Aufrufe von UseRouting und UseEndpoints bewirken Folgendes:
- Sie registrieren den Routenabgleich und die Endpunktausführung in der Middlewarepipeline.
- Ersetzen Sie die -Datei des
App_Start/WebApiConfig.csProjekts.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Konfigurieren Sie Routing wie folgt:
Markieren Sie die
ProductsControllerKlasse mit den folgenden Attributen:[Route("api/[controller]")] [ApiController]Das vorherige
[Route]Attribut konfiguriert das Attributroutingmuster des Controllers. Das attribut[ApiController]macht das Attributrouting für alle Aktionen in diesem Controller erforderlich.Attributrouting unterstützt Token, z. B.
[controller]und[action]. Zur Laufzeit wird jedes Token durch den Namen des Controllers oder der Aktion ersetzt, auf den das Attribut angewendet wurde. Die Token:- Verringern Sie die Anzahl der magischen Zeichenfolgen im Projekt.
- Stellen Sie sicher, dass Routen mit den entsprechenden Controllern und Aktionen synchronisiert bleiben, wenn automatische Umbenennungen angewendet werden.
Http Get-Anforderungen an die
ProductsControllerAktionen aktivieren:- Wenden Sie das attribut
[HttpGet]auf die aktionGetAllProductsan. - Wenden Sie das attribut
[HttpGet("{id}")]auf die aktionGetProductan.
- Wenden Sie das attribut
Führen Sie das migrierte Projekt aus, und navigieren Sie zu /api/products. Es wird eine vollständige Liste mit drei Produkten angezeigt. Navigieren Sie zu /api/products/1. Das erste Produkt wird angezeigt.