Aracılığıyla paylaş


Sınıf kitaplığında ASP.NET Çekirdek API'lerini kullanma

Tarafından Scott Addie

Bu belge, sınıf kitaplığında ASP.NET Core API'lerini kullanmaya yönelik yönergeler sağlar. Diğer tüm kitaplık yönergeleri için bkz. Açık kaynak kitaplık kılavuzu.

Hangi ASP.NET Core sürümlerinin destekleneceğini belirleme

ASP.NET Core,.NET Core destek ilkesine bağlıdır. Kitaplıkta hangi ASP.NET Core sürümlerinin desteklenmek üzere olduğunu belirlerken destek ilkesine başvurun. Bir kitaplık şu şekilde olmalıdır:

  • Long-Term Destek (LTS) olarak sınıflandırılan tüm ASP.NET Core sürümlerini desteklemek için çaba sarf edin.
  • Kullanım Süresi Sonu (EOL) olarak sınıflandırılan ASP.NET Core sürümlerini desteklemek zorunda hissetmiyorum.

ASP.NET Core'un önizleme sürümleri yayınlandıkça, aspnet/Announcements GitHub deposunda önemli değişiklikler duyurulur. Çerçeve özellikleri geliştirilirken kitaplıkların uyumluluk testi yapılabilir.

ASP.NET Core paylaşılan çerçevesini kullanma

.NET Core 3.0 sürümüyle, birçok ASP.NET Core derlemesi artık NuGet'e paket olarak yayımlanmaz. Bunun yerine, derlemeler .NET Core SDK'sı ve çalışma zamanı yükleyicileriyle birlikte yüklenen Microsoft.AspNetCore.App paylaşılan çerçeveye dahil edilir. Artık yayımlanmamakta olan paketlerin listesi için bkz.Eski paket başvurularını kaldırma .

.NET Core 3.0 itibarıyla, Microsoft.NET.Sdk.Web MSBuild SDK'sını kullanan projeler paylaşılan çerçeveye örtük olarak başvurur. Microsoft.NET.Sdk veya Microsoft.NET.Sdk.Razor SDK'sını kullanan projelerin paylaşılan çerçevede ASP.NET Core API'lerini kullanmak için ASP.NET Core'a başvurması gerekir.

ASP.NET Core'a başvurmak için proje dosyanıza aşağıdaki <FrameworkReference> öğesini ekleyin:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

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

</Project>

Blazor genişletilebilirliği dahil et

, sunucu tarafı ve istemci tarafı uygulamalar için bileşenlerini içeren sınıf kitaplıkları oluşturmayı destekler. Sınıf kitaplığındaki Razor bileşenlerini desteklemek için, sınıf kitaplığının Microsoft.NET.SdkRazor SDK'sınıkullanması gerekir.

Sunucu tarafı ve istemci tarafı uygulamalarını destekleme

Tek bir kitaplıktan sunucu tarafı ve istemci tarafı uygulamalar tarafından Razor bileşen tüketimini desteklemek için düzenleyiciniz için aşağıdaki yönergeleri kullanın.

Razor Sınıf Kitaplığı proje şablonunu kullanın.

Not

Destek sayfaları ve görünümleri onay kutusunu seçmeyin. Onay kutusunun seçilmesi, yalnızca sunucu tarafı uygulamaları destekleyen bir sınıf kitaplığı oluşturur.

Proje şablonundan oluşturulan kitaplık:

  • Yüklü SDK'ya göre geçerli .NET çerçevesini hedefler.
  • SupportedPlatform MSBuild öğesiyle desteklenen bir platform olarak browser ekleyerek platform bağımlılıkları için tarayıcı uyumluluk denetimlerini etkinleştirir.
  • Microsoft.AspNetCore.Components.Webiçin bir NuGet paket başvurusu ekler.

RazorClassLibrary-CSharp.csproj (başvuru kaynağı)

Not

.NET başvuru kaynağına yönelik belge bağlantıları genellikle bir sonraki .NET sürümü için geçerli geliştirmeyi temsil eden deponun varsayılan dalını yükler. Belirli bir sürüm için bir etiket seçmek amacıyla Dalları veya etiketleri değiştir açılır listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

Birden çok çerçeve sürümünü destekleme

Kitaplığın mevcut sürümde Blazor eklenen özellikleri desteklemesi ve ayrıca bir veya daha fazla önceki sürümü desteklemesi gerekiyorsa, kitaplığı birden fazla hedefe yönlendirin. TargetFrameworks MSBuild özelliğinde noktalı virgülle ayrılmış bir Hedef Çerçeve Takma Adları (TFM) listesi sağlayın.

<TargetFrameworks>{TARGET FRAMEWORKS}</TargetFrameworks>

Yukarıdaki örnekte, {TARGET FRAMEWORKS} yer tutucusu noktalı virgülle ayrılmış TFM'ler listesini temsil eder. Örneğin, netcoreapp3.1;net5.0.

Yalnızca sunucu tarafı tüketimini destekler

Sınıf kitaplıkları nadiren yalnızca sunucu tarafı uygulamaları destekleyecek şekilde oluşturulur. Sınıf kitaplığı yalnızca veya erişimi gibi sunucu tarafına özgü özellikler gerektiriyorsa veya middleware, MVC denetleyicileri veya Sayfaları gibi ASP.NET Core'a özgü özellikler kullanıyorsa, aşağıdaki yaklaşımlardan birini kullanın:

  • Kitaplık Destek sayfaları ve görünümleri onay kutusuyla (Visual Studio) veya dotnet new komutuyla -s|--support-pages-and-views seçeneğiyle oluşturulduğunda kitaplığın sayfaları ve görünümleri desteklediğini belirtin:

    dotnet new razorclasslib -s
    
  • Diğer gerekli MSBuild özelliklerine ek olarak yalnızca kitaplığın proje dosyasındaki ASP.NET Core'a çerçeve başvurusu sağlayın:

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

Razor bileşenleri içeren kitaplıklar hakkında daha fazla bilgi için bkz. Razor sınıf kitaplığından (RCL)ASP.NET Core Razor bileşenlerini kullanma.

MVC genişletilebilirliğini dahil et

Bu bölümde, aşağıdaki kitaplıklar için öneriler özetlenir:

Bu bölümde, MVC'nin birden çok sürümünü desteklemek için çoklu hedefleme ele alınmıyor. Birden çok ASP.NET Core sürümünü destekleme hakkında yönergeler için bkz. Birden çok ASP.NET Core sürümünü destekleme.

Razor Görünüm veya Razor Sayfa

Razor görünümlerini veya Razor Sayfaları içeren bir proje Microsoft.NET.Sdk. SDKRazor kullanmalıdır.

Proje .NET Core 3.x'i hedeflerse, şunları gerektirir:

  • Bir AddRazorSupportForMvc MSBuild özelliği trueolarak ayarlanmış.
  • Paylaşılan çerçeve için bir <FrameworkReference> öğesi.

Razor Sınıf Kitaplığı proje şablonu, .NET Core'a yönelik projeler için önceki gereksinimleri karşılar. Düzenleyiciniz için aşağıdaki yönergeleri kullanın.

Razor Sınıf Kitaplığı proje şablonunu kullanın. Şablonun "Destek sayfaları ve görünümleri" onay kutusu seçilmelidir.

Örneğin:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
  </PropertyGroup>

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

</Project>

Proje bunun yerine .NET Standard'ı hedeflerse, Microsoft.AspNetCore.Mvc paket başvurusu gerekir. Microsoft.AspNetCore.Mvc paketi ASP.NET Core 3.0'da paylaşılan çerçeveye taşındı ve bu nedenle artık yayımlanmaz. Örneğin:

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

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
  </ItemGroup>

</Project>

Etiket Yardımcıları

Etiket Yardımcıları içeren bir proje Microsoft.NET.Sdk SDK'sını kullanmalıdır. .NET Core 3.x hedefleniyorsa, paylaşılan çerçeve için bir <FrameworkReference> öğesi ekleyin. Örneğin:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

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

</Project>

.NET Standard'ı (ASP.NET Core 3.x'ten önceki sürümleri desteklemek için) hedefliyorsanız, Microsoft.AspNetCore.Mvc'e bir paket başvurusu ekleyin.Razor. Microsoft.AspNetCore.Mvc.Razor paketi paylaşılan çerçeveye taşındı ve bu nedenle artık yayımlanmaz. Mesela:

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

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
  </ItemGroup>

</Project>

Bileşenleri görüntüleme

Görünüm bileşenlerini içeren bir projeMicrosoft.NET.Sdk SDK'sını kullanmalıdır. .NET Core 3.x hedefleniyorsa, paylaşılan çerçeve için bir <FrameworkReference> öğesi ekleyin. Mesela:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

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

</Project>

.NET Standard'ı hedeflemek (ASP.NET Core 3.x'ten önceki sürümleri desteklemek için) amacıyla, Microsoft.AspNetCore.Mvc.ViewFeaturesadlı pakete bir başvuru ekleyin. Microsoft.AspNetCore.Mvc.ViewFeatures paketi paylaşılan çerçeveye taşındı ve bu nedenle artık yayımlanmaz. Mesela:

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

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Version="2.2.0" />
  </ItemGroup>

</Project>

Birden çok ASP.NET Core sürümünü destekleme

birden çok ASP.NET Core değişkenini destekleyen bir kitaplık yazmak için çoklu hedefleme gereklidir. Etiket Yardımcıları kitaplığının aşağıdaki ASP.NET Core değişkenlerini desteklemesi gereken bir senaryo düşünün:

  • .NET Framework 4.6.1'i hedefleyen ASP.NET Core 2.1
  • .NET Core 2.x'i hedefleyen ASP.NET Core 2.x
  • .NET Core 3.x'i hedefleyen ASP.NET Core 3.x

Aşağıdaki proje dosyası, TargetFrameworks özelliği aracılığıyla bu varyantları destekler:

<Project Sdk="Microsoft.NET.Sdk">
  
  <PropertyGroup>
    <TargetFrameworks>netcoreapp2.1;netcoreapp3.1;net461</TargetFrameworks>
  </PropertyGroup>
  
  <ItemGroup>
    <PackageReference Include="Markdig" Version="0.16.0" />
  </ItemGroup>
  
  <ItemGroup Condition="'$(TargetFramework)' != 'netcoreapp3.1'">
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor" Version="2.1.0" />
  </ItemGroup>

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

Önceki proje dosyasıyla:

Alternatif olarak, .NET Core 2.1 ve .NET Framework 4.6.1 hedeflenmek yerine .NET Standard 2.0 hedeflenebilir:

<Project Sdk="Microsoft.NET.Sdk">
  
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp3.1</TargetFrameworks>
  </PropertyGroup>
  
  <ItemGroup>
    <PackageReference Include="Markdig" Version="0.16.0" />
  </ItemGroup>
  
  <ItemGroup Condition="'$(TargetFramework)' != 'netcoreapp3.1'">
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor" Version="2.1.0" />
  </ItemGroup>

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

Yukarıdaki proje dosyasında aşağıdaki uyarılar vardır:

  • Kitaplıkta yalnızca Etiket Yardımcıları bulunduğundan, ASP.NET Core'un çalıştığı belirli platformları hedeflemek daha kolaydır: .NET Core ve .NET Framework. Etiket Yardımcıları Unity ve UWP gibi diğer .NET Standard 2.0 uyumlu hedef çerçeveler tarafından kullanılamaz.
  • .NET Framework'ten .NET Standard 2.0 kullanıldığında .NET Framework 4.7.2'de giderilen bazı sorunlar vardır. .NET Framework 4.6.1 ile 4.7.1 arasında .NET Framework 4.6.1'i hedefleyerek tüketiciler için deneyimi geliştirebilirsiniz.

Kitaplığınızın platforma özgü API'leri çağırması gerekiyorsa.NET Standard yerine belirli .NET uygulamalarını hedefleyin. Daha fazla bilgi için bkz. çoklu hedefleme.

Değişmemiş bir API kullanma

Bir ara yazılım kitaplığını .NET Core 2.2'den 3.1'e yükselttiğiniz bir senaryo düşünün. Kitaplıkta kullanılan ASP.NET Core ara yazılım API'leri, ASP.NET Core 2.2 ile 3.1 arasında değişmemiştir. .NET Core 3.1'de ara yazılım kitaplığını desteklemeye devam etmek için aşağıdaki adımları izleyin:

  • standart kitaplık kılavuzunu izleyin.
  • Paylaşılan çerçevede ilgili derleme mevcut değilse, her API'nin NuGet paketi için bir paket referansı ekleyin.

Değişen bir API kullanma

Kitaplığı .NET Core 2.2'den .NET Core 3.1'e yükselttiğiniz bir senaryo düşünün. Kitaplıkta kullanılan bir ASP.NET Core API'sinin ASP.NET Core 3.1'de hataya neden olan değişiklik vardır. Kitaplığın tüm sürümlerde bozuk API'yi kullanmamak için yeniden yazılıp yazılamayacağını değerlendirin.

Kitaplığı yeniden yazabiliyorsanız, bunu yapın ve paket başvurularıyla önceki bir hedef çerçeveyi (örneğin, .NET Standard 2.0 veya .NET Framework 4.6.1) hedeflemeye devam edin.

Kitaplığı yeniden yazamıyorsanız aşağıdaki adımları izleyin:

  • .NET Core 3.1 için bir hedef ekleyin.
  • Paylaşılan çerçeve için bir <FrameworkReference> öğesi ekleyin.
  • Kodu koşullu olarak derlemek için uygun hedef çerçeve simgesiyle #if önişlemci yönergesini kullanın.

Örneğin HTTP isteği ve yanıt akışlarında zaman uyumlu okuma ve yazma işlemleri, ASP.NET Core 3.1 itibarıyla varsayılan olarak devre dışı bırakılır. ASP.NET Core 2.2, zaman uyumlu davranışı varsayılan olarak destekler. G/Ç'nin yapıldığı yerlerde zaman uyumlu okuma ve yazmaların etkinleştirilmesi gereken bir ara katman kütüphanesi düşünün. Kütüphane, eşzamanlı özellikleri etkinleştirmek için kodu uygun önişlemci yönergesine koymalıdır. Örneğin:

public async Task Invoke(HttpContext httpContext)
{
    if (httpContext.Request.Path.StartsWithSegments(_path, StringComparison.Ordinal))
    {
        httpContext.Response.StatusCode = (int) HttpStatusCode.OK;
        httpContext.Response.ContentType = "application/json";
        httpContext.Response.ContentLength = _bufferSize;

#if !NETCOREAPP3_1 && !NETCOREAPP5_0
        var syncIOFeature = httpContext.Features.Get<IHttpBodyControlFeature>();
        if (syncIOFeature != null)
        {
            syncIOFeature.AllowSynchronousIO = true;
        }

        using (var sw = new StreamWriter(
            httpContext.Response.Body, _encoding, bufferSize: _bufferSize))
        {
            _json.Serialize(sw, new JsonMessage { message = "Hello, World!" });
        }
#else
        await JsonSerializer.SerializeAsync<JsonMessage>(
            httpContext.Response.Body, new JsonMessage { message = "Hello, World!" });
#endif
        return;
    }

    await _next(httpContext);
}

3.1'de kullanıma sunulan bir API kullanma

ASP.NET Core 3.1'de tanıtılan bir ASP.NET Core API'sini kullanmak istediğinizi düşünün. Aşağıdaki soruları göz önünde bulundurun:

  1. Kitaplık işlevsel olarak yeni API'yi gerektiriyor mu?
  2. Kitaplık bu özelliği farklı bir şekilde uygulayabilir mi?

Kitaplık API'yi işlevsel olarak gerektiriyorsa ve bunu alt düzeyde uygulamanın hiçbir yolu yoksa:

  • Yalnızca .NET Core 3.x'i hedefle.
  • Paylaşılan çerçeve için bir <FrameworkReference> öğesi ekleyin.

Kitaplık özelliği farklı bir şekilde uygulayabiliyorsa:

  • Hedef çerçeve olarak .NET Core 3.x'i ekleyin.
  • Paylaşılan çerçeve için bir <FrameworkReference> öğesi ekleyin.
  • Kodu koşullu olarak derlemek için uygun hedef çerçeve simgesiyle #if önişlemci yönergesini kullanın.

Örneğin, aşağıdaki Etiket Yardımcısı ASP.NET Core 3.1'de tanıtılan IWebHostEnvironment arabirimini kullanır. .NET Core 3.1'i hedefleyen tüketiciler, NETCOREAPP3_1 hedef çerçeve simgesi tarafından tanımlanan kod yolunu yürütür. Etiket Yardımcısı'nın oluşturucu parametre türü .NET Core 2.1 ve .NET Framework 4.6.1 tüketicileri için IHostingEnvironment olarak değişir. ASP.NET Core 3.1 IHostingEnvironment eski olarak işaretlendiğinden ve değiştirme olarak IWebHostEnvironment önerildiğinden bu değişiklik gerekliydi.

[HtmlTargetElement("script", Attributes = "asp-inline")]
public class ScriptInliningTagHelper : TagHelper
{
    private readonly IFileProvider _wwwroot;

#if NETCOREAPP3_1
    public ScriptInliningTagHelper(IWebHostEnvironment env)
#else
    public ScriptInliningTagHelper(IHostingEnvironment env)
#endif
    {
        _wwwroot = env.WebRootFileProvider;
    }

    // code omitted for brevity
}

Aşağıdaki çok hedefli proje dosyası bu Etiket Yardımcısı senaryoyu destekler:

<Project Sdk="Microsoft.NET.Sdk">
  
  <PropertyGroup>
    <TargetFrameworks>netcoreapp2.1;netcoreapp3.1;net461</TargetFrameworks>
  </PropertyGroup>
  
  <ItemGroup>
    <PackageReference Include="Markdig" Version="0.16.0" />
  </ItemGroup>
  
  <ItemGroup Condition="'$(TargetFramework)' != 'netcoreapp3.1'">
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor" Version="2.1.0" />
  </ItemGroup>

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

Paylaşılan çerçeveden kaldırılmış bir API kullanın

Paylaşılan çerçeveden kaldırılan bir ASP.NET Core derlemesi kullanmak için uygun paket başvuruyu ekleyin. ASP.NET Core 3.1'de paylaşılan çerçeveden kaldırılan paketlerin listesi için bkz. Eski paket başvurularını kaldırma.

Örneğin, web API istemcisini eklemek için:

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

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

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

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.7" />
  </ItemGroup>

</Project>

Ek kaynaklar