Aracılığıyla paylaş


ASP.NET Web API'sinden ASP.NET Core'a geçiş

ASP.NET Core, ASP.NET 4.x'in MVC ve Web API uygulama modellerini ASP.NET Core MVC olarak bilinen tek bir programlama modelinde birleştirir.

Bu makale, ASP.NET Web API 2 ile kullanmaya başlama aşamasında oluşturulan Products denetleyicisinin ASP.NET Core'a nasıl geçirileceğini göstermektedir.

Önkoşullar

Yeni ASP.NET Core Web API projesini oluşturma

  1. Dosya menüsünden Yeni>Proje seçin.
  2. Arama kutusuna Web API'sini girin.
  3. ASP.NET Core Web API şablonunu seçin ve İleri'yi seçin.
  4. Yeni projenizi yapılandır iletişim kutusunda projeyi ProductsCore adlandırın ve İleri seçin.
  5. Ek bilgi iletişim kutusunda:
    1. Framework'in .NET 6.0 (Uzun vadeli destek)olduğunu onaylayın.
    2. Denetleyicileri kullan onay kutusunun işaretli olduğundan emin olun (Minimal API'leri kullanmak için işareti kaldırın).
    3. OpenAPI desteğini etkinleştirme seçeneğinin işaretini kaldırın.
    4. Oluştur'i seçin.

WeatherForecast şablon dosyalarını kaldırma

  1. Yeni WeatherForecast.cs projesinden Controllers/WeatherForecastController.cs ve örnek dosyalarını kaldırın.
  2. Özellikler\launchSettings.json dosyasını açın.
  3. launchUrl özelliklerini weatherforcast'den productscoreolarak değiştirin.

ASP.NET Core Web API'sinin yapılandırması

ASP.NET Core, App_Start klasörünü veya Global.asax dosyasını kullanmaz. web.config dosyası yayımlama zamanında eklenir. Daha fazla bilgi için bkz. web.config dosya.

Program.cs dosyası:

  • global.asax'i değiştirir.
  • Tüm uygulama başlatma görevlerini işler.

Daha fazla bilgi için bkz. ASP.NET Core'da Uygulama Başlatma.

Aşağıda ASP.NET Core Program.cs dosyasındaki uygulama başlatma kodu gösterilmektedir:

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

Ürün modelini kopyalama

  1. Çözüm Gezgini'da projeye sağ tıklayın. Ekle>Yeni Klasör'ü seçin. Models klasörünü adlandırın.
  2. Modelleri klasörüne sağ tıklayın. 'i seçin,>Sınıfı'i ekleyin. Sınıfı Ürün olarak adlandırın ve Ekleseçin.
  3. Şablon modeli kodunu aşağıdakilerle değiştirin:
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; }
    }
}

Yukarıdaki vurgulanan kod aşağıdakileri değiştirir:

  • ? ve Name özelliklerini null atanabilir referans türleri olarak bildirmek için Category ek açıklaması eklendi.

ASP.NET Core, C# 8 'de tanıtılanNull atanabilir özelliğini kullanarak, referans türlerinin işlenmesinde ek kod akışı analizi ve derleme zamanı güvenliği sağlayabilir. Örneğin, null referans istisnalarına karşı korunma.

Bu durumda amaç, Name ve Category türlerinin null değer alabilir olmasıdır.

.NET 6 projelerinde ASP.NET Core varsayılan olarak null atanabilir başvuru türlerini etkinleştirir. Daha fazla bilgi için bkz. Null atanabilir başvuru türleri.

ProductsController kopyala

  1. Denetleyicileri klasörüne sağ tıklayın.
  2. seçin > Denetleyicisi Ekle....
  3. Yeni İskeleli Öğe Ekle iletişim kutusunda Mvc Denetleyicisi - Boş'i ve ardından Ekle'yiseçin.
  4. Denetleyiciyi ProductsController olarak adlandırın ve Ekleseçeneğini seçin.
  5. Şablon denetleyicisi kodunu aşağıdakilerle değiştirin:
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;
    }
}

Yukarıdaki vurgulanan kod, ASP.NET Core'a geçiş yapmak için aşağıdakileri değiştirir:

  • ASP.NET Core'da mevcut olmayan aşağıdaki ASP.NET 4.x bileşenlerinin using deyimlerini kaldırır:

    • ApiController sınıfı
    • System.Web.Http ad alanı
    • IHttpActionResult arabirimi
  • using ProductsApp.Models; deyimini using ProductsCore.Models;olarak değiştirir.

  • Kök ad alanını ProductsCoreolarak ayarlar.

  • ApiControllerControllerBase'e değiştirir.

  • using Microsoft.AspNetCore.Mvc; referansı çözmek için ControllerBase ekler.

  • GetProduct eyleminin dönüş türünü IHttpActionResultActionResult<Product>olarak değiştirir. Daha fazla bilgi için bkz. Denetleyici eylemi dönüş türleri.

  • GetProduct eyleminin return deyimini aşağıdaki deyimle basitleştirir:

    return product;
    
  • Sonraki bölümlerde açıklanan aşağıdaki öznitelikleri ekler:

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

Yönlendirme

ASP.NET Core, uç nokta yönlendirme ara yazılımının bütün ara yazılım hattını sardığı minimal bir barındırma modeli sunar, bu nedenle doğrudan WebApplication'a eklenebilir ve yolları kaydetmek için açık bir UseEndpoints veya UseRouting çağrısına gerek yoktur.

UseRouting yol eşleştirmenin nerede gerçekleşeceğini belirtmek için de kullanılabilir, ancak ara yazılım işlem hattının başında yolların eşleşmesi gerekiyorsa UseRouting açıkça çağrılması gerekmez.

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

Not: doğrudan WebApplication eklenen yollar, işlem hattının sonuna geldiğinde yürütülür.

Taşınan ProductsController'da Yönlendirme

Geçirilen ProductsController aşağıdaki vurgulanmış öznitelikleri içerir:

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;
    }
}
  • [Route] özniteliği , denetleyicinin öznitelik yönlendirme düzenini yapılandırır.

  • [ApiController] özniteliği, öznitelik yönlendirmeyi bu denetleyicideki tüm eylemler için bir gereksinim haline getirir.

  • [action]belirteçleri destekler. Çalışma zamanında her belirteç, özniteliğin uygulandığı denetleyici veya eylemin adıyla değiştirilir. Jetonlar:

    • Yol için sabit kodlanmış dizeler kullanma gereksinimini azaltır veya ortadan kaldırır.
    • Otomatik yeniden adlandırma yeniden düzenlemeleri uygulandığında yolların ilgili denetleyicilerle ve eylemlerle eşitlenmiş durumda kaldığından emin olun.
  • HTTP Alma istekleri, aşağıdaki özniteliklere sahip ProductController eylemler için etkinleştirilir:

    • [HttpGet] özniteliği, GetAllProducts eylemine uygulandı.
    • [HttpGet("{id}")] özniteliği, GetProduct eylemine uygulandı.

Geçirilen projeyi çalıştırın ve /api/productsadresine gidin. Örneğin: /api/products https://localhost:<port>. Üç ürünün tam listesi görüntülenir. /api/products/1 adresine göz atın. İlk ürün ortaya çıkıyor.

Örnek kodu görüntüleme veya indirme (indirme)

Ek kaynaklar

Bu makalede, ASP.NET 4.x Web API'sinden ASP.NET Core MVC'ye geçiş için gereken adımlar gösterilmektedir.

Örnek kodu görüntüleme veya indirme (indirme)

Önkoşullar

ASP.NET 4.x Web API projesini gözden geçirme

Bu makale, ASP.NET Web API 2ile Başlarken oluşturulan ProductsApp projesini kullanır. Bu projede, temel bir ASP.NET 4.x Web API projesi aşağıdaki gibi yapılandırılır.

Global.asax.csiçinde WebApiConfig.Registeriçin bir çağrı yapılır:

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

WebApiConfig sınıfı App_Start klasöründe bulunur ve statik bir Register yöntemine sahiptir:

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

Önceki sınıf:

  • öznitelik yönlendirmesiniyapılandırıyor, ancak aslında henüz kullanılmıyor.
  • Yönlendirme tablosunu yapılandırır. Örnek kod URL'lerin /api/{controller}/{id}biçimiyle eşleşmesini ve {id} isteğe bağlı olmasını bekler.

Aşağıdaki bölümlerde, Web API projesinin ASP.NET Core MVC'ye geçişi gösterilmektedir.

Hedef projeyi oluşturma

Visual Studio'da yeni bir boş çözüm oluşturun ve geçiş için ASP.NET 4.x Web API projesini ekleyin:

  1. Dosya menüsünden Yeni>Proje seçin.
  2. Boş Çözüm şablonunu seçin ve Sonraki'yiseçin.
  3. Çözümü WebAPIMigration adlandırın. Oluştur'i seçin.
  4. Mevcut ProductsApp projesini çözüme ekleyin.

Geçiş için yeni bir API projesi ekleyin:

  1. Çözüme yeni bir ASP.NET Core Web Uygulaması projesi ekleyin.
  2. Yeni projeyi yapılandır iletişim kutusunda, projeyi ProductsCoreolarak adlandırın ve Oluştur'useçin.
  3. Yeni bir ASP.NET Core Web Uygulaması oluştur iletişim kutusunda, .NET Core ve ASP.NET Core 3.1 seçili olduğunu onaylayın. API proje şablonunu seçin ve Oluştur'u seçin.
  4. Yeni WeatherForecast.cs projesinden Controllers/WeatherForecastController.cs ve örnek dosyalarını kaldırın.

Çözüm artık iki proje içeriyor. Aşağıdaki bölümlerde, ProductsApp projesinin içeriğinin ProductsCore projesine geçirilmesi açıklanmaktadır.

Yapılandırmayı taşıma

ASP.NET Core, App_Start klasörünü veya Global.asax dosyasını kullanmaz. Ayrıca, web.config dosyası yayımlama zamanında eklenir.

Startup sınıfı:

  • global.asax'i değiştirir.
  • Tüm uygulama başlatma görevlerini işler.

Daha fazla bilgi için bkz. ASP.NET Core'da Uygulama Başlatma.

Modelleri ve denetleyicileri geçirme

Aşağıdaki kod, ASP.NET Core için güncellenmesi gereken ProductsController'ı gösterir.

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

ASP.NET Core için ProductsController güncelleştirin:

  1. Controllers/ProductsController.cs ve Modelleri klasörünü özgün projeden yenisine kopyalayın.
  2. Kopyalanan dosyaların kök ad alanını ProductsCoreolarak değiştirin.
  3. using ProductsApp.Models; deyimini using ProductsCore.Models;olarak güncelleştirin.

aşağıdaki bileşenler ASP.NET Core'da yoktur:

  • ApiController sınıfı
  • System.Web.Http ad alanı
  • IHttpActionResult arabirimi

Aşağıdaki değişiklikleri yapın:

  1. ApiController değerini ControllerBase olarak değiştirin. using Microsoft.AspNetCore.Mvc; referansını çözmek için ControllerBase ekleyin.

  2. "using System.Web.Http;'i sil."

  3. GetProduct eyleminin dönüş türünü IHttpActionResult'den ActionResult<Product>'ye değiştirin.

  4. GetProduct eyleminin return deyimini aşağıdaki şekilde basitleştirin:

    return product;
    

Yönlendirmeyi yapılandırma

ASP.NET Core API proje şablonu, oluşturulan kodda uç nokta yönlendirme yapılandırmasını içerir.

Aşağıdaki UseRouting ve UseEndpoints çağrıları:

  • orta katman işlem hattına rota eşleştirme ve uç nokta işlemlerini kaydedin.
  • ProductsApp projesinin App_Start/WebApiConfig.cs dosyasını değiştirin.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

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

Yönlendirmeyi aşağıdaki gibi yapılandırın:

  1. ProductsController sınıfını aşağıdaki özniteliklerle işaretleyin:

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

    Yukarıdaki [Route] özniteliği, denetleyicinin öznitelik yönlendirme düzenini yapılandırır. [ApiController] özniteliği, öznitelik yönlendirmeyi bu denetleyicideki tüm eylemler için bir gereksinim haline getirir.

    Öznitelik yönlendirmesi [controller] ve [action]gibi belirteçleri destekler. Çalışma zamanında her belirteç, özniteliğin uygulandığı denetleyici veya eylemin adıyla değiştirilir. Jetonlar:

    • Projedeki sihirli dizelerin sayısını azaltın.
    • Otomatik yeniden adlandırma yeniden düzenlemeleri uygulandığında yolların ilgili denetleyicilerle ve eylemlerle eşitlenmiş durumda kaldığından emin olun.
  2. ProductsController eylemlerine HTTP GET isteklerini etkinleştirin.

    • [HttpGet] eylemine GetAllProducts özniteliğini uygulayın.
    • [HttpGet("{id}")] eylemine GetProduct özniteliğini uygulayın.

Geçirilen projeyi çalıştırın ve /api/productsadresine gidin. Üç ürünün tam listesi görüntülenir. /api/products/1 adresine göz atın. İlk ürün ortaya çıkıyor.

Ek kaynaklar