ASP.NET Framework'ten ASP.NET Core'a yükseltme

Neden en son .NET'e yükseltin?

ASP.NET Core, .NET için modern web çerçevesidir. ASP.NET Core'un .NET Framework'teki ASP.NET birçok benzerliği olsa da, tamamen yeniden yazılmış yeni bir çerçevedir. ASP.NET Core'a güncelleştirilmiş ASP.NET uygulamalar, gelişmiş performanstan ve en son web geliştirme özelliklerine ve özelliklerine erişimden yararlanabilir.

ASP.NET Framework güncelleştirme yaklaşımları

Önemsiz olmayan ASP.NET Framework uygulamalarının çoğu artımlı yükseltme yaklaşımını kullanmayı düşünmelidir. Daha fazla bilgi için bkz . ASP.NET Core yükseltmesine artımlı ASP.NET.

ASP.NET MVC ve Web API uygulamaları için bkz . ASP.NET MVC ve Web API'sinden ASP.NET Core MVC'ye yükseltmeyi öğrenme. ASP.NET Framework Web Forms uygulamaları için bkz . ASP.NET Web Forms'dan ASP.NET Core'a yükseltmeyi öğrenme.

Güvenilir web uygulaması desenleri

İster sıfırdan ister mevcut bir uygulamayı yeniden düzenleme olsun, modern, güvenilir, performanslı, test edilebilir, uygun maliyetli ve ölçeklenebilir bir ASP.NET Core uygulaması oluşturma yönergeleri için YouTube videolarınıve makalesini for.NET Güvenilir Web Uygulaması Düzeni'nebakın.

ASP.NET ile ASP.NET Core arasındaki URI kodunu çözme farklılıkları

ASP.NET Core, ASP.NET Framework ile aşağıdaki URI kod çözme farklılıklarına sahiptir:

ASCII Encoded ASP.NET Core ASP.NET Framework
\ %5C \ /
/ %2F %2F /

ASP.NET Core'da kod çözme %2F sırasında:

  • Yolun tamamı, dönüştürülmesi / yol yapısını değiştireceği için kaldırılır%2F. Yol bölümlere ayrılana kadar kodu çözülemez.

değerini oluşturmak için değerlerini yanlış yorumlamaktan kaçınmak Uri için HttpRequest.Urlkullanınnew Uri(this.AspNetCoreHttpRequest.GetEncodedUrl());.

Kullanıcı Gizli Dizilerini ASP.NET Framework'ten ASP.NET Core'a Geçirme

Bu GitHub sorununa bakın.

Bu makale, ASP.NET uygulamalarını ASP.NET Core'a geçirmek için bir başvuru kılavuzu görevi görür.

Visual Studio'da ASP.NET uygulamalarının ASP.NET Core'a geçirilmesine yardımcı olacak araçlar bulunur. Daha fazla bilgi için bkz . Visual Studio'da ASP.NET'den ASP.NET Core'a geçiş.

.NET Yükseltme Yardımcısı, ASP.NET'i ASP.NET Core'a geçirmeye yardımcı olabilecek bir komut satırı aracıdır. Daha fazla bilgi için bkz. .NET Yükseltme Yardımcısı'na Genel Bakış ve .NET Yükseltme Yardımcısı ile bir ASP.NET MVC uygulamasını .NET 6'ya yükseltme.

Kapsamlı bir taşıma kılavuzu için mevcut ASP.NET uygulamalarını .NET Core'a taşıma e-kitabına bakın.

Önkoşullar

.NET Core SDK 2.2 veya sonrası

Hedef çerçeveler

ASP.NET Core projeleri, geliştiricilere .NET Core, .NET Framework veya her ikisini birden hedefleme esnekliği sunar. Hangi hedef çerçevenin en uygun olduğunu belirlemek için, bkz. Sunucu uygulamaları için .NET Core ve .NET Framework arasında seçim yapma.

.NET Framework'ü hedeflemede projelerin ayrı NuGet paketlerine başvurması gerekir.

.NET Core'u hedefleme, ASP.NET Core meta paketi sayesinde çok sayıda açık paket başvurusunu ortadan kaldırmanıza olanak tanır. Microsoft.AspNetCore.App meta paketini projenize yükler:

<ItemGroup>
   <PackageReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

Meta paket kullanıldığında, meta pakette başvurulan hiçbir paket uygulama ile dağıtılmaz. .NET Core Runtime Store bu varlıkları içerir ve performansı artırmak için önceden derlenmiştir. Daha fazla ayrıntı için, bkz. ASP.NET Core için Microsoft.AspNetCore.App meta paketi.

Proje yapısı farklılıkları

.csproj dosya biçimi, ASP.NET Core'da basitleştirilmiştir. Bazı önemli değişiklikler şunları içerir:

  • Dosyaların açıkça dahil edilmesi, projenin bir parçası olarak kabul edilmeleri için gerekli değildir. Bu, büyük ekipler ile çalışırken XML birleştirme çakışmaları riskini azaltır.

  • Dosya okunabilirliğini artıran diğer projelere GUID tabanlı referanslar yoktur.

  • Dosya, Visual Studio'da kaldırılmadan düzenlenebilir:

    Edit CSPROJ context menu option in Visual Studio 2017]

Global.asax dosyasını değiştirme

ASP.NET Core, bir uygulamayı önyüklemek için yeni bir mekanizma sundu. ASP.NET uygulamalarının giriş noktası Global.asax dosyasıdır. Rota yapılandırması ve filtre ve alan kayıtları gibi görevler Global.asax dosyasında işlenir.

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

Bu yaklaşım, uygulamayı ve dağıtıldığı sunucuyu uygulamaya müdahale edecek şekilde birleştirir. Ayrıştırmak amacıyla, birden çok çerçeveyi birlikte kullanmanın daha temiz bir yolunu sağlamak için OWIN sunuldu. OWIN, yalnızca gerekli modülleri eklemek için bir işlem hattı sağlar. Barındırma ortamı, hizmetleri ve uygulamanın istek işlem hattını yapılandırmak için bir Başlangıç işlevi alır. Startup uygulamayla bir ara yazılım kümesi kaydeder. Her istek için, uygulama bir ara yazılım bileşeninin her birini bağlantılı listenin baş işaretçisi ile mevcut bir işleyici kümesine çağırır. Her bir ara yazılım bileşeni, istek işlem hattına bir veya daha fazla işleyici ekleyebilir. Bu, listenin yeni başlığı olan işleyiciye bir referans döndürülerek gerçekleştirilir. Her işleyici, listedeki bir sonraki işleyiciyi hatırlayıp çağırmaktan sorumludur. ASP.NET Core ile Startup bir uygulamaya giriş noktasıdır ve artık Global.asax bağımlılığınız yoktur. OWIN'i .NET Framework ile kullanırken, işlem hattı olarak aşağıdakine benzer bir şey kullanın:

using Owin;
using System.Web.Http;

namespace WebApi
{
    // Note: By default all requests go through this OWIN pipeline. Alternatively you can turn this off by adding an appSetting owin:AutomaticAppStartup with value “false”. 
    // With this turned off you can still have OWIN apps listening on specific routes by adding routes in global.asax file using MapOwinPath or MapOwinRoute extensions on RouteTable.Routes
    public class Startup
    {
        // Invoked once at startup to configure your application.
        public void Configuration(IAppBuilder builder)
        {
            HttpConfiguration config = new HttpConfiguration();
            config.Routes.MapHttpRoute("Default", "{controller}/{customerID}", new { controller = "Customer", customerID = RouteParameter.Optional });

            config.Formatters.XmlFormatter.UseXmlSerializer = true;
            config.Formatters.Remove(config.Formatters.JsonFormatter);
            // config.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;

            builder.UseWebApi(config);
        }
    }
}

Bu, varsayılan rotalarınızı yapılandırır ve varsayılan olarak Json üzerinden XmlSerialization şeklindedir. Gerektiğinde bu işlem hattına başka Ara Yazılımlar ekleyin (hizmetleri yükleme, yapılandırma ayarları, statik dosyalar vb.).

ASP.NET Core benzer bir yaklaşım kullanır, ancak girişi işlemek için OWIN'e dayanmaz. Bunun yerine, bu Program.csMain yöntemiyle yapılır (konsol uygulamalarına benzer) ve Startup oradan yüklenir.

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace WebApplication2
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}

Startup bir Configure yöntemi içermelidir. Configure içinde, gerekli ara yazılımı işlem hattına ekleyin. Aşağıdaki örnekte (varsayılan web sitesi şablonundan), uzantı yöntemleri, işlem hattını aşağıdakiler için destekle yapılandırır:

  • Hata sayfaları
  • HTTP Katı Aktarım Güvenliği
  • HTTPS'ye HTTP yönlendirmesi
  • ASP.NET Core MVC
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseMvc();
}

Ana bilgisayar ve uygulama birbirinden ayrılmıştır, bu da gelecekte farklı bir platforma geçme esnekliği sağlar.

Dekont

ASP.NET Core Başlangıç ve Ara Yazılım hakkında daha ayrıntılı bir başvuru için bkz. ASP.NET Core'da Başlangıç

Depolama yapılandırmaları

ASP.NET, depolama ayarlarını destekler. Bu ayar, örneğin, uygulamaların dağıtıldığı ortamı desteklemek için kullanılır. Yaygın bir uygulama, tüm özel anahtar/değer çiftlerini Web.config dosyasının <appSettings> bölümünde depolamaktı:

<appSettings>
  <add key="UserName" value="User" />
  <add key="Password" value="Password" />
</appSettings>

Uygulamalar, System.Configuration ad alanındaki ConfigurationManager.AppSettings koleksiyonunu kullanarak bu ayarları okur:

string userName = System.Web.Configuration.ConfigurationManager.AppSettings["UserName"];
string password = System.Web.Configuration.ConfigurationManager.AppSettings["Password"];

ASP.NET Core, uygulama için yapılandırma verilerini herhangi bir dosyada depolayabilir ve bunları ara yazılım önyüklemesinin bir parçası olarak yükleyebilir. Proje şablonlarında kullanılan varsayılan dosya appsettings.json:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "AppConfiguration": {
    "UserName": "UserName",
    "Password": "Password"
  }
}

Bu dosyayı uygulamanızın içindeki bir IConfiguration örneğine yüklemek Startup.cs içinde yapılır:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

Uygulama, ayarları almak için Configuration içinden okur:

string userName = Configuration.GetSection("AppConfiguration")["UserName"];
string password = Configuration.GetSection("AppConfiguration")["Password"];

Bu değerlerle bir hizmet yüklemek için Bağımlılık Ekleme (DI) kullanmak gibi, süreci daha sağlam hale getirmek için bu yaklaşımın uzantıları vardır. DI yaklaşımı, kesin olarak belirlenmiş bir yapılandırma nesneleri kümesi sağlar.

// Assume AppConfiguration is a class representing a strongly-typed version of AppConfiguration section
services.Configure<AppConfiguration>(Configuration.GetSection("AppConfiguration"));

Dekont

ASP.NET Core yapılandırmasına daha ayrıntılı bir başvuru için, bkz. ASP.NET Core'da Yapılandırma.

Yerel bağımlılık ekleme

Büyük, ölçeklenebilir uygulamalar oluştururken önemli bir hedef, bileşenlerin ve hizmetlerin gevşek şekilde bağlanmasıdır. Bağımlılık ekleme, bunu elde etmeye yönelik popüler bir tekniktir ve ASP.NET Core'un yerel bir bileşenidir.

ASP.NET uygulamalarında geliştiriciler, Bağımlılık Ekleme’yi uygulamak için bir üçüncü taraf kitaplığına güvenirler. Bu tür kitaplıklardan biri, Microsoft Desenleri ve Uygulamaları tarafından sağlanan Unity'dir.

Unity ile Bağımlılık Ekleme’yi ayarlamaya bir örnek, UnityContainer öğesini saran IDependencyResolver uygulamaktır:

using Microsoft.Practices.Unity;
using System;
using System.Collections.Generic;
using System.Web.Http.Dependencies;

public class UnityResolver : IDependencyResolver
{
    protected IUnityContainer container;

    public UnityResolver(IUnityContainer container)
    {
        if (container == null)
        {
            throw new ArgumentNullException("container");
        }
        this.container = container;
    }

    public object GetService(Type serviceType)
    {
        try
        {
            return container.Resolve(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return null;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return container.ResolveAll(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return new List<object>();
        }
    }

    public IDependencyScope BeginScope()
    {
        var child = container.CreateChildContainer();
        return new UnityResolver(child);
    }

    public void Dispose()
    {
        Dispose(true);
    }

    protected virtual void Dispose(bool disposing)
    {
        container.Dispose();
    }
}

UnityContainer örneğinizi oluşturun, hizmetinizi kaydedin ve HttpConfiguration için bağımlılık çözümleyicisini kapsayıcınız için yeni UnityResolver örneğine ayarlayın:

public static void Register(HttpConfiguration config)
{
    var container = new UnityContainer();
    container.RegisterType<IProductRepository, ProductRepository>(new HierarchicalLifetimeManager());
    config.DependencyResolver = new UnityResolver(container);

    // Other Web API configuration not shown.
}

Gerekli yere IProductRepository ekleme:

public class ProductsController : ApiController
{
    private IProductRepository _repository;

    public ProductsController(IProductRepository repository)  
    {
        _repository = repository;
    }

    // Other controller methods not shown.
}

Dependency Injection, ASP.NET Core'un bir parçası olduğundan, hizmetinizi Startup.cs için ConfigureServices yöntemine ekleyebilirsiniz:

public void ConfigureServices(IServiceCollection services)
{
    // Add application services.
    services.AddTransient<IProductRepository, ProductRepository>();
}

Depo, Unity'de olduğu gibi herhangi bir yere eklenebilir.

Dekont

Bağımlılık ekleme hakkında daha fazla bilgi için, bkz. Bağımlılık ekleme.

Statik dosyaları sunma

Web geliştirmenin önemli bir parçası, statik, istemci tarafı varlıklara hizmet etme özelliğidir. Statik dosyaların en yaygın örnekleri HTML, CSS, Javascript ve görüntülerdir. Bu dosyaların, uygulamanın (veya CDN'nin) yayınlanan konumuna kaydedilmesi ve bir istek tarafından yüklenebilmeleri için referans verilmesi gerekir. Bu işlem ASP.NET Core değişmiştir.

ASP.NET'te statik dosyalar çeşitli dizinlerde depolanır ve görünümlerde başvurulur.

ASP.NET Core'da statik dosyalar, aksi yapılandırılmadığı sürece "web kökünde" (<içerik kökü>/wwwroot) depolanır. Dosyalar, Startup.Configure öğesinden UseStaticFiles uzantısı yöntemi çağrılarak istek işlem hattına yüklenir:

Dekont

.NET Framework hedefliyorsanız, Microsoft.AspNetCore.StaticFiles NuGet paketini yüklemelisiniz.

Örneğin, wwwroot/images klasöründe bir görüntü varsa tarayıcı, http://<app>/images/<imageFileName> gibi bir konumdan erişilebilir.

Dekont

ASP.NET Core'da statik dosyalar sunmaya ilişkin daha ayrıntılı bir başvuru için, bkz. Statik dosyalar.

Çoklu değer cookie değerleridir

Çoklu değer cookie değerleri ASP.NET Core’da desteklenmez. Değer başına bir cookie oluşturun.

Kimlik doğrulaması cookie değerleri ASP.NET Core'da sıkıştırılmaz

Güvenlik nedeniyle, kimlik doğrulaması cookie değerleri ASP.NET Core'da sıkıştırılmaz. Kimlik doğrulaması cookie değerlerini kullanırken geliştiriciler, dahil edilen istek bilgilerinin sayısını, ihtiyaçları için gerekli olan değere kadar en aza indirmelidir.

Kısmi uygulama geçişi

Kısmi uygulama geçişine yönelik bir yaklaşım, bir IIS alt uygulaması oluşturmak ve uygulamanın URL yapısını korurken yalnızca belirli yolları ASP.NET 4.x'ten ASP.NET Core'a taşımaktır. Örneğin, applicationHost.config dosyasındaki uygulamanın URL yapısını göz önünde bulundurun:

<sites>
    <site name="Default Web Site" id="1" serverAutoStart="true">
        <application path="/">
            <virtualDirectory path="/" physicalPath="D:\sites\MainSite\" />
        </application>
        <application path="/api" applicationPool="DefaultAppPool">
            <virtualDirectory path="/" physicalPath="D:\sites\netcoreapi" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:80:" />
            <binding protocol="https" bindingInformation="*:443:" sslFlags="0" />
        </bindings>
    </site>
	...
</sites>

Dizin yapısı:

.
├── MainSite
│   ├── ...
│   └── Web.config
└── NetCoreApi
    ├── ...
    └── web.config

[BIND] ve Giriş Biçimlendiriciler

ASP.NET’in önceki sürümleri aşırı gönderme saldırılarına karşı korumak için [Bind] özelliğini kullandı. Giriş biçimlendiriciler ASP.NET Core’da farklı çalışır. [Bind] özelliği, JSON veya XML'i ayrıştırmak için giriş biçimlendiricileri ile kullanıldığında artık aşırı gönderimi önlemek için tasarlanmamıştır. Bu öznitelikler, veri kaynağı x-www-form-urlencoded içerik türüyle gönderilen form verileri olduğunda model bağlamayı etkiler.

JSON bilgilerini denetleyicilere gönderen ve verileri ayrıştırmak için JSON Giriş Biçimlendiricilerini kullanan uygulamalar için, [Bind] özniteliğini [Bind] özniteliği tarafından tanımlanan özelliklerle eşleşen bir görünüm modeliyle değiştirmenizi öneririz.

Ek kaynaklar