ASP.NET Core 2,2 ' den 3,0 ' e geçiş yapın

Scott Ade ve Rick Anderson tarafından

bu makalede, mevcut bir ASP.NET Core 2,2 projesinin ASP.NET Core 3,0 ' e nasıl güncelleştirilmesi açıklanmaktadır. yeni bir ASP.NET Core 3,0 projesi oluşturmak yararlı olabilir:

  • ASP.NET Core 2,2 kodla karşılaştırın.
  • ilgili değişiklikleri ASP.NET Core 3,0 projenize kopyalayın.

Önkoşullar

global.jsüzerinde .NET Core SDK sürümü Güncelleştir

Çözümünüz belirli bir .NET Core SDK sürümünü hedeflemek için dosyadaki bir global.js kullanıyorsa, version özelliğini makinenizde yüklü 3,0 sürümü olarak güncelleştirin:

{
  "sdk": {
    "version": "3.0.100"
  }
}

Proje dosyasını güncelleştirme

Hedef çerçeveyi güncelleştirme

ASP.NET Core 3,0 ve üzeri yalnızca .net Core üzerinde çalışır. Hedef Framework bilinen adını (tfd) şu şekilde ayarlayın netcoreapp3.0 :

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

</Project>

Kullanımdan kaldırılmış paket başvurularını kaldır

ASP.NET Core 3,0 için çok sayıda NuGet paketi üretilmez. Bu tür paket başvuruları proje dosyasından kaldırılmalıdır. ASP.NET Core 2,2 web uygulaması için aşağıdaki proje dosyasını göz önünde bulundurun:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App"/>
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
  </ItemGroup>

</Project>

ASP.NET Core 3,0 için güncelleştirilmiş proje dosyası:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

</Project>

güncelleştirilmiş ASP.NET Core 3,0 proje dosyası:

  • İçinde <PropertyGroup> :

    • TFD 'yi güncelleştirme netcoreapp3.0
    • Öğeyi kaldırır <AspNetCoreHostingModel> . Daha fazla bilgi için bu belgede Işlem içi barındırma modeli konusuna bakın.
  • İçinde <ItemGroup> :

    • Microsoft.AspNetCore.App kaldırılır. Daha fazla bilgi için bu belgede Framework başvurusu bölümüne bakın.
    • Microsoft.AspNetCore.Razor.Design kaldırılır ve aşağıdaki paket listesinde artık üretilmez.

Artık üretilmeyen paketlerin tam listesini görmek için aşağıdaki Genişlet listesini seçin:

Artık üretilmeyen paketlerin listesini genişletmek için tıklayın
  • Microsoft.AspNetCore
  • Microsoft.AspNetCore.All
  • Microsoft.AspNetCore.App
  • Microsoft.AspNetCore.Antiforgery
  • Microsoft.AspNetCore.Authentication
  • Microsoft.AspNetCore.Authentication.Abstractions
  • Microsoft. AspNetCore. Authentication. Cookie malar
  • Microsoft.AspNetCore.Authentication.Core
  • Microsoft.AspNetCore.Authentication.OAuth
  • Microsoft.AspNetCore.Authorization.Policy
  • Microsoft. AspNetCore. Cookie İlkesinin
  • Microsoft.AspNetCore.Cors
  • Microsoft.AspNetCore.Diagnostics
  • Microsoft.AspNetCore.Diagnostics.HealthChecks
  • Microsoft.AspNetCore.HostFiltering
  • Microsoft.AspNetCore.Hosting
  • Microsoft.AspNetCore.Hosting.Abstractions
  • Microsoft.AspNetCore.Hosting.Server.Abstractions
  • Microsoft.AspNetCore.Http
  • Microsoft.AspNetCore.Http.Abstractions
  • Microsoft.AspNetCore.Http.Connections
  • Microsoft.AspNetCore.Http.Extensions
  • Microsoft.AspNetCore.HttpOverrides
  • Microsoft.AspNetCore.HttpsPolicy
  • Microsoft. AspNetCore.Identity
  • Microsoft.AspNetCore.Localization
  • Microsoft.AspNetCore.Localization.Routing
  • Microsoft.AspNetCore.Mvc
  • Microsoft.AspNetCore.Mvc.Abstractions
  • Microsoft.AspNetCore.Mvc.Analyzers
  • Microsoft.AspNetCore.Mvc.ApiExplorer
  • Microsoft.AspNetCore.Mvc.Api.Analyzers
  • Microsoft.AspNetCore.Mvc.Core
  • Microsoft.AspNetCore.Mvc.Cors
  • Microsoft.AspNetCore.Mvc.DataAnnotations
  • Microsoft.AspNetCore.Mvc.Formatters.Json
  • Microsoft.AspNetCore.Mvc.Formatters.Xml
  • Microsoft.AspNetCore.Mvc.Localization
  • Microsoft. AspNetCore. Mvc.Razor
  • Microsoft. AspNetCore. Mvc. Razor . ViewCompilation
  • Microsoft. AspNetCore. Mvc. Razor Sayfaları
  • Microsoft.AspNetCore.Mvc.TagHelpers
  • Microsoft.AspNetCore.Mvc.ViewFeatures
  • Microsoft. AspNetCore.Razor
  • Microsoft. AspNetCore. Razor . Çalışma zamanı
  • Microsoft. AspNetCore. Razor . Tasarıma
  • Microsoft.AspNetCore.ResponseCaching
  • Microsoft.AspNetCore.ResponseCaching.Abstractions
  • Microsoft.AspNetCore.ResponseCompression
  • Microsoft.AspNetCore.Rewrite
  • Microsoft.AspNetCore.Routing
  • Microsoft.AspNetCore.Routing.Abstractions
  • Microsoft.AspNetCore.Server.HttpSys
  • Microsoft.AspNetCore.Server.IIS
  • Microsoft.AspNetCore.Server.IISIntegration
  • Microsoft. AspNetCore. Server.Kestrel
  • Microsoft. AspNetCore. Server. Kestrel . Çekirdeğin
  • Microsoft. AspNetCore. Server. Kestrel . 'Dir
  • Microsoft. AspNetCore. Server. Kestrel . Taşıma. soyutlamalar
  • Microsoft. AspNetCore. Server. Kestrel . Transport. Sockets
  • Microsoft.AspNetCore.Session
  • Microsoft. AspNetCore.SignalR
  • Microsoft. AspNetCore. SignalR . Çekirdeğin
  • Microsoft.AspNetCore.StaticFiles
  • Microsoft.AspNetCore.WebSockets
  • Microsoft.AspNetCore.WebUtilities
  • Microsoft.Net.Http.Headers

Yeni değişiklikleri gözden geçirme

Yeni değişiklikleri gözden geçirme

Çerçeve başvurusu

Yukarıda ASP.NET Core paketlerden biri aracılığıyla kullanılabilen diğer özelliklerin özellikleri paylaşılan çerçevenin bir Microsoft.AspNetCore.App parçası olarak kullanılabilir. Paylaşılan çerçeve, makineye yüklenmiş ve bir çalışma zamanı bileşeni ve bir hedefleme paketi içeren derlemeler kümesidir (.dlldosyaları). Daha fazla bilgi için bkz. Paylaşılan çerçeve.

  • SDK'yı Microsoft.NET.Sdk.Web hedef alan projeler çerçeveye örtülü olarak Microsoft.AspNetCore.App başvurur.

    Bu projeler için ek başvuru gerekmez:

    <Project Sdk="Microsoft.NET.Sdk.Web">
      <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
      </PropertyGroup>
        ...
    </Project>
    
  • veya Microsoft.NET.Sdk Microsoft.NET.Sdk.Razor SDK'yı hedef alan projeler için açık FrameworkReference Microsoft.AspNetCore.App eklemeli:

    <Project Sdk="Microsoft.NET.Sdk.Razor">
      <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <FrameworkReference Include="Microsoft.AspNetCore.App" />
      </ItemGroup>
        ...
    </Project>
    

Docker kullanan çerçeveye bağımlı derlemeler

Paylaşılan çerçeveye bağlı bir paket kullanan konsol uygulamalarının çerçeveye bağımlı derlemeleri ASP.NET Core çalışma zamanı hatasına neden olabilir:

It was not possible to find any compatible framework version
The specified framework 'Microsoft.AspNetCore.App', version '3.0.0' was not found.
  - No frameworks were found.

Microsoft.AspNetCore.App, çalışma zamanı ASP.NET Core paylaşılan çerçevedir ve yalnızca dotnet/core/aspnet Docker görüntüsünde mevcuttur. 3.0 SDK, paylaşılan çerçevede kullanılabilir kitaplıkların yinelenen kopyalarını dahil ASP.NET Core kullanarak çerçeveye bağımlı derlemelerin boyutunu azaltır. Bu, 18 MB'a kadar olası bir tasarruf sağlar, ancak uygulamayı çalıştırmak için ASP.NET Core çalışma zamanının mevcut / yüklü olması gerekir.

Uygulamanın paylaşılan çerçevede bağımlılık (doğrudan veya dolaylı) ASP.NET Core belirlemek için, runtimeconfig.js derleme/yayımlama sırasında oluşturulan dosyada yer alanruntimeconfig.jsdosyasını inceleme. Aşağıdaki JSON dosyası, paylaşılan çerçevenin ASP.NET Core gösterir:

{
  "runtimeOptions": {
    "tfm": "netcoreapp3.0",
    "framework": {
      "name": "Microsoft.AspNetCore.App",
      "version": "3.0.0"
    },
    "configProperties": {
      "System.GC.Server": true
    }
  }
}

Uygulamanız Docker kullanıyorsa, 3.0'ı ASP.NET Core temel bir görüntü kullanın. Örneğin, docker pull mcr.microsoft.com/dotnet/core/aspnet:3.0.

Kaldırılan derlemeler için paket başvuruları ekleme

ASP.NET Core 3.0, paket başvurusunda daha önce yer alan bazı Microsoft.AspNetCore.App derlemeleri kaldırır. Hangi derlemelerin kaldırılmış olduğunu görselleştirmek için iki paylaşılan çerçeve klasörünü karşılaştırın. Örneğin, 2.2.7 ve 3.0.0 sürümlerinin karşılaştırması:

paylaşılan çerçeve derlemeleri karşılaştırması

Kaldırılan derlemeler tarafından sağlanan özellikleri kullanmaya devam etmek için ilgili paketlerin 3.0 sürümlerine bakın:

Başlangıç değişiklikleri

Aşağıdaki görüntüde, ASP.NET Core 2.2 Pages Web uygulamasında silinen Razor ve değiştirilen satırlar yer almaktadır:

bir ASP.NET Core 2.2 Razor Web uygulamasında silinen ve değiştirilen satırlar

Yukarıdaki görüntüde silinen kod kırmızı renkle gösterilmiştir. Silinen kod, dosyaları cookie karşılaştırmadan önce silinmiş olan seçenek kodunu göstermez.

Aşağıdaki görüntüde, ASP.NET Core 3.0 Pages Web uygulamasında eklenen ve Razor değiştirilen satırlar görüntülenmiştir:

bir 3.0 ASP.NET Core :no-loc(Razor)::: Web uygulamasında eklenen ve değiştirilen satırlar

Yukarıdaki görüntüde eklenen kod yeşil renkle gösterilmiştir. Aşağıdaki değişiklikler hakkında bilgi için:

Çözümleyici desteği

Daha önce Microsoft.NET.Sdk.Web Microsoft.AspNetCore.Mvc.Analyzers paketinin bir parçası olarak gönderilen örtülü başvuru çözümleyicilerini hedef alan projeler. Bunları etkinleştirmek için ek başvuru gerekmez.

Uygulamanız daha önce Microsoft.AspNetCore.Mvc.Api.Analyzers paketi kullanılarak gönderilen API çözümleyicilerini kullanıyorsa, proje dosyanızı .NET Core Web SDK'sı kapsamında gönderilen çözümleyicilere başvuracak şekilde düzenleyin:

<Project Sdk="Microsoft.NET.Sdk.Web">
    <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <IncludeOpenAPIAnalyzers>true</IncludeOpenAPIAnalyzers>
    </PropertyGroup>

    ...
</Project>

Razor Sınıf Kitaplığı

Razor MVC için kullanıcı arabirimi bileşenleri sağlayan Sınıf Kitaplığı projelerinin proje AddRazorSupportForMvc dosyasında özelliğini ayarlaması gerekir:

<PropertyGroup>
  <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>

İşlem içinde barındırma modeli

Projeler, ASP.NET Core 3.0 veya sonraki bir ASP.NET Core işlem için barındırma modelini varsayılan olarak kullanır. değeri ise, <AspNetCoreHostingModel> isteğe bağlı olarak proje dosyasındaki özelliğini kaldırabilirsiniz. InProcess

Kestrel

Yapılandırma

Tarafından Kestrel sağlanan web ana bilgisayar oluşturucusu için yapılandırmayı geçirme ( ConfigureWebHostDefaults Program.cs):

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(serverOptions =>
            {
                // Set properties and call methods on options
            })
            .UseStartup<Startup>();
        });

Uygulama, yerine ile konak ConfigureWebHost ConfigureWebHostDefaults oluşturursa, web ana bilgisayar UseKestrel oluşturucus üzerinde çağrısı yapabilirsiniz:

public static void Main(string[] args)
{
    var host = new HostBuilder()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureWebHost(webBuilder =>
        {
            webBuilder.UseKestrel(serverOptions =>
            {
                // Set properties and call methods on options
            })
            .UseIISIntegration()
            .UseStartup<Startup>();
        })
        .Build();

    host.Run();
}

Bağlantı Ara Yazılımı, Bağlantı Bağdaştırıcıları'nın yerini alıyor

Bağlantı Bağdaştırıcıları ( Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal.IConnectionAdapter ) 'den Kestrel kaldırıldı. Bağlantı Bağdaştırıcılarını Bağlantı Ara Yazılımı ile değiştirin. Bağlantı Ara Yazılımı, bağlantı hattında http ara yazılımına ASP.NET Core alt düzey bağlantılar için kullanılır. HTTPS ve bağlantı günlüğü:

  • Bağlantı Bağdaştırıcılarından Bağlantı Ara Yazılımına taşındı.
  • Bu uzantı yöntemleri, önceki sürümlerde olduğu gibi ASP.NET Core.

Daha fazla bilgi için makalenin ListenOptions.Protocols bölümündeki TlsFilterConnectionHandler örneğine Kestrel bakın.

Taşıma soyutlamaları taşındı ve genel yapıldı

Aktarım Kestrel katmanı içinde genel arabirim olarak ortaya Connections.Abstractions çıktı. Bu güncelleştirmelerin bir parçası olarak:

  • Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions ve ilişkili türler kaldırıldı.
  • NoDelay taşıma ListenOptions seçeneklerine taşındı.
  • Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.Internal.SchedulingMode , 'den KestrelServerOptions kaldırıldı.

Daha fazla bilgi için aşağıdaki kaynak GitHub bakın:

Kestrel Tanıtım üst bilgileri isteği

Önceki sürümlerini hedef alan uygulamalar için ASP.NET Core:

  • Kestrel http/1.1 öbekli tanıtım üst bilgilerini istek üst bilgileri koleksiyonuna ekler.
  • İstek gövdesi en sona okunduktan sonra tanıtımlar kullanılabilir.

Bu, üst bilgiler ve fragmanlar arasındaki belirsizlikle ilgili bazı endişelere neden olur. Bu nedenle, RequestTrailerExtensions 3.0'da tırlar yeni bir koleksiyona ( ) taşındı.

HTTP/2 istek tanıtımları:

  • ASP.NET Core 2.2'de kullanılamaz.
  • olarak 3.0'da RequestTrailerExtensions kullanılabilir.

Bu tanıtımlara erişmek için yeni istek uzantısı yöntemleri mevcuttur. HTTP/1.1'de olduğu gibi, istek gövdesi sona okunduktan sonra tanıtımlar kullanılabilir.

3.0 sürümü için aşağıdaki RequestTrailerExtensions yöntemler kullanılabilir:

  • GetDeclaredTrailers: Gövdeden sonra Trailer hangi tanıtımların beklediğinizi listeleten istek üst bilgilerini alır.
  • SupportsTrailers: İsteğin, tanıtım üst bilgilerini almayı destekleyip desteklemey aldığını gösterir.
  • CheckTrailersAvailable: İsteğin tanıtımları destekleyip desteklemediylerini ve okunabilir olup olduklarını denetler. Bu denetim, okunan tanıtımların olduğunu varsaymaz. Bu yöntem tarafından döndürülse bile okunan true bir tanıtım olabilir.
  • GetTrailer: Yanıttan istenen sondaki üst bilgiyi alır. çağrısından önce kontrol edin veya istek sondaki üst bilgileri SupportsTrailers GetTrailer NotSupportedException desteklemezse bir oluşabilir.

Daha fazla bilgi için bkz. İstek tanıtımlarını ayrı bir koleksiyona (dotnet/AspNetCore #10410) koyma.

AllowSynchronousIO devre dışı

AllowSynchronousIO , ve gibi zaman uyumlu I/O API'lerini etkinleştiriyor veya HttpRequest.Body.Read devre HttpResponse.Body.Write dışı Stream.Flush bırakıyor. Bu API'ler uygulama kilitlenmelerinin yol aç olduğu bir iş parçacığı kaynağıdır. 3.0'da AllowSynchronousIO varsayılan olarak devre dışıdır. Daha fazla bilgi için makalenin Zaman Uyumlu I/O bölümüne Kestrel bakın.

Zaman uyumlu bir I/O gerekli ise, kullanılan sunucuda seçeneği yapılandırarak AllowSynchronousIO etkinleştirilebilir ConfigureKestrel (örneğin, Kestrel kullanılıyorsa) çağrılır. Sunucuların ( Kestrel , HttpSys, TestServer vb.) diğer sunucuları etkilemeyebilirsiniz. AllowSynchronousIO Zaman uyumlu I/O seçeneği kullanılarak istek başına tüm sunucular için IHttpBodyControlFeature.AllowSynchronousIO etkinleştirilebilir:

var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();

if (syncIOFeature != null)
{
    syncIOFeature.AllowSynchronousIO = true;
}

Dispose içinde zaman uyumlu API'leri çağıran uygulamalar veya diğer akışlarla ilgili sorun TextWriter varsa, bunun yerine yeni DisposeAsync API'yi çağırabilirsiniz.

Daha fazla bilgi için bkz. [Duyuru] AllowSynchronousIO tüm sunucularda devre dışı bırakıldı (dotnet/AspNetCore #7644).

Çıkış biçimlendiren arabelleğe alma

Newtonsoft.Js,ve XmlSerializer tabanlı DataContractSerializer çıkış biçimlendirenler yalnızca zaman uyumlu serileştirmeyi destekler. MVC, bu biçimlendirenlerin sunucunun AllowSynchronousIO kısıtlamalarıyla çalışmasına izin vermek için diske yazmadan önce bu biçimlendirenlerin çıkışını arabelleğe verir. Arabelleğe alma sonucunda MVC, bu biçimlendirenleri kullanarak yanıt verirken Content-Length üst bilgilerini içerir.

System.Text.Json zaman uyumsuz serileştirmeyi destekler ve bunun sonucunda System.Text.Json tabanlı biçimlendirıcı arabelleğe almaz. Gelişmiş performans için bu biçimlendirıcıyı kullanmayı göz önünde bulundurabilirsiniz.

Uygulamalar arabelleğe alma özelliğini devre dışı bırakmak için SuppressOutputFormatterBuffering başlangıçta şunları yapılandırabilirsiniz:

services.AddControllers(options => options.SuppressOutputFormatterBuffering = true)

Bunun, uygulamanın yapılandırılmamışsa bir çalışma zamanı özel durumuna AllowSynchronousIO neden olduğunu unutmayın.

Microsoft.AspNetCore.Server. Kestrel . Https derlemesi kaldırıldı

2.1 ASP.NET Core de, Microsoft.AspNetCore.Server. Kestrel.Https.dll içeriği Microsoft.AspNetCore.Server. Kestrel.Core.dll.. Bu, öznitelikleri kullanan, yeni bir TypeForwardedTo güncelleştirmedir. 3.0 için boş Microsoft.AspNetCore.Server. Kestrel.Https.dll derlemesi ve NuGet paketi kaldırıldı.

Microsoft.AspNetCore.Server'a başvuran kitaplıklar. Kestrel . Https, ASP.NET Core 2.1 veya sonraki bir güncelleştirmesi gerekir.

ASP.NET Core 2.1 veya sonraki bir sürümü hedef alan uygulamalar ve kitaplıklar, Microsoft.AspNetCore.Server'a yönelik doğrudan başvuruları kaldırmalı. Kestrel . Https paketi.

Newtonsoft.Js(Json.NET) desteği

ASP.NET Core paylaşılan çerçevesini geliştirmeyeNewtonsoft.Jsçalışması kapsamında ,Newtonsoft.Js(Json.NET) paylaşılan çerçeveden ASP.NET Core kaldırılmıştır.

ASP.NET Core için varsayılan JSON seri hale getiricisi artık System.Text.Json .NET Core 3.0'da yeni olan 'tır. Mümkün olduğunda System.Text.Json kullanmayı göz önünde bulundurarak. Yüksek performanslıdır ve ek bir kitaplık bağımlılığı gerektirmez. Ancak, System.Text.Json yeni olduğu için, şu anda uygulamanıza gereken özellikler eksik olabilir. Daha fazla bilgi için bkz. Newtonsoft.Js'den System.Text.Js.

ASP.NET Core 3.0 projesinde Newtonsoft.Js'i SignalR kullanma

  • Microsoft.AspNetCore.'u yükleyin. SignalR . Protocols.NewtonsoftJson NuGet paketi.

  • İstemcide, bir yöntem AddNewtonsoftJsonProtocol çağrısını örneğine HubConnectionBuilder zincirleme:

    new HubConnectionBuilder()
        .WithUrl("/chathub")
        .AddNewtonsoftJsonProtocol(...)
        .Build();
    
  • sunucusunda, içinde yöntem AddNewtonsoftJsonProtocol çağrısına bir AddSignalR yöntem çağrısı Startup.ConfigureServices zincirleme:

    services.AddSignalR()
        .AddNewtonsoftJsonProtocol(...);
    

ASP.NET Core 3.0 MVC projesinde Newtonsoft.Js'yi kullanma

  • Paketini Microsoft.AspNetCore.Mvc.NewtonsoftJson yükleyin.

  • çağrısı Startup.ConfigureServices yapmak için AddNewtonsoftJson güncelleştirin.

    services.AddMvc()
        .AddNewtonsoftJson();
    

    AddNewtonsoftJson yeni MVC hizmeti kayıt yöntemleriyle uyumludur:

    • AddRazorPages
    • AddControllersWithViews
    • AddControllers
    services.AddControllers()
        .AddNewtonsoftJson();
    

    Newtonsoft.Json ayarları çağrısında ayar AddNewtonsoftJson olabilir:

    services.AddMvc()
        .AddNewtonsoftJson(options =>
               options.SerializerSettings.ContractResolver =
                  new CamelCasePropertyNamesContractResolver());
    

    Not: yöntemi AddNewtonsoftJson kullanılamıyorsa paketin yüklü olduğundan emin Microsoft.AspNetCore.Mvc.NewtonsoftJson olun. Sık karşılaşılan bir hata, Newtonsoft.Jsyerine pakete Microsoft.AspNetCore.Mvc.NewtonsoftJson yüklemektir.

Daha fazla bilgi için bkz. Newtonsoft.Jstabanlı JSON biçimi desteği ekleme.

MVC hizmeti kaydı

ASP.NET Core 3.0, içinde MVC senaryolarını kaydetmek için yeni seçenekler Startup.ConfigureServices ekler.

üzerinde MVC senaryolarıyla ilgili üç yeni üst düzey genişletme IServiceCollection yöntemi mevcuttur. Şablonlar yerine bu yeni yöntemleri AddMvc kullanır. Ancak, AddMvc önceki sürümlerde olduğu gibi davranmaya devam eder.

Aşağıdaki örnek denetleyiciler ve API ile ilgili özellikler için destek ekler, ancak görünümler veya sayfalar için destek eklemez. API şablonu şu kodu kullanır:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
}

Aşağıdaki örnek denetleyiciler, API ile ilgili özellikler ve görünümler için destek ekler, ancak sayfalar için destek eklemez. Web Uygulaması (MVC) şablonu şu kodu kullanır:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
}

Aşağıdaki örnek, Sayfalar ve minimum Razor denetleyici desteği için destek ekler. Web Uygulaması şablonu şu kodu kullanır:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
}

Yeni yöntemler de birleştirilmiş olabilir. Aşağıdaki örnek, AddMvc 2.2'de ASP.NET Core eşdeğerdir:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();
}

Yönlendirme başlangıç kodu

Bir uygulama veya UseMvc çağrısında UseSignalR bulundursa, mümkünse uygulamayı Uç Nokta Yönlendirme'ye geçirebilirsiniz. Önceki MVC sürümleriyle Endpoint Routing uyumluluğunu geliştirmek için, ASP.NET Core 2.2'de tanıtmış olan URL oluşturma değişikliklerini geri döndürmüştük. 2.2'de Uç Nokta Yönlendirmeyi kullanırken sorun yaşadıysanız, aşağıdaki özel durumlar dışında ASP.NET Core 3.0'da geliştirmeler beklersiniz:

Uç Nokta Yönlendirme, ile aynı yol deseni söz dizimi ve yol deseni yazma özelliklerini IRouter destekler. Uç Nokta Yönlendirme desteği IRouteConstraint sağlar. Uç nokta [Route] yönlendirmesi [HttpGet] , ve diğer MVC yönlendirme özniteliklerini destekler.

Çoğu uygulama için yalnızca Startup değişiklik gerekir.

Geçiş Startup.Configure

Genel öneri:

  • UseRoutingekleyin.

  • Uygulama çağrısında UseStaticFiles bulundurarak önce UseStaticFiles yerine bir yer açın. UseRouting

  • Uygulama veya gibi kimlik doğrulaması/yetkilendirme özellikleri kullanıyorsa, ve : çağrısını , ve 'den AuthorizePage [Authorize] sonra ancak UseAuthentication UseAuthorization UseRouting UseCors öncesine yer UseEndpoints edin:

    public void Configure(IApplicationBuilder app)
    {
      ...
    
      app.UseStaticFiles();
    
      app.UseRouting();
      app.UseCors();
    
      app.UseAuthentication();
      app.UseAuthorization();
    
      app.UseEndpoints(endpoints => {
         endpoints.MapControllers();
      });
    
  • veya UseMvc yerine UseSignalR . UseEndpoints

  • Uygulama gibi CORS senaryolarını kullanıyorsa, çağrısını CORS kullanan başka bir ara yazılımdan [EnableCors] önce (örneğin, , ve UseCors UseCors öncesinde) UseAuthentication yerine yer UseAuthorization UseEndpoints alır.

  • yerine IHostingEnvironment ad alanı için bir deyimi IWebHostEnvironment using Microsoft.Extensions.Hosting ekleyin.

  • yerine IApplicationLifetime IHostApplicationLifetime ( ad Microsoft.Extensions.Hosting alanı) ekleyin.

  • yerine EnvironmentName Environments ( ad Microsoft.Extensions.Hosting alanı) ekleyin.

Aşağıdaki kod, tipik bir ASP.NET Core Startup.Configure 2.2 uygulamasındaki bir örneğidir:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseStaticFiles();

    app.UseAuthentication();

    app.UseSignalR(hubs =>
    {
        hubs.MapHub<ChatHub>("/chat");
    });

    app.UseMvc(routes =>
    {
        routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
    });
}

Önceki kodu güncelleştirdikten Startup.Configure sonra:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseStaticFiles();

    app.UseRouting();

    app.UseCors();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chat");
        endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
    });
}

Uyarı

Çoğu uygulama için, UseAuthentication etkili olması için ve çağrıları arasında , ve çağrıları görün UseAuthorization UseCors UseRouting UseEndpoints gerekir.

Sistem durumu denetimleri

Sistem Durumu Denetimleri, Genel Ana Bilgisayar ile uç nokta yönlendirmeyi kullanır. içinde, Startup.ConfigureMapHealthChecks nokta URL'si veya göreli yolu ile uç nokta oluşturucusu üzerinde çağrısı:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health");
});

Sistem Durumu Denetimleri uç noktaları şunları sağlar:

  • İzin verilen bir veya daha fazla konak/bağlantı noktası belirtin.
  • Yetkilendirme gerektir.
  • CORS gerektir.

Daha fazla bilgi için bkz. ASP.NET Core'da sistem durumu denetimleri.

Güvenlik ara yazılımı kılavuzu

Yetkilendirme ve CORS desteği, ara yazılım yaklaşımı etrafında birleştirilmiştir. Bu, bu senaryolarda aynı ara yazılımların ve işlevlerin kullanımına olanak sağlar. Bu sürümde güncelleştirilmiş yetkilendirme ara yazılımı sağlanmıştır ve CORS Ara Yazılımı, MVC denetleyicileri tarafından kullanılan öznitelikleri anlayacaktır.

CORS

Daha önce CORS yapılandırması zor olabilir. Ara yazılım bazı kullanım durumlarında kullanılmak üzere sağlandı, ancak MVC filtrelerinin diğer kullanım durumlarında ara yazılım olmadan kullanılması amaçlandı. ASP.NET Core 3,0 ile, cors gerektiren tüm uygulamaların, uç nokta yönlendirme ile birlikte cors ara yazılımını kullanması önerilir. UseCors , varsayılan bir ilkeyle ve [EnableCors] [DisableCors] gerekli olduğunda varsayılan ilkeyi geçersiz kılmak için öznitelikler kullanılabilir.

Aşağıdaki örnekte:

  • CORS, adlandırılmış ilkeye sahip tüm uç noktalar için etkinleştirilmiştir default .
  • MyControllerSınıfı, CORS 'yi özniteliğiyle devre dışı bırakır [DisableCors] .
public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseCors("default");

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

[DisableCors]
public class MyController : ControllerBase
{
    ...
}

Yetkilendirme

ASP.NET Core önceki sürümlerinde, yetkilendirme desteği özniteliği aracılığıyla sağlandı [Authorize] . Yetkilendirme ara yazılımı kullanılamıyor. ASP.NET Core 3,0 ' de, yetkilendirme ara yazılımı gereklidir. ASP.NET Core yetkilendirmesi ara yazılımını ( UseAuthorization ) hemen sonra yerleştirmenizi öneririz UseAuthentication . Yetkilendirme ara yazılımı, geçersiz kılınabilen varsayılan ilkeyle de yapılandırılabilir.

ASP.NET Core 3,0 veya üzeri sürümlerde ' de UseAuthorization çağrılır Startup.Configure ve aşağıdakiler HomeController oturum açmış bir kullanıcı gerektirir:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

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

public class HomeController : Controller
{
    [Authorize]
    public IActionResult BuyWidgets()
    {
        ...
    }
}

Endpoint Routing kullanırken, AuthorizeFilter Yetkilendirme ara yazılımını yapılandırmak ve bunun yerine güvenmek önerilir. Uygulama, AuthorizeFilter MVC 'de genel bir filtre olarak kullanıyorsa, çağrısına bir ilke sağlamak için kodu yeniden düzenlemeyi öneririz AddAuthorization .

DefaultPolicyBaşlangıçta kimlik doğrulaması gerektirecek şekilde yapılandırıldığında, ek yapılandırma gerekmez. Aşağıdaki örnekte, MVC uç noktaları RequireAuthorization , tüm isteklerin öğesine göre yetkilendirilmiş olması için olarak işaretlenir DefaultPolicy . Bununla birlikte, HomeController Kullanıcı uygulamada oturum açmadan erişime izin verir, çünkü [AllowAnonymous] :

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute().RequireAuthorization();
    });
}

[AllowAnonymous]
public class HomeController : Controller
{
    ...
}

Belirli uç noktalar için yetkilendirme

Yetkilendirme, belirli uç nokta sınıfları için de yapılandırılabilir. Aşağıdaki kod, AuthorizeFilter yetkilendirme gerektiren belirli bir ilkeye sahip bir uygulamaya küresel olarak yapılandırılmış BIR MVC uygulamasını dönüştürme örneğidir:

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

    static readonly string _RequireAuthenticatedUserPolicy = 
                            "RequireAuthenticatedUserPolicy";
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(
                 options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();

        // Pre 3.0:
        // services.AddMvc(options => options.Filters.Add(new AuthorizeFilter(...));

        services.AddControllersWithViews();
        services.AddRazorPages();
        services.AddAuthorization(o => o.AddPolicy(_RequireAuthenticatedUserPolicy,
                        builder => builder.RequireAuthenticatedUser()));

    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapDefaultControllerRoute()
                .RequireAuthorization(_RequireAuthenticatedUserPolicy);
            endpoints.MapRazorPages();
        });
    }
}

İlkeler de özelleştirilebilir. , DefaultPolicy Kimlik doğrulaması gerektirecek şekilde yapılandırılır:

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

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(
                 options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();

        services.AddControllersWithViews();
        services.AddRazorPages();
        services.AddAuthorization(options =>
        {
            options.DefaultPolicy = new AuthorizationPolicyBuilder()
              .RequireAuthenticatedUser()
              .Build();
        });

    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapDefaultControllerRoute().RequireAuthorization();
            endpoints.MapRazorPages();
        });
    }
}
[AllowAnonymous]
public class HomeController : Controller
{

Alternatif olarak, tüm uç noktalar [Authorize] bir veya yapılandırması olmadan yetkilendirme gerektirecek şekilde yapılandırılabilir RequireAuthorization FallbackPolicy . , FallbackPolicy Öğesinden farklıdır DefaultPolicy . , DefaultPolicy Veya tarafından tetiklenir [Authorize] RequireAuthorization , ancak başka bir FallbackPolicy ilke ayarlanmamışsa tetiklenir. FallbackPolicy Başlangıçta yetkilendirmesiz isteklere izin verecek şekilde yapılandırılmıştır.

Aşağıdaki örnek, önceki örnekle aynıdır, DefaultPolicy ancak FallbackPolicy belirtilen durumlar hariç tüm uç noktalarında her zaman kimlik doğrulaması gerektirmek için kullanır [AllowAnonymous] :

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddAuthorization(options =>
    {
        options.FallbackPolicy = new AuthorizationPolicyBuilder()
          .RequireAuthenticatedUser()
          .Build();
    });
}

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

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

[AllowAnonymous]
public class HomeController : Controller
{
    ...
}

Belirli bir yetkilendirme bilgisine sahip olmayan, ara yazılım tarafından yetkilendirme çalışmaktadır. Örneğin, sistem durumu denetimlerinde belirli bir yetkilendirme bilgisi yoktur, ancak sistem durumu denetimleri, ara yazılım tarafından uygulanan yapılandırılabilir bir yetkilendirme ilkesine sahip olabilir.

Ayrıca, her uç nokta yetkilendirme gereksinimlerini özelleştirebilir. Aşağıdaki örnekte, UseAuthorization ile yetkilendirmeyi işler DefaultPolicy , ancak /healthz sistem durumu denetimi uç noktası bir admin Kullanıcı gerektirir:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints
            .MapHealthChecks("/healthz")
            .RequireAuthorization(new AuthorizeAttribute(){ Roles = "admin", });
    });
}

Koruma bazı senaryolar için uygulanır. Bir yetkilendirme veya CORS ilkesi eksik ara yazılım nedeniyle atlandıysa uç noktalar ara yazılımı bir özel durum oluşturur. Yanlış yapılandırma hakkında ek geribildirim sağlamak için çözümleyici desteği devam ediyor.

Özel yetkilendirme işleyicileri

Uygulama özel Yetkilendirme işleyicilerikullanıyorsa, uç nokta yönlendirmesi MVC 'den farklı bir kaynak türünü işleyicilere geçirir. Yetkilendirme işleyicisi bağlam kaynağının türünde olmasını bekleyen işleyiciler AuthorizationFilterContext (( MVC filtreleri tarafından sağlanankaynak türü), türündeki kaynakları işleyecek şekilde RouteEndpoint (bir uç nokta yönlendirmeye göre yetkilendirme işleyicilerine verilen kaynak türü) yönelik olarak güncelleştirilmeleri gerekir.

MVC hala AuthorizationFilterContext kaynakları kullanıyor, bu nedenle uygulama, uç nokta yönlendirme yetkilendirmesi ile bırlıkte MVC yetkilendirme filtrelerini kullanıyorsa, her iki kaynak türünü de yönetmek gerekebilir.

SignalR

Hub 'ların eşlemesi SignalR artık içinde yer alır UseEndpoints .

Her hub 'ı ile eşleyin MapHub . Önceki sürümlerde olduğu gibi, her hub açık olarak listelenir.

Aşağıdaki örnekte, Hub için destek ChatHub SignalR eklenmiştir:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>();
    });
}

İstemcilerden gelen ileti boyutu sınırlarını denetlemek için yeni bir seçenek vardır. Örneğin, içinde Startup.ConfigureServices :

services.AddSignalR(hubOptions =>
{
    hubOptions.MaximumReceiveMessageSize = 32768;
});

ASP.NET Core 2,2 ' de, TransportMaxBufferSize en büyük ileti boyutunu etkin bir şekilde denetleyebilecek ve ' yi ayarlayabilirsiniz. ASP.NET Core 3,0 ' de, bu seçenek artık yalnızca geri basınç gözlemlenmeyen en büyük boyutu denetler.

MVC denetleyicileri

Denetleyicilerin eşlemesi artık içinde yer alır UseEndpoints .

MapControllersUygulama öznitelik yönlendirme kullanıyorsa ekleyin. yönlendirme ASP.NET Core 3,0 veya sonraki sürümlerde birçok çerçeve için destek içerdiğinden, öznitelik yönlendirmeli denetleyiciler eklemek kabul edilir.

Şunları değiştirin:

  • MapRoute kullanılarak MapControllerRoute
  • MapAreaRoute kullanılarak MapAreaControllerRoute

Yönlendirme şimdi yalnızca MVC 'den daha fazlasına destek içerdiğinden, bu yöntemlerin ne yapacaklarına açık bir şekilde sahip olması için terminoloji değişmiştir. Gibi geleneksel yollar MapControllerRoute / MapAreaControllerRoute / MapDefaultControllerRoute eklendikleri sırayla uygulanır. Önce daha belirli yollar (örneğin, bir alana yönelik yollar) yerleştirin.

Aşağıdaki örnekte:

  • MapControllers öznitelik yönlendirmeli denetleyiciler için destek ekler.
  • MapAreaControllerRoute bir alanındaki denetleyiciler için geleneksel bir yol ekler.
  • MapControllerRoute denetleyiciler için geleneksel bir yol ekler.
public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapAreaControllerRoute(
            "admin",
            "admin",
            "Admin/{controller=Home}/{action=Index}/{id?}");
        endpoints.MapControllerRoute(
            "default", "{controller=Home}/{action=Index}/{id?}");
    });
}

Denetleyici eylem adlarından zaman uyumsuz son ek kaldırma

ASP.NET Core 3,0 ' de ASP.NET Core MVC, Async son eki denetleyici eylem adlarından kaldırır. Hem yönlendirme hem de bağlantı oluşturma, bu yeni varsayılan değerinden etkilenir. Örnek:

public class ProductsController : Controller
{
    public async Task<IActionResult> ListAsync()
    {
        var model = await _dbContext.Products.ToListAsync();
        return View(model);
    }
}

ASP.NET Core 3,0 öncesi:

  • Önceki eyleme Ürünler/ListAsync rotası üzerinden erişilebilir.

  • Son eki belirten bağlantı oluşturma gerekiyor Async . Örnek:

    <a asp-controller="Products" asp-action="ListAsync">List</a>
    

ASP.NET Core 3,0:

  • Yukarıdaki eyleme, Ürünler/liste rotasında erişilebilir.

  • Bağlantı oluşturma, sonekin belirtilmesini gerektirmez Async . Örnek:

    <a asp-controller="Products" asp-action="List">List</a>
    

Bu değişiklik, özniteliği kullanılarak belirtilen adları etkilemez [ActionName] . Varsayılan davranış ' de aşağıdaki kodla devre dışı bırakılabilir Startup.ConfigureServices :

services.AddMvc(options =>
    options.SuppressAsyncSuffixInActionNames = false);

Önceki yönlendirme sürümlerindeki farklılıklarhakkında belgelerde açıklandığı gibi, bağlantı oluşturma ( Url.Link Örneğin ve benzer API 'ler kullanılarak) ile ilgili bazı farklılıklar vardır. Bu modüller şunlardır:

  • Varsayılan olarak, uç nokta yönlendirme kullanılırken, üretilen URI 'Ler içindeki yol parametrelerinin büyük küçük harf korunması zorunlu değildir. Bu davranış, IOutboundParameterTransformer arabirimiyle denetlenebilir.
  • Geçersiz bir yol (mevcut olmayan bir denetleyici/eylem veya sayfa) için URI oluşturma, geçersiz bir URI oluşturmak yerine Endpoint Routing altında boş bir dize oluşturur.
  • Çevresel değerler (geçerli bağlamdaki rota parametreleri), uç nokta yönlendirme ile bağlantı oluşturmada otomatik olarak kullanılmaz. Daha önce, başka bir eyleme (veya sayfaya) bir bağlantı oluştururken, geçerli rota ortam değerlerinden belirtilmemiş yol değerleri çıkarsanamıyor. Endpoint Routing kullanılırken, bağlantı oluşturma sırasında tüm rota parametreleri açıkça belirtilmelidir.

Razor Sayfaları

Eşleme Razor sayfaları artık içinde yer alır UseEndpoints .

MapRazorPagesUygulama sayfaları kullanıyorsa ekleyin Razor . Endpoint Routing birçok çerçeve için destek içerdiğinden, sayfa ekleme Razor artık kabul edilir.

Aşağıdaki Startup.Configure yöntemde, MapRazorPages sayfalar için destek ekler Razor :

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

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

Endpoint Routing olmadan MVC kullanma

UseMvcASP.NET Core 3,0 aracılığıyla veya UseMvcWithDefaultRoute içinde MVC kullanmanın içinde açık bir kabul olması gerekir Startup.ConfigureServices . Bu, MVC 'nin başlatma sırasında yetkilendirme ve CORS ara yazılımını kullanıp kullanamayacağını bilmeleri gerektiğinden gereklidir. Uygulama desteklenmeyen bir yapılandırmayı kullanmayı denerse sizi uyaran bir çözümleyici sağlanır.

Uygulama eski IRouter destek gerektiriyorsa, EnableEndpointRouting içinde aşağıdaki yaklaşımlardan herhangi birini kullanarak devre dışı bırakın Startup.ConfigureServices :

services.AddMvc(options => options.EnableEndpointRouting = false);
services.AddControllers(options => options.EnableEndpointRouting = false);
services.AddControllersWithViews(options => options.EnableEndpointRouting = false);
services.AddRazorPages().AddMvcOptions(options => options.EnableEndpointRouting = false);

Sistem durumu denetimleri

Sistem durumu denetimleri, uç nokta yönlendirme özellikli bir yönlendirici-yazılım olarak kullanılabilir.

MapHealthChecksUç nokta yönlendirme ile durum denetimlerini kullanmak için ekleyin. MapHealthChecksYöntemi şuna benzer bağımsız değişkenleri kabul eder UseHealthChecks . Fazla kullanmanın avantajı, yetkilendirme uygulama ve eşleştirme ilkesi üzerinde daha fazla ince MapHealthChecks UseHealthChecks denetime sahip olmaktır.

Aşağıdaki örnekte, 'de MapHealthChecks bir durum denetimi uç noktası için çağrılır: /healthz

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHealthChecks("/healthz", new HealthCheckOptions() { });
    });
}

HostBuilder, WebHostBuilder'ın yerini aldı

3.0 ASP.NET Core şablonları Genel Ana Bilgisayarı kullanır. Önceki sürümlerde Web Ana Bilgisayarı kullanılmıştır. Aşağıdaki kod, ASP.NET Core 3.0 şablonu tarafından oluşturulan sınıfı Program gösterir:

// requires using Microsoft.AspNetCore.Hosting;
// requires using Microsoft.Extensions.Hosting;

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Aşağıdaki kod, ASP.NET Core 2.2 şablonu tarafından oluşturulan sınıfı Program gösterir:

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

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

IWebHostBuilder , 3.0'da kalır ve önceki kod webBuilder örneğinde görülen t değeridir. WebHostBuilder gelecek bir sürümde kullanımdan çıkar ve ile HostBuilder değiştirilir.

ile arasındaki en önemli değişiklik WebHostBuilder HostBuilder bağımlılık eklemede (DI) şeklindedir. kullanırken, HostBuilder yalnızca aşağıdakini 'nin oluşturucus Startup una yapıcıya 50000000000000000000000000000

HostBuilderDI kısıtlamaları:

  • DI kapsayıcısı yalnızca bir kez inşa edilecek şekilde etkinleştirin.
  • Tek tonların birden çok örneğini çözümleme gibi sonuçta ortaya çıkan nesne yaşam süresi sorunlarını önler.

Daha fazla bilgi için bkz. ASP.NET Core 3'te Başlangıç hizmeti eklemeden kaçınma.

AddAuthorization farklı bir derlemeye taşındı

aşağıdaki ASP.NET Core 2.2 AddAuthorization ve daha düşük Microsoft.AspNetCore.Authorization.dll:

  • yeniden AddAuthorizationCore adlandırıldı.
  • , Microsoft.AspNetCore.Authorization.Policy.dll.

Hem uygulama hem deMicrosoft.AspNetCore.Authorization.dll Microsoft.AspNetCore.Authorization.Policy.dll uygulamalar etkilenmez.

Microsoft.AspNetCore.Authorization.Policy.dll kullanmayan uygulamalar aşağıdakilerden birini gerçekleştirin:

  • Microsoft.AspNetCore.Authorization.Policy.dll. ** Bu yaklaşım çoğu uygulama için çalışır ve gerekli olan tek şey budur.
  • Kullanmaya geçiş AddAuthorizationCore

Daha fazla bilgi için bkz. 'de yeni AddAuthorization(o => değişiklik) aşırı yüklemesi farklı bir derlemede #386..

Identity UI

IdentityASP.NET Core 3.0 için kullanıcı arabirimi güncelleştirmeleri:

SignalR

SignalRJavaScript istemcisi olarak @aspnet/signalr @microsoft/signalr değiştirildi. Bu değişiklike tepki olarak, dosyalarda, package.js ve ECMAScript deyimleri üzerinde require import başvurularını değiştirebilirsiniz.

System.Text.Jsvarsayılan protokoldür

System.Text.Json artık hem istemci hem de sunucu tarafından kullanılan varsayılan Hub protokolüdür.

içinde, Startup.ConfigureServices seri AddJsonProtocol hale getirici seçeneklerini ayarlamak için çağrısı.

Sunucu:

services.AddSignalR(...)
        .AddJsonProtocol(options =>
        {
            options.PayloadSerializerOptions.WriteIndented = false;
        })

Istemci:

new HubConnectionBuilder()
    .WithUrl("/chathub")
    .AddJsonProtocol(options =>
    {
        options.PayloadSerializerOptions.WriteIndented = false;
    })
    .Build();

Açık Newtonsoft.Jsgeçiş

üzerinde, üzerinde Newtonsoft.Js'de System.Text.Jsözelliklerini kullanıyorsanız,'a geri Newtonsoft.Json dön. Bu makalenin Newtonsoft.Jsönceki bir ASP.NET Core 3.0 SignalR projesinde Newtonsoft.Js'i kullanma makalesine bakın.

Redis dağıtılmış önbellekleri

Microsoft.Extensions.Önbelleğe Alma. Redis paketi, 3.0 ASP.NET Core sonraki uygulamalarda kullanılamaz. Paket başvurularını Microsoft.Extensions.Önbelleğe Alma. StackExchangeRedis. Daha fazla bilgi için bkz. ASP.NET Core 'de dağıtılmış önbelleğe alma.

Çalışma zamanı derlemesini kabul etmek

3 ASP.NET Core 3.0'dan önce, görünümlerin çalışma zamanı derlemesi çerçevenin örtülü bir özelliğidir. Çalışma zamanı derlemesi, görünümlerin derleme zamanı derlemesini tamamlar. Çerçevenin, dosyalar değiştirildiğinde uygulamanın tamamını yeniden derlemek zorunda kalmadan görünümleri ve sayfaları Razor (.cshtml dosyaları) derlemesini sağlar. Bu özellik, IDE'de hızlı bir düzenleme yapma ve değişiklikleri görüntülemek için tarayıcıyı yenileme senaryosunu destekler.

3 ASP.NET Core 3.0'da çalışma zamanı derlemesi bir kabul senaryosudur. Derleme zamanı derlemesi, görüntüleme derlemesi için varsayılan olarak etkinleştirilmiş tek mekanizmadır. Çalışma zamanı, .cshtml Visual Studio algılayan projeyi yeniden Visual Studio Code için Visual Studio veya dotnet-watch kullanır. Bu Visual Studio, çalıştırılma projesinde .cs, .cshtml veya .razor dosyalarında yapılan değişiklikler (Ctrl+F5), ancak hata ayıklaması (F5)değil, projenin yeniden derlemesini tetikler.

ASP.NET Core 3.0 projesinde çalışma zamanı derlemesini etkinleştirmek için:

  1. Microsoft.AspNetCore.Mvc. Razor yükleyin. . RuntimeCompilation NuGet paketi.

  2. çağrısı Startup.ConfigureServices yapmak için AddRazorRuntimeCompilation güncelleştirin:

    MVC ASP.NET Core için aşağıdaki kodu kullanın:

    services.AddControllersWithViews()
        .AddRazorRuntimeCompilation(...);
    

    Sayfa ASP.NET Core Razor için aşağıdaki kodu kullanın:

    services.AddRazorPages()
        .AddRazorRuntimeCompilation(...);
    

'daki https://github.com/aspnet/samples/tree/main/samples/aspnetcore/mvc/runtimecompilation örnek, Geliştirme ortamlarında çalışma zamanı derlemesini koşullu olarak etkinleştirme örneğini gösterir.

Dosya derleme hakkında daha Razor fazla bilgi için Razordosya derlemesi ASP.NET Core bkz. .

Çoklu hedefleme yoluyla kitaplıkları geçirme

Kitaplıkların genellikle birden çok uygulama sürümünü desteklemesi ASP.NET Core. Önceki sürümlere göre derlenmiş kitaplıkların çoğu ASP.NET Core çalışmalarına sorun olmadan devam edecektir. Aşağıdaki koşullarda uygulamanın çapraz derlenmiş olması gerekir:

Örnek:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netcoreapp3.0;netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="Microsoft.AspNetCore" Version="2.1.0" />
  </ItemGroup>
</Project>

#ifdefs3.0'ASP.NET Core API'leri etkinleştirmek için kullanın:

var webRootFileProvider =
#if NETCOREAPP3_0
    GetRequiredService<IWebHostEnvironment>().WebRootFileProvider;
#elif NETSTANDARD2_0
    GetRequiredService<IHostingEnvironment>().WebRootFileProvider;
#else
#error unknown target framework
#endif

Bir sınıf kitaplığında ASP.NET Core API'lerini kullanma hakkında daha fazla bilgi için bkz. bir sınıf kitaplığında ASP.NET Core apı 'leri kullanma .

Çeşitli değişiklikler

.NET Core 3.0 ve sonraki işletim sistemleri, null değer atılabilir olmayan parametreleri veya bağlı özellikleri bir özniteliğine sahip gibi [Required] kabul ediyor. Daha fazla bilgi için bkz. [Gerekli] özniteliği.

Yayımlama

Proje dizinindeki bin ve obj klasörlerini silin.

TestServer

Doğrudan Genel Ana TestServer Bilgisayar ile birlikte kullanan uygulamalar için, içinde TestServer üzerinde IWebHostBuilder ConfigureWebHost oluşturun:

[Fact]
public async Task GenericCreateAndStartHost_GetTestServer()
{
    using var host = await new HostBuilder()
        .ConfigureWebHost(webBuilder =>
        {
            webBuilder
                .UseTestServer()
                .Configure(app => { });
        })
    .StartAsync();

    var response = await host.GetTestServer().CreateClient().GetAsync("/");

    Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}

Yeni API değişiklikleri

Yeni değişiklikleri gözden geçirme:

Hepsini yakala parametresiyle uç nokta yönlendirme

Uyarı

Bir catch-all parametresi, yönlendirdeki bir hata nedeniyle yollarla yanlış bir şekilde eşleşmeyebilir. Bu hatadan etkilenen uygulamalar aşağıdaki özelliklere sahiptir:

  • Örneğin, bir catch-all rotası {**slug}"
  • Catch-all yolu eşleşmesi gereken isteklerle eşleşemez.
  • Diğer yolların kaldırılması, catch-all yolunun çalışmaya başlamasını sağlar.

Bu hataya vurmakta olan örnekler için GitHub hataları 18677 ve 16579 bakın.

Bu hata için bir katılım çözümü .NET Core 3.1.301 SDK ve sonraki sürümlerdebulunur. Aşağıdaki kod, bu hatayı düzelten bir iç anahtar ayarlar:

public static void Main(string[] args)
{
   AppContext.SetSwitch("Microsoft.AspNetCore.Routing.UseCorrectCatchAllBehavior", 
                         true);
   CreateHostBuilder(args).Build().Run();
}
// Remaining code removed for brevity.

Azure App Service üzerinde .NET Core 3.0

.NET Core'Azure App Service tamam. .NET Core 3.0, tüm Azure App Service kullanılabilir.