Freigeben über


Migrieren von ASP.NET Web-API zu ASP.NET Core

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

Erstellen des neuen ASP.NET Core Web API-Projekts

  1. Klicken Sie im Menü Datei auf Neu>Projekt.
  2. Geben Sie Web-API in das Suchfeld ein.
  3. Wählen Sie die ASP.NET Core-Web-API-Vorlage aus, und klicken Sie auf Weiter.
  4. Geben Sie im Dialogfeld Neues Projekt konfigurieren dem Projekt den Namen ProductsCore, und wählen Sie dann Weiter aus.
  5. Im Dialogfeld Zusätzliche Informationen:
    1. Vergewissern Sie sich, dass das Framework auf .NET 6.0 (Langfristiger Support) festgelegt ist.
    2. Bestätigen Sie, dass das Kontrollkästchen für "Controller verwenden" aktiviert ist (deaktivieren, um minimale APIs zu verwenden).
    3. Deaktivieren Sie OpenAPI-Unterstützung aktivieren.
    4. Wählen Sie "Erstellen" aus.

Entfernen Sie die Vorlagendateien WeatherForecast

  1. Entfernen Sie die beispieldateien WeatherForecast.cs und Controllers/WeatherForecastController.cs aus dem neuen ProductsCore Projekt.
  2. Öffnen Sie "Eigenschaften",\launchSettings.jsaktiviert ist.
  3. Ändern Sie launchUrl Eigenschaften von weatherforcast in productscore.

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

  1. Klicken Sie im Projektmappen-Explorermit der rechten Maustaste auf das Projekt. Klicken Sie auf Hinzufügen>Neuer Ordner. Benennen Sie den Ordner Models.
  2. 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.
  3. 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 eigenschaften Name und Category als 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

  1. Klicken Sie mit der rechten Maustaste auf den Ordner Controller.
  2. Wählen Sie Hinzufügen > Controller... aus.
  3. Wählen Sie im Dialogfeld Neues Gerüstelement hinzufügen die Option MVC-Controller – leer und anschließend Hinzufügen aus.
  4. Nennen Sie den Controller ProductsController, und wählen Sie Hinzufügen aus.
  5. 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 in using ProductsCore.Models;.

  • Legt den Stammnamespace auf ProductsCorefest.

  • Ändert ApiController in ControllerBase.

  • Fügt using Microsoft.AspNetCore.Mvc; hinzu, um den ControllerBase Verweis aufzulösen.

  • Ändert den Rückgabetyp der GetProduct Aktion von IHttpActionResult in ActionResult<Product>. Weitere Informationen finden Sie unter Controller-Aktionsrückgabetypen.

  • Er vereinfacht die GetProduct-Anweisung der return-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 ProductController Aktionen mit den folgenden Attributen aktiviert:

    • [HttpGet] Attribut, das auf die aktion GetAllProducts angewendet wird.
    • [HttpGet("{id}")] Attribut, das auf die aktion GetProduct angewendet 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

Ü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:

  1. Klicken Sie im Menü Datei auf Neu>Projekt.
  2. Wählen Sie die Vorlage Leere Projektmappe und anschließend Weiter aus.
  3. Benennen Sie die Lösung WebAPIMigration. Wählen Sie "Erstellen" aus.
  4. Fügen Sie der Projektmappe das vorhandene Projekt ProductsApp hinzu.

Fügen Sie ein neues API-Projekt zum Migrieren zu:

  1. Fügen Sie der Lösung ein neues ASP.NET Core Web Application Projekt hinzu.
  2. Geben Sie im Dialogfeld "Neues Projekt konfigurieren" den Projektnamen ProductsCorean und wählen Sie "Erstellen".
  3. 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.
  4. Entfernen Sie die beispieldateien WeatherForecast.cs und Controllers/WeatherForecastController.cs aus 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:

  1. Kopieren Sie Controllers/ProductsController.cs und den Ordner Models aus dem ursprünglichen Projekt in den neuen Ordner.
  2. Ändern Sie den Stammnamespace der kopierten Dateien in ProductsCore.
  3. Aktualisieren Sie die using ProductsApp.Models;-Erklärung auf using 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:

  1. Ändern Sie ApiController in ControllerBase. Fügen Sie using Microsoft.AspNetCore.Mvc; hinzu, um den ControllerBase Verweis aufzulösen.

  2. using System.Web.Http;löschen .

  3. Ändern Sie den Rückgabetyp der GetProduct Aktion von IHttpActionResult in ActionResult<Product>.

  4. Vereinfachen Sie die GetProduct-Anweisung der return-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.cs Projekts.
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:

  1. Markieren Sie die ProductsController Klasse 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.
  2. Http Get-Anforderungen an die ProductsController Aktionen aktivieren:

    • Wenden Sie das attribut [HttpGet] auf die aktion GetAllProducts an.
    • Wenden Sie das attribut [HttpGet("{id}")] auf die aktion GetProduct an.

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.

Weitere Ressourcen