Aracılığıyla paylaş


ASP.NET Core'dan web API'si çağırma Blazor

Note

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.

Warning

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz. .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Bu makalede, bir uygulamadan web API'sini Blazor çağırma açıklanmaktadır.

Package

Bu paket, System.Net.Http.Json ve System.Net.Http.HttpClient için System.Net.Http.HttpContent ve System.Text.Json kullanarak otomatik serileştirme ve seri durumdan çıkarma gerçekleştiren uzantı yöntemleri sağlar. Paket System.Net.Http.Json, .NET paylaşılan çerçevesi tarafından sağlanır ve uygulamaya bir paket referansı eklenmesine gerek yoktur.

Web API çağrıları için belirteç işleyicisi kullanma

Blazor Web App kullanıcıları OIDC kimlik doğrulaması ile, dış web API çağrılarını güvence altına almak için giden istekleri yapmak amacıyla bir belirteç işleyici yaklaşımı kullanabilir. Bu yaklaşım, bu makalenin BlazorWebAppOidcBlazorWebAppOidcServer bölümünde açıklanan ve örnek uygulamalar tarafından kullanılır.

Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

Web API çağrıları için Microsoft kimlik platformu

Blazor Web AppMicrosoft Entra ID için Microsoft Web paketleriyle Microsoft Identitykimlik platformunu kullananlar, NuGet paketi tarafındanMicrosoft.Identity.Web.DownstreamApi sağlanan API ile kolaylaştırılmış web API'si çağrıları yapabilir.

Note

.NET uygulamalarına paket ekleme yönergeleri için Paket tüketimi iş akışı (NuGet belgeleri) sayfasındaki Paketleri yükleme ve yönetme altındaki makalelere bakın. NuGet.org'de doğru paket sürümlerini onaylayın.

Uygulama ayarları dosyasında (appsettings.json) bir temel URL ve kapsamlar sağlayın. Aşağıdaki örnekte yer tutucu, {BASE ADDRESS} web API'sinin temel URL'sidir. Uygulama Kimliği URI’si ({APP ID URI} yer tutucu) ve kapsam adı ({SCOPE NAME} yer tutucu) ile tek bir kapsam belirtilir:

"DownstreamApi": {
  "BaseUrl": "{BASE ADDRESS}",
  "Scopes": [ "{APP ID URI}/{SCOPE NAME}" ]
}

Example:

"DownstreamApi": {
  "BaseUrl": "https://localhost:7277",
  "Scopes": [ "api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get" ]
}

Uygulamanın Program dosyasında şunları arayın:

Önbelleği şifrelemeyi seçebilirsiniz ve bunu her zaman üretim ortamında yapmanız gerekir.

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", 
        builder.Configuration.GetSection("DownstreamApi"))
    .AddDistributedTokenCaches();

// Requires the 'Microsoft.Extensions.Caching.Memory' NuGet package
builder.Services.AddDistributedMemoryCache();

builder.Services.Configure<MsalDistributedTokenCacheAdapterOptions>(
    options => 
    {
        // The following lines that are commented out reflect
        // default values. We recommend overriding the default
        // value of Encrypt to encrypt tokens at rest.

        //options.DisableL1Cache = false;
        //options.L1CacheOptions.SizeLimit = 500 * 1024 * 1024;
        options.Encrypt = true;
        //options.SlidingExpiration = TimeSpan.FromHours(1);
    });

Dağıtılmış belirteç önbelleğe alma için kullanılabilir bir temel uygulama olduğundan emin olmak için çağrı AddDistributedTokenCaches yapılırken bellek içi dağıtılmış belirteç önbellekleri oluşturulur.

Üretim web uygulamaları ve web API'leri bir üretim dağıtılmış belirteç önbelleği kullanmalıdır (örneğin: Redis, Microsoft SQL Server, Microsoft Azure Cosmos DB).

Note

Tek bir makinede yerel geliştirme ve test için dağıtılmış belirteç önbellekleri yerine bellek içi belirteç önbelleklerini kullanabilirsiniz:

builder.Services.AddInMemoryTokenCaches();

Geliştirme ve test sürecinin ilerleyen bölümlerinde, dağıtılmış üretim belirteç önbellek sağlayıcısı kullanın.

AddDistributedMemoryCache, Microsoft Web tarafından IDistributedCache için belirteç önbelleğe alma işlemi sırasında kullanılan, önbellek öğelerini bellekte depolayan varsayılan bir Identity uygulaması ekler.

AddDistributedMemoryCache NuGet paketine Microsoft.Extensions.Caching.Memory bir paket başvurusu gerektirir.

Note

.NET uygulamalarına paket ekleme yönergeleri için Paket tüketimi iş akışı (NuGet belgeleri) sayfasındaki Paketleri yükleme ve yönetme altındaki makalelere bakın. NuGet.org'de doğru paket sürümlerini onaylayın.

Üretim dağıtılmış önbellek sağlayıcısını yapılandırmak için bkz. ASP.NET Core'da dağıtılmış önbelleğe alma.

Warning

Uygulamayı üretim ortamına dağıtırken her zaman bellek içi dağıtılmış belirteç önbelleklerini gerçek bir belirteç önbellek sağlayıcısıyla değiştirin. Bir üretim dağıtılmış belirteci önbellek sağlayıcısını benimsemezseniz uygulama önemli ölçüde düşük performansa maruz kalabilir.

Daha fazla bilgi için bkz . Belirteç önbelleği serileştirme: Dağıtılmış önbellekler. Ancak, gösterilen kod örnekleri, dağıtılmış önbellekleri AddDistributedMemoryCache yerine AddDistributedTokenCache aracılığıyla yapılandıran ASP.NET Core uygulamaları için geçerli değildir.

Üretimde paylaşılan bir Data Protection anahtar halkası kullanın, böylece bir web grubundaki sunucular arasında uygulamanın örnekleri MsalDistributedTokenCacheAdapterOptions.Encrypt ayarlandığında belirteçlerin true şifresini çözebilir.

Note

Erken geliştirme ve tek bir makinede yerel test için Encrypt öğesini false olarak ayarlayabilir ve daha sonra paylaşılan bir Veri Koruma anahtar halkasını yapılandırabilirsiniz.

options.Encrypt = false;

Geliştirme ve test döneminin ilerleyen bölümlerinde belirteç şifrelemesini etkinleştirin ve paylaşılan bir Data Protection anahtar halkasını benimseyin.

Aşağıdaki örnekte, paylaşılan anahtar halkası için Azure Blob Depolama ve Azure Key Vault'un (PersistKeysToAzureBlobStorage/ProtectKeysWithAzureKeyVault) nasıl kullanılacağı gösterilmektedir. Hizmet yapılandırmaları, gösterim amacıyla temel durum senaryolarıdır. Üretim uygulamalarını dağıtmadan önce Azure hizmetleri hakkında bilgi edinin ve bu bölümün sonunda bağlantılı olan Azure hizmetlerinin ayrılmış belge kümelerini kullanarak en iyi yöntemleri benimseyin.

Aşağıdaki paketleri Blazor Web App öğesinin sunucu projesine ekleyin:

Note

.NET uygulamalarına paket ekleme yönergeleri için Paket tüketimi iş akışı (NuGet belgeleri) sayfasındaki Paketleri yükleme ve yönetme altındaki makalelere bakın. NuGet.org'de doğru paket sürümlerini onaylayın.

Note

Aşağıdaki adımlara devam etmeden önce uygulamanın Microsoft Entra'ya kaydedildiğini onaylayın.

Veri koruma anahtarlarını korumak için Azure Blob Depolama'yı yapılandırın. ASP.NET Core'daki Anahtar depolama sağlayıcıları'ndaki yönergeleri izleyin.

Sabit durumdaki veri koruma anahtarlarını şifrelemek için Azure Key Vault'u yapılandırın. ASP.NET Çekirdek Veri Korumasını Yapılandırma'daki yönergeleri izleyin.

Hizmetlerin kaydedildiği dosyada Program aşağıdaki kodu kullanın:

TokenCredential? credential;

if (builder.Environment.IsProduction())
{
    credential = new ManagedIdentityCredential("{MANAGED IDENTITY CLIENT ID}");
}
else
{
    // Local development and testing only
    DefaultAzureCredentialOptions options = new()
    {
        // Specify the tenant ID to use the dev credentials when running the app locally
        // in Visual Studio.
        VisualStudioTenantId = "{TENANT ID}",
        SharedTokenCacheTenantId = "{TENANT ID}"
    };

    credential = new DefaultAzureCredential(options);
}

builder.Services.AddDataProtection()
    .SetApplicationName("{APPLICATION NAME}")
    .PersistKeysToAzureBlobStorage(new Uri("{BLOB URI}"), credential)
    .ProtectKeysWithAzureKeyVault(new Uri("{KEY IDENTIFIER}"), credential);

{MANAGED IDENTITY CLIENT ID}: Azure Yönetilen Identity İstemci Kimliği (GUID).

{TENANT ID}: Kiracı Kimliği.

{APPLICATION NAME}: SetApplicationName bu uygulamanın benzersiz adını veri koruma sistemi içinde ayarlar. Değer, uygulamanın dağıtımları arasında eşleşmelidir.

{BLOB URI}: Anahtar dosyasının tam URI'si. URI, anahtar dosyasını oluşturduğunuzda Azure Depolama tarafından oluşturulur. SAS kullanmayın.

{KEY IDENTIFIER}: Anahtar şifrelemesi için kullanılan Azure Key Vault anahtar tanımlayıcısı. Bir erişim ilkesi, uygulamanın Get, Unwrap Key ve Wrap Key izinleriyle anahtar kasasına erişmesini sağlar. Anahtar tanımlayıcısı oluşturulduktan sonra Entra veya Azure portalındaki anahtardan alınır. Anahtar kasası anahtarının otomatik olarak yeniden kullanılmasını etkinleştirirseniz, uygulamanın anahtar kasası yapılandırmasında, tanımlayıcının sonuna anahtar GUID'sinin yerleştirilmediği sürümsüz anahtar tanımlayıcısı kullandığınızdan emin olun (örnek: https://contoso.vault.azure.net/keys/data-protection).

Note

Üretim dışı ortamlarda, önceki örnek Azure barındırma ortamlarında kullanılan kimlik bilgilerini yerel geliştirmede kullanılan kimlik bilgileriyle birleştirerek Azure'a dağıtım yapan uygulamalar geliştirirken kimlik doğrulamasını basitleştirmek için kullanır DefaultAzureCredential . Üretime geçerken, önceki örnekte gösterilen gibi ManagedIdentityCredential bir alternatif daha iyi bir seçimdir. Daha fazla bilgi için bkz. Sistem tarafından atanan yönetilen kimliği kullanarak Azure kaynaklarına Azure tarafından barındırılan .NET uygulamalarının kimliğini doğrulama.

Bir kullanıcı adına çağrı yapıldığında IDownstreamApi enjekte edin ve CallApiForUserAsync çağırın.

internal sealed class ServerWeatherForecaster(IDownstreamApi downstreamApi) : IWeatherForecaster
{
    public async Task<IEnumerable<WeatherForecast>> GetWeatherForecastAsync()
    {
        var response = await downstreamApi.CallApiForUserAsync("DownstreamApi",
            options =>
            {
                options.RelativePath = "/weather-forecast";
            });

        return await response.Content.ReadFromJsonAsync<WeatherForecast[]>() ??
            throw new IOException("No weather forecast!");
    }
}

Bu yaklaşım, bu makalenin BlazorWebAppEntraBlazorWebAppEntraBff bölümünde açıklanan ve örnek uygulamalar tarafından kullanılır.

Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

Örnek uygulamalar

Çalışan örnekler için GitHub deposunda () aşağıdaki örnek uygulamalara Blazor bakın (dotnet/blazor-samplesindirme).

BlazorWebAppCallWebApi

Bir Blazor Web App dışındaki (içinde değil Blazor Web App) yapılacaklar listesi web API'sini çağırın:

  • Backend: Minimum API'leri temel alan bir yapılacaklar listesi tutmak için bir web API uygulaması. Web API'si uygulaması, büyük olasılıkla farklı bir sunucuda barındırılan Blazor Web Appuygulamasından ayrı bir uygulamadır.
  • BlazorApp / BlazorApp.Client Blazor Web App: Yapılacaklar listesi işlemleri için öğe oluşturma, okuma, güncelleştirme ve silme (CRUD) gibi, yapılacaklar listesinden HttpClient web API'sini çağıran bir uygulama.

İstemci tarafı işleme (CSR), CsR'yi benimseyen Etkileşimli WebAssembly bileşenlerini ve Otomatik bileşenleri içerirken, çağrılar, istemci projesinin HttpClient dosyasında önceden yapılandırılmış Program kayıtlı bir şekildedir (BlazorApp.Client):

builder.Services.AddScoped(sp =>
    new HttpClient
    {
        BaseAddress = new Uri(builder.Configuration["FrontendUrl"] ?? 
            "https://localhost:5002")
    });

Önceden oluşturulmuş ve etkileşimli Sunucu bileşenlerini, önceden oluşturulmuş WebAssembly bileşenlerini ve önceden oluşturulmuş veya SSR'yi benimsemiş Otomatik bileşenleri içeren sunucu tarafı işleme (SSR) için, çağrılar sunucu projesinin HttpClient dosyasında kayıtlı Program ile yapılır (BlazorApp):

builder.Services.AddHttpClient();

Sunucu projesinde Blazor Web App bulunan API'nın, Blazor Web App içindeki bir iç film listesi API'sini çağırın.

  • BlazorApp: Bir Blazor Web App film listesi tutan:
    • sunucudaki uygulama içindeki film listesinde işlemler gerçekleştirildiğinde, sıradan API çağrıları kullanılır.
    • API çağrıları web tabanlı bir istemci tarafından yapıldığında, en düşük API'leri temel alan film listesi işlemleri için bir web API'si kullanılır.
  • BlazorApp.Client: Kullanıcıların film listesi yönetimi için Interactive WebAssembly ve Auto bileşenlerini içeren Blazor Web App istemci projesi.

CSR'yi benimseyen Etkileşimli WebAssembly bileşenlerini ve Otomatik bileşenleri içeren CSR için, API'ye çağrılar istemci projesinin () dosyasında önceden yapılandırılmış ClientMovieService bir kayıtlı HttpClient kullanan istemci tabanlı hizmet (ProgramBlazorApp.Client) aracılığıyla yapılır. Bu çağrılar genel veya özel bir web üzerinden yapıldığından, film listesi API'si bir web API'sidir.

Aşağıdaki örnek, uç noktadan film /movies listesini elde eder:

public class ClientMovieService(HttpClient http) : IMovieService
{
    public async Task<Movie[]> GetMoviesAsync(bool watchedMovies) => 
        await http.GetFromJsonAsync<Movie[]>("movies") ?? [];
}

Önceden oluşturulmuş ve etkileşimli Sunucu bileşenlerini, önceden yenilenen WebAssembly bileşenlerini ve önceden hazırlanmış veya SSR'yi benimsemiş Otomatik bileşenleri içeren SSR için, çağrılar doğrudan sunucu tabanlı bir hizmet (ServerMovieService üzerinden yapılır). API bir ağa güvenmediğinden film listesi CRUD işlemleri için standart bir API'dir.

Aşağıdaki örnek bir film listesi elde eder:

public class ServerMovieService(MovieContext db) : IMovieService
{
    public async Task<Movie[]> GetMoviesAsync(bool watchedMovies) => 
        watchedMovies ? 
        await db.Movies.Where(t => t.IsWatched).ToArrayAsync() : 
        await db.Movies.ToArrayAsync();
}

Film verilerini bu senaryoda nasıl güvenli hale getireceğinizle ilgili daha fazla bilgi için, Etkileşimli Otomatik işleme ile Blazor Web Apps içindeki verileri güvenli hale getirmek üzere açıklanan hava durumu verileri örneğine bakın.

BlazorWebAppCallWebApi_Weather

Hava durumu verileri için akış işleme kullanan bir hava durumu verisi örnek uygulaması.

BlazorWebAssemblyCallWebApi

Bir Blazor WebAssembly uygulaması, yapılacaklar listesi web API'sini çağırır.

  • Backend: Minimum API'leri temel alan bir yapılacaklar listesi tutmak için bir web API uygulaması.
  • BlazorTodo: Yapılacaklar listesi CRUD işlemleri için önceden yapılandırılmış Blazor WebAssembly bir web API'sini çağıran HttpClient uygulama.

BlazorWebAssemblyStandaloneWithIdentity

ASP.NET Core Blazor WebAssemblyile güvenliği sağlanan tek başına Identity bir uygulama:

  • Backend: ASP.NET Core Identityiçin kullanıcı kimlik deposu tutan bir arka uç web API'si uygulaması.
  • BlazorWasmAuth: Kullanıcı kimlik doğrulamasına sahip tek başına Blazor WebAssembly bir ön uç uygulaması.

Çözüm, aşağıdakiler için güvenli bir web API'sini çağırmayı gösterir:

  • Kimliği doğrulanmış bir kullanıcının rollerini alma.
  • Kimliği doğrulanmış tüm kullanıcılar için veri işleme.
  • Yetkilendirme Manager aracılığıyla yetkili kullanıcılar için veri işleme (kullanıcı rolde olmalıdır).

BlazorWebAppOidc

Microsoft Entra ile OIDC kimlik doğrulaması kullanan ve Entra'ya özgü paketleri kullanmadan küresel otomasyon etkileşimine sahip bir Blazor Web App. Örnek, dış güvenli web API'sini çağırmak üzere web API çağrıları için belirteç işleyicisinin nasıl kullanılacağını gösterir.

BlazorWebAppOidcServer

Blazor Web App küresel Etkileşimli Sunucu etkileşimi ile, Entra'ya özgü paketleri kullanmadan Microsoft Entra aracılığıyla OIDC kimlik doğrulaması kullanır. ** Örnek, bir dış güvenli web API'sini çağırmak için erişim belirtecinin nasıl geçirileceğini göstermektedir.

BlazorWebAppOidcBff

Küresel otomatik etkileşimi kullanan bir Blazor Web App:

  • Entra'ya özgü paketler kullanmadan Microsoft Entra ile OIDC kimlik doğrulaması.
  • Ön uç uygulamaları veya arabirimleri için arka uç hizmetleri oluşturan bir uygulama geliştirme deseni olan Ön Uç İçin Arka Uç (BFF) yaklaşımı.

Çözüm, etkileşimli otomatik işlemeyi benimseyen bir bileşen istemcide işlendiğinde dış web API'si aracılığıyla hava durumu verilerini güvenli bir şekilde elde etme gösterimini içerir.

BlazorWebAppEntra

Blazor Web App Microsoft Entra Id için Microsoft Web paketleriyle Microsoft Identitykimlik platformlarını kullanan genel Otomatik etkileşime sahip bir. Çözüm, etkileşimli otomatik işlemeyi benimseyen bir bileşen istemcide işlendiğinde dış web API'si aracılığıyla hava durumu verilerini güvenli bir şekilde elde etme gösterimini içerir.

BlazorWebAppEntraBff

Küresel otomatik etkileşimi kullanan bir Blazor Web App:

Çözüm, etkileşimli otomatik işlemeyi benimseyen bir bileşen istemcide işlendiğinde dış web API'si aracılığıyla hava durumu verilerini güvenli bir şekilde elde etme gösterimini içerir.

HttpRequestMessage, HttpResponseMessage ve HttpClient'nın elden çıkarılması

HttpRequestMessage gövdesi olmayan bir örnek, açık bir bertaraf etme gerektirmez. Ancak, aşağıdaki yöntemlerden biriyle bertaraf edebilirsiniz.

  • using declaration (C# 8 ve sonrası):

    using var request = new HttpRequestMessage(...);
    
  • using blok (tüm C# sürümleri):

    using (var request = new HttpRequestMessage(...))
    {
        ...
    }
    

Aşağıdaki nedenlerle her kullanımda HttpRequestMessage'lerin atılması önerilir:

  • Sonlandırıcılardan kaçınarak performans geliştirmesi elde etmek.
  • İlk başta bir istek gövdesi olmayan bir HttpRequestMessage için sonradan bir istek gövdesi eklenebileceği durumunda kodun gelecekte sağlamlaşmasını sağlar.
  • İşlevsel sorunlardan kaçınmak için bir vekil işleyici Dispose/DisposeAsync çağrısını bekliyorsa.
  • Her yere genel bir kural uygulamak, belirli durumları hatırlamaya çalışmaktan daha kolaydır.

Her zaman örnekleri HttpResponseMessage atın.

Hiçbir zamanHttpClient çağrılarak oluşturulan örnekleri CreateClient atmayın çünkü bunlar çerçeve tarafından yönetilir.

Example:

using var request = new HttpRequestMessage(HttpMethod.Get, "/weather-forecast");
var client = clientFactory.CreateClient("ExternalApi");
using var response = await client.SendAsync(request);

Dış web API'lerini çağırmak için istemci tarafı senaryoları

İstemci tabanlı bileşenler, genellikle HttpClient dosyasına kaydedilmiş önceden yapılandırılmış bir HttpClient ile oluşturulan Program örneklerini kullanarak dış web API'lerini çağırır:

builder.Services.AddScoped(sp => 
    new HttpClient
    { 
        BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) 
    });

Aşağıdaki Razor bileşen, ASP.NET Core'da IHttpClientFactory kullanarak HTTP isteğinde bulunma makalesindeki Temel Kullanım örneğine benzer şekilde GitHub dalları için bir web API'sine istekte bulunur.

CallWebAPI.razor:

@page "/call-web-api"
@using System.Text.Json
@using System.Text.Json.Serialization
@inject HttpClient Client

<h1>Call web API from a Blazor WebAssembly Razor component</h1>

@if (getBranchesError || branches is null)
{
    <p>Unable to get branches from GitHub. Please try again later.</p>
}
else
{
    <ul>
        @foreach (var branch in branches)
        {
            <li>@branch.Name</li>
        }
    </ul>
}

@code {
    private IEnumerable<GitHubBranch>? branches = [];
    private bool getBranchesError;
    private bool shouldRender;

    protected override bool ShouldRender() => shouldRender;

    protected override async Task OnInitializedAsync()
    {
        using var request = new HttpRequestMessage(HttpMethod.Get,
            "https://api.github.com/repos/dotnet/AspNetCore.Docs/branches");
        request.Headers.Add("Accept", "application/vnd.github.v3+json");
        request.Headers.Add("User-Agent", "HttpClientFactory-Sample");

        using var response = await Client.SendAsync(request);

        if (response.IsSuccessStatusCode)
        {
            using var responseStream = await response.Content.ReadAsStreamAsync();
            branches = await JsonSerializer.DeserializeAsync
                <IEnumerable<GitHubBranch>>(responseStream);
        }
        else
        {
            getBranchesError = true;
        }

        shouldRender = true;
    }

    public class GitHubBranch
    {
        [JsonPropertyName("name")]
        public string? Name { get; set; }
    }
}

Yukarıdaki C# 12 veya üzeri örnekte, değişken için [] boş bir dizi (branches) oluşturulur. .NET 8'den önceki bir SDK ile derlenmiş önceki C# sürümleri için boş bir dizi (Array.Empty<GitHubBranch>()) oluşturun.

.NET/C# kodunu ve verilerini korumak için sunucu tarafı ASP.NET Core arka uç web API'si ile ASP.NET Core Data Protection özelliklerini kullanın. İstemci tarafı Blazor WebAssembly uygulaması, güvenli uygulama özellikleri ve veri işleme için sunucu tarafı web API'sini çağırır.

Blazor WebAssembly uygulamaların genellikle Çıkış Noktaları Arası İstek Paylaşımı (CORS) güvenliği nedeniyle web API'lerine çıkış noktaları arasında doğrudan çağrılar yapması engellenir. Tipik bir özel durum aşağıdaki gibi görünür:

İstemci adresi '{URL}' konumundan veri getirme erişimi, CORS politikası tarafından engellendi: İstenen kaynakta 'Access-Control-Allow-Origin' başlığı bulunmuyor. Opak yanıt gereksinimlerinize uygunsa, CORS devre dışı bırakılmış olan kaynağı getirmek için isteğin modunu 'cors yok' olarak ayarlayın.

Önceki özel durumu aşmak isteyen SetBrowserRequestMode (1) BrowserRequestMode alanıyla NoCors çağırsanız bile, istek genellikle web API'sinin kaynağındaki CORS kısıtlamaları nedeniyle başarısız olur( örneğin, yalnızca belirli kaynaklardan gelen çağrılara izin veren bir kısıtlama veya JavaScript'in tarayıcıdan gelen istekleri fetch engelleyen bir kısıtlama). Bu tür çağrıların başarılı olabilmesi için, çağrısını yaptığınız web API'sinin, orijininizin kendi orijinini doğru CORS yapılandırmasıyla çağırmasına izin vermesi gereklidir. Dış web API'lerinin çoğu CORS ilkelerini yapılandırmanıza izin vermez. Bu kısıtlamayla başa çıkmak için aşağıdaki stratejilerden birini benimseyin:

  • Kendi sunucu tarafı ASP.NET Core arka uç web API'nizi koruyun. İstemci tarafı Blazor WebAssembly uygulaması sunucu tarafı web API'nizi çağırır ve web API'niz sunucu tabanlı C# kodundan (tarayıcı değil) doğru CORS üst bilgileriyle dış web API'sine istekte bulunur ve sonucu istemci tarafı Blazor WebAssembly uygulamanıza döndürür.

  • İstemci tarafı Blazor WebAssembly uygulamasından gelen isteği dış web API'sine proxy yapmak için bir proxy hizmeti kullanın. Proxy hizmeti, istemci adına istekte bulunmak için sunucu tarafı bir uygulama kullanır ve çağrı başarılı olduktan sonra sonucu döndürür. CloudFlare'ın CORS PROXY'sini temel alan aşağıdaki örnekte, {REQUEST URI} yer tutucu istek URI'sidir:

    @using System.Net
    @inject IHttpClientFactory ClientFactory
    
    ...
    
    @code {
        public async Task CallApi()
        {
            var client = ClientFactory.CreateClient();
    
            var urlEncodedRequestUri = WebUtility.UrlEncode("{REQUEST URI}");
    
            using var request = new HttpRequestMessage(HttpMethod.Get, 
                $"https://corsproxy.io/?{urlEncodedRequestUri}");
    
            using var response = await client.SendAsync(request);
    
            ...
        }
    }
    

Dış web API'lerini çağırmak için sunucu tarafı senaryoları

Sunucu tabanlı bileşenler, genellikle HttpClient kullanılarak oluşturulan IHttpClientFactory örnekleri kullanarak dış web API'lerini çağırır. Sunucu tarafı uygulamalarına yönelik yönergeler için bkz. ASP.NET Core'da IHttpClientFactory kullanarak HTTP isteklerinde bulunma.

Sunucu tarafı bir uygulama bir HttpClient hizmeti içermez. Uygulamaya fabrika altyapısını kullanarak bir sağlayın.

Program dosyasında:

builder.Services.AddHttpClient();

Aşağıdaki Razor bileşen, ASP.NET Core'da IHttpClientFactory kullanarak HTTP isteğinde bulunma makalesindeki Temel Kullanım örneğine benzer şekilde GitHub dalları için bir web API'sine istekte bulunur.

CallWebAPI.razor:

@page "/call-web-api"
@using System.Text.Json
@using System.Text.Json.Serialization
@inject IHttpClientFactory ClientFactory

<h1>Call web API from a server-side Razor component</h1>

@if (getBranchesError || branches is null)
{
    <p>Unable to get branches from GitHub. Please try again later.</p>
}
else
{
    <ul>
        @foreach (var branch in branches)
        {
            <li>@branch.Name</li>
        }
    </ul>
}

@code {
    private IEnumerable<GitHubBranch>? branches = [];
    private bool getBranchesError;
    private bool shouldRender;

    protected override bool ShouldRender() => shouldRender;

    protected override async Task OnInitializedAsync()
    {
        using var request = new HttpRequestMessage(HttpMethod.Get,
            "https://api.github.com/repos/dotnet/AspNetCore.Docs/branches");
        request.Headers.Add("Accept", "application/vnd.github.v3+json");
        request.Headers.Add("User-Agent", "HttpClientFactory-Sample");

        var client = ClientFactory.CreateClient();

        using var response = await client.SendAsync(request);

        if (response.IsSuccessStatusCode)
        {
            using var responseStream = await response.Content.ReadAsStreamAsync();
            branches = await JsonSerializer.DeserializeAsync
                <IEnumerable<GitHubBranch>>(responseStream);
        }
        else
        {
            getBranchesError = true;
        }

        shouldRender = true;
    }

    public class GitHubBranch
    {
        [JsonPropertyName("name")]
        public string? Name { get; set; }
    }
}

Yukarıdaki C# 12 veya üzeri örnekte, değişken için [] boş bir dizi (branches) oluşturulur. .NET 8'den önceki bir SDK ile derlenmiş önceki C# sürümleri için boş bir dizi (Array.Empty<GitHubBranch>()) oluşturun.

Ek bir çalışma örneği için, ASP.NET Core Blazor dosya yüklemeleri makalesindeki dosyaları bir web API denetleyicisine yükleyen sunucu tarafı dosya yükleme örneğine bakın.

Web API çağrıları için hizmet özetleri

Bu bölüm, sunucu projesinde bir web API'sini koruyan veya web API çağrılarını dış web API'sine dönüştürenler için geçerlidir Blazor Web App.

Etkileşimli WebAssembly ve Otomatik işleme modlarını kullanırken, bileşenler varsayılan olarak önceden oluşturulur. Paket istemciye indirilmeden ve istemci tarafı çalışma zamanı etkinleştirilmeden önce Blazor otomatik bileşenler başlangıçta sunucudan etkileşimli olarak işlenir. Bu, bu işleme modlarını kullanan bileşenlerin hem istemciden hem de sunucudan başarıyla çalışacak şekilde tasarlanması gerektiği anlamına gelir. Bileşenin istemcide çalışırken sunucu proje tabanlı API'yi çağırması veya bir isteği dış web API'sine dönüştürmesi gerekiyorsa (dış web API'sinin Blazor Web Appdışındadır), önerilen yaklaşım bu API çağrısını bir hizmet arabiriminin arkasında soyutlayıp hizmetin istemci ve sunucu sürümlerini uygulamaktır:

  • İstemci sürümü, HttpClient önceden yapılandırılmış olarak web API'sini çağırır.
  • Sunucu sürümü genellikle sunucu tarafı kaynaklarına doğrudan erişebilir. Ağ isteği normalde gereksiz olduğundan, sunucuya geri çağrı yapan sunucuya bir HttpClient ekleme önerilmez. Alternatif olarak, API sunucu projesinin dışında olabilir, ancak isteği bir şekilde dönüştürmek için sunucu için bir hizmet soyutlaması gerekir; örneğin, bir prxied isteğine erişim belirteci eklemek için.

WebAssembly işleme modunu kullanırken, bileşenler yalnızca istemciden işlendiğinden, ön kayıt işlemini devre dışı bırakma seçeneğiniz de vardır. Daha fazla bilgi için bkz. Prerender ASP.NET Core Razor bileşenleri.

Örnekler (örnek uygulamalar):

  • Örnek uygulamadaki BlazorWebAppCallWebApi film listesi web API'si.
  • Örnek uygulamada akış tabanlı hava durumu verilerini işleyen web API'si BlazorWebAppCallWebApi_Weather.
  • BFF olmayan desen için BlazorWebAppOidc veya BFF deseni için BlazorWebAppOidcBff örnek uygulamalarında istemciye döndürülen hava durumu verileri. Bu uygulamalar güvenli (web) API çağrılarını gösterir. Daha fazla bilgi için bkz . OpenID Connect (OIDC) ile ASP.NET Çekirdeğinin Blazor Web App güvenliğini sağlama.

Blazor Web App dış web API'leri

Bu bölüm, büyük olasılıkla farklı bir sunucuda barındırılan ayrı (dış) bir proje tarafından tutulan bir web API'sini çağıran için geçerlidir Blazor Web App.

Blazor Web Apps genellikle istemci tarafı WebAssembly bileşenlerini önceden işlerken, Auto bileşenler statik ya da etkileşimli sunucu tarafı işleme (SSR) sırasında sunucuda işlenir. HttpClient hizmetleri varsayılan olarak bir Blazor Web App'nin ana projesine kaydedilmez. Uygulama, sadece HttpClient projede .Client kayıtlı hizmetlerle, HttpClient bölümünde açıklandığı gibi çalıştırılıyorsa, uygulamanın yürütülmesi bir çalışma zamanı hatasıyla sonuçlanır:

InvalidOperationException: '... türünde, 'Http' özelliği için bir değer sağlanamıyor. {COMPONENT}'. 'System.Net.Http.HttpClient' türünde kayıtlı hizmet yok.

Aşağıdaki yaklaşımlardan birini kullanın:

  • HttpClient SSR sırasında kullanılabilir duruma getirmek için HttpClient hizmetlerini sunucu projesine ekleyin. Sunucu projesinin Program dosyasında aşağıdaki hizmet kaydını kullanın:

    builder.Services.AddHttpClient();
    

    HttpClient hizmetleri paylaşılan çerçeve tarafından sağlandığından, uygulamanın proje dosyasında paket başvurusu gerekmez.

    Örnek: Örnek uygulamada yapılacaklar listesi web API'si BlazorWebAppCallWebApi

  • Web API'sini çağıran bir WebAssembly bileşeni için prerendering gerekli değilse, Prerender ASP.NET Core Razor bileşenleri'ndeki yönergeleri izleyerek prerendering'i devre dışı bırakın. Bu yaklaşımı benimserseniz, bileşen sunucuda önceden önyüklenmemiş olduğundan, HttpClient hizmetlerini Blazor Web App ana projeye eklemeniz gerekmez.

Daha fazla bilgi için, Ön oturum açma makalesininÖn oturum açma sırasında İstemci tarafı hizmetleri çözümlenememesi bölümüne bakın.

Önceden oluşturulmuş veriler

Ön işlem sırasında bileşenler iki kez işlenir: önce statik, sonra etkileşimli. Durum, önceden hazırlanmış bileşenden etkileşimli bileşene otomatik olarak geçmiyor. Bir bileşen zaman uyumsuz başlatma işlemleri gerçekleştiriyorsa ve başlatma sırasında "Yükleniyor..." gibi farklı durumlar için farklı içerik işleniyorsa ilerleme göstergesi, bileşen iki kez işlendiğinde titreme görebilirsiniz.

Kalıcı Bileşen Durumu API'sini BlazorWebAppCallWebApi ve BlazorWebAppCallWebApi_Weatherörnek uygulamaların gösterdiği gibi kullanarak önceden oluşturulmuş durumu aktararak bu sorunu çözebilirsiniz. Bileşen etkileşimli çalıştığında, aynı durumu kullanarak aynı şekilde çalışabilir. Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

Note

Kalıcı Bileşen Durumu API'si yalnızca .NET 10 veya sonraki sürümlerde gelişmiş gezintiyi destekler. .NET 8 veya .NET 9'u hedefleyen uygulamalar için, data-enhance-nav özniteliği false olarak ayarlanmış sayfa bağlantılarında gelişmiş gezintiyi devre dışı bırakabilirsiniz. Daha fazla bilgi için bkz. ASP.NET Temel Blazor yönlendirme ve gezinti.

İstemci tarafında istek akışı

HTTP/2 protokolü ve HTTPS kullanan Chromium tabanlı tarayıcılar (örneğin, Google Chrome ve Microsoft Edge) için istemci tarafıBlazor, istek akışına izin vermek için Streams API'sini kullanır.

İstek akışını etkinleştirmek için SetBrowserRequestStreamingEnabledüzerindeki trueHttpRequestMessage'e ayarlayın.

Aşağıdaki dosya yükleme örneği:

using var request = new HttpRequestMessage(HttpMethod.Post, "/Filesave");
request.SetBrowserRequestStreamingEnabled(true);
request.Content = content;

using var response = await Http.SendAsync(request);

Akış istekleri:

  • HTTPS protokolü iste ve HTTP/1.x üzerinde çalışma.
  • Ana metin ekleyin, ancak Content-Length üst bilgisi eklemeyin. Çapraz kaynak akış istekleri için önden denetim isteği gerektiren CORS gereklidir.

Bir InputFile bileşenle dosya yüklemeleri hakkında daha fazla bilgi için bkz. ASP.NET Çekirdek Blazor dosya yüklemeleri ve İstemci tarafı işleme (CSR) ile dosyaları sunucuya yükleme.

HttpClient Hizmeti ekle

Bu bölümdeki yönergeler istemci tarafı senaryoları için geçerlidir.

İstemci tarafı bileşenleri, kaynak sunucuya geri istek göndermeye odaklanan HttpClient önceden yapılandırılmış bir hizmet kullanarak web API'lerini çağırır. Geliştirici kodunda diğer web API'leri için ek HttpClient hizmet yapılandırmaları oluşturulabilir. İstekler JSON yardımcıları kullanılarak Blazor veya ile HttpRequestMessageoluşturulur. İstekler , Fetch API seçeneği yapılandırmasını içerebilir.

Bu bölümdeki yapılandırma örnekleri yalnızca uygulamadaki tek bir örnek için tek HttpClient bir web API'sinin çağrıldığında yararlıdır. Uygulamanın her biri kendi temel adresine ve yapılandırmasına sahip birden çok web API'sini çağırması gerektiğinde, bu makalenin devamında ele alınan aşağıdaki yaklaşımları benimseyebilirsiniz:

Program dosyasında, uygulamayı oluşturmak için kullanılan bir HttpClient proje şablonundan henüz mevcut değilse bir Blazor hizmeti ekleyin.

builder.Services.AddScoped(sp => 
    new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

Önceki örnek, builder.HostEnvironment.BaseAddress etiketi ile uygulamanın temel adresini ayarlar. Bu adres, genellikle ana bilgisayar sayfasındaki etiketin IWebAssemblyHostEnvironment.BaseAddress değerinden türetilen <base> (href) temel adresidir.

İstemcinin kendi temel adresini kullanmaya yönelik en yaygın kullanım örnekleri şunlardır:

  • (.NET 8 veya üzeri) .Client istemci projesi, Blazor Web App WebAssembly bileşenlerinden veya WebAssembly'de istemcide çalışan koddan sunucu uygulamasındaki API'lere web API çağrıları yapar.
  • Barındırılan Client bir uygulamanın istemci projesi (Blazor WebAssembly), sunucu projesine (Server) web API çağrıları yapar. Barındırılan Blazor WebAssembly proje şablonunun artık .NET 8 veya sonraki sürümlerde kullanılamadığını unutmayın. Ancak barındırılan Blazor WebAssembly uygulamalar .NET 8 için desteklenmeye devam etmektedir.

Dış web API'sini çağırıyorsanız (istemci uygulamasıyla aynı URL alanında değil), URI'yi web API'sinin temel adresine ayarlayın. Aşağıdaki örnek, ayrı bir web API uygulamasının çalıştığı ve istemci uygulamasından gelen isteklere yanıt vermeye hazır olduğu web API'sinin temel adresini https://localhost:5001 olarak ayarlar.

builder.Services.AddScoped(sp => 
    new HttpClient { BaseAddress = new Uri("https://localhost:5001") });

JSON yardımcıları

HttpClient kaynak sunucuya geri istek göndermek için önceden yapılandırılmış bir hizmet olarak kullanılabilir.

HttpClient ve JSON yardımcıları (System.Net.Http.Json.HttpClientJsonExtensions), üçüncü taraf web API'leri uç noktalarını çağırmak için de kullanılır. HttpClient tarayıcının Fetch API'si kullanılarak uygulanır ve bu makalenin devamında Çıkış Noktaları Arası Kaynak Paylaşımı (CORS) bölümünde açıklanan aynı kaynak ilkesinin uygulanması da dahil olmak üzere sınırlamalarına tabidir.

İstemcinin temel adresi, kaynak sunucunun adresine ayarlanır. HttpClient örneğini @inject yönergesini kullanarak bir bileşene ekleme:

@using System.Net.Http
@inject HttpClient Http

System.Net.Http.Json ad alanını kullanarak HttpClientJsonExtensions öğesine erişebilir, GetFromJsonAsync, PutAsJsonAsync ve PostAsJsonAsync dâhil olmak üzere erişim sağlayabilirsiniz.

@using System.Net.Http.Json

Aşağıdaki bölümlerde JSON yardımcıları ele alınıyor:

System.Net.Http HTTP istekleri göndermek ve HTTP yanıtları almak için, örneğin DELETE isteği göndermek için ek yöntemler içerir. Daha fazla bilgi için DELETE ve ek uzantı yöntemleri bölümüne bakın.

JSON'dan GET (GetFromJsonAsync)

GetFromJsonAsync bir HTTP GET isteği gönderir ve nesne oluşturmak için JSON yanıt gövdesini ayrıştırır.

Aşağıdaki bileşen kodunda todoItems , bileşeni tarafından görüntülenir. GetFromJsonAsync bileşenin başlatılması tamamlandığında çağrılır (OnInitializedAsync).

todoItems = await Http.GetFromJsonAsync<TodoItem[]>("todoitems");

POST'u JSON olarak (PostAsJsonAsync)

PostAsJsonAsync belirtilen URI'ye, istek gövdesinde JSON olarak serileştirilmiş değeri içeren bir POST isteği gönderir.

Aşağıdaki bileşen kodunda, newItemName bileşenin bağlı bir öğesi tarafından sağlanır. AddItem yöntemi bir <button> öğe seçilerek tetikleniyor.

await Http.PostAsJsonAsync("todoitems", addItem);

PostAsJsonAsync bir HttpResponseMessage döndürür. Yanıt iletisinden JSON içeriğini seri durumdan çıkarmak için uzantı yöntemini kullanın ReadFromJsonAsync . Aşağıdaki örnekte JSON hava durumu verileri bir dizi olarak okunur:

var content = await response.Content.ReadFromJsonAsync<WeatherForecast[]>() ?? 
    Array.Empty<WeatherForecast>();

PUT işlemi JSON olarak (PutAsJsonAsync)

PutAsJsonAsync JSON ile kodlanmış içeriğe sahip bir HTTP PUT isteği gönderir.

Aşağıdaki bileşen kodunda, editItem ve Name için IsCompleted değerleri bileşenin bağlı öğeleri tarafından sağlanır. Öğe kullanıcı arayüzünün başka bir bölümünde seçildiğinde (gösterilmeyen) Id ayarlanır ve EditItem çağrılır. SaveItem yöntemi, <button> öğesi seçilerek tetiklenir. Aşağıdaki örnekte, kısalık adına yükleme todoItems gösterilmiyor. Öğeleri yükleme örneği için JSON'dan GET (GetFromJsonAsync) bölümüne bakın.

await Http.PutAsJsonAsync($"todoitems/{editItem.Id}", editItem);

PutAsJsonAsync bir HttpResponseMessage döndürür. Yanıt iletisinden JSON içeriğini seri durumdan çıkarmak için uzantı yöntemini kullanın ReadFromJsonAsync . Aşağıdaki örnekte JSON hava durumu verileri bir dizi olarak okunur:

var content = await response.Content.ReadFromJsonAsync<WeatherForecast[]>() ?? 
    Array.Empty<WeatherForecast>();

PATCH JSON olarak (PatchAsJsonAsync)

PatchAsJsonAsync JSON ile kodlanmış içeriğe sahip bir HTTP PATCH isteği gönderir.

Note

Daha fazla bilgi için bkz. ASP.NET Core web API'sinde JsonPatch.

Aşağıdaki örnekte, PatchAsJsonAsync bir JSON PATCH belgesini escape karakterleri içeren düz metin dizesi olarak kabul eder.

await Http.PatchAsJsonAsync(
    $"todoitems/{id}", 
    "[{\"operationType\":2,\"path\":\"/IsComplete\",\"op\":\"replace\",\"value\":true}]");

C# 11 (.NET 7) itibarıyla, bir JSON dizesini ham dize değişmezi olarak yazabilirsiniz. Kod çözümleme araçları için StringSyntaxAttribute.Json alanında JSON söz dizimini, [StringSyntax] özniteliğine belirtin:

@using System.Diagnostics.CodeAnalysis

...

@code {
    [StringSyntax(StringSyntaxAttribute.Json)]
    private const string patchOperation =
        """[{"operationType":2,"path":"/IsComplete","op":"replace","value":true}]""";

    ...

    await Http.PatchAsJsonAsync($"todoitems/{id}", patchOperation);
}

PatchAsJsonAsync bir HttpResponseMessage döndürür. Yanıt iletisinden JSON içeriğini seri durumdan çıkarmak için uzantı yöntemini kullanın ReadFromJsonAsync . Aşağıdaki örnekte JSON todo öğesi verileri bir dizi olarak okunur. yöntemi tarafından hiçbir öğe verisi döndürülmezse boş bir dizi oluşturulur, bu nedenle content deyim yürütüldükten sonra null olmaz:

using var response = await Http.PatchAsJsonAsync(...);
var content = await response.Content.ReadFromJsonAsync<TodoItem[]>() ??
    Array.Empty<TodoItem>();

Girinti, aralık ve sıralanmamış tırnak işaretleriyle düzenlenmiş kodlanmamış PATCH belgesi aşağıdaki JSON olarak görünür:

[
  {
    "operationType": 2,
    "path": "/IsComplete",
    "op": "replace",
    "value": true
  }
]

Patch istekleri veren uygulamada PATCH belgelerinin oluşturulmasını basitleştirmek için, aşağıdaki kılavuzda gösterildiği gibi bir uygulama .NET JSON PATCH desteğini kullanabilir.

Microsoft.AspNetCore.JsonPatch.SystemTextJson Bir PATCH isteği oluşturmak için NuGet paketini yükleyin ve paketin JsonPatchDocument API özelliklerini kullanın.

Note

.NET uygulamalarına paket ekleme yönergeleri için Paket tüketimi iş akışı (NuGet belgeleri) sayfasındaki Paketleri yükleme ve yönetme altındaki makalelere bakın. NuGet.org'de doğru paket sürümlerini onaylayın.

@using yönergelerini System.Text.Json, System.Text.Json.Serialization ve Microsoft.AspNetCore.JsonPatch.SystemTextJson ad alanları için bileşenin Razor kısmının en üstüne ekleyin.

@using System.Text.Json
@using System.Text.Json.Serialization
@using Microsoft.AspNetCore.JsonPatch.SystemTextJson

JsonPatchDocument yöntemini kullanarak TodoItem için IsComplete öğesini true olarak ayarlayıp oluşturun:

var patchDocument = new JsonPatchDocument<TodoItem>()
    .Replace(p => p.IsComplete, true);

Microsoft.AspNetCore.JsonPatch Bir PATCH isteği oluşturmak için NuGet paketini yükleyin ve paketin JsonPatchDocument API özelliklerini kullanın.

Note

.NET uygulamalarına paket ekleme yönergeleri için Paket tüketimi iş akışı (NuGet belgeleri) sayfasındaki Paketleri yükleme ve yönetme altındaki makalelere bakın. NuGet.org'de doğru paket sürümlerini onaylayın.

@using, System.Text.Json, ve System.Text.Json.Serialization ad alanları için yönergeleri Microsoft.AspNetCore.JsonPatch bileşeninin en üstüne ekleyin:

@using System.Text.Json
@using System.Text.Json.Serialization
@using Microsoft.AspNetCore.JsonPatch

JsonPatchDocument yöntemini kullanarak TodoItem için IsComplete öğesini true olarak ayarlayıp oluşturun:

var patchDocument = new JsonPatchDocument<TodoItem>()
    .Replace(p => p.IsComplete, true);

Belgenin işlemlerini patchDocument.OperationsPatchAsJsonAsync çağrısına iletin:

private async Task UpdateItem(long id)
{
    await Http.PatchAsJsonAsync(
        $"todoitems/{id}", 
        patchDocument.Operations, 
        new JsonSerializerOptions()
        {
            DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault
        });
}

JsonSerializerOptions.DefaultIgnoreCondition, ancak türü için varsayılan değere eşitse bir özelliği yoksayacak şekilde JsonIgnoreCondition.WhenWritingDefault olarak ayarlanır.

JSON yükünü görüntüleme için hoş bir biçimde sunmak istiyorsanız JsonSerializerOptions.WriteIndented ayarını true olarak ekleyin. Girintili JSON yazmanın PATCH isteklerini işlemeyle bir ilgisi yoktur ve genellikle web API'leri istekleri için üretim uygulamalarında gerçekleştirilmez.

Web API'sine PATCH denetleyicisi eylemi eklemek için ASP.NET Core web API'sindeki JsonPatch makalesindeki yönergeleri izleyin. Alternatif olarak PATCH isteği işleme, aşağıdaki adımlarla Minimal API olarak uygulanabilir.

Web API'sine Microsoft.AspNetCore.JsonPatch.SystemTextJson NuGet paketi için bir paket başvurusu ekleyin.

Program dosyasında @using ad alanı için bir Microsoft.AspNetCore.JsonPatch.SystemTextJson yönerge ekleyin.

using Microsoft.AspNetCore.JsonPatch.SystemTextJson;

Web API'sine Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet paketi için bir paket başvurusu ekleyin.

Note

Uygulamanıza Microsoft.AspNetCore.JsonPatch paketi için bir paket başvurusu eklemeye gerek yoktur, çünkü Microsoft.AspNetCore.Mvc.NewtonsoftJson paketine yapılan başvuru otomatik olarak geçişli olarak Microsoft.AspNetCore.JsonPatch için bir paket başvurusu ekler.

Program dosyasında @using ad alanı için bir Microsoft.AspNetCore.JsonPatch yönerge ekleyin.

using Microsoft.AspNetCore.JsonPatch;

Uç noktayı web API'sinin istek işleme işlem hattına sağlayın:

app.MapPatch("/todoitems/{id}", async (long id, TodoContext db) =>
{
    if (await db.TodoItems.FindAsync(id) is TodoItem todo)
    {
        var patchDocument = 
            new JsonPatchDocument<TodoItem>().Replace(p => p.IsComplete, true);
        patchDocument.ApplyTo(todo);
        await db.SaveChangesAsync();

        return TypedResults.Ok(todo);
    }

    return TypedResults.NotFound();
});

Warning

ASP.NET Core web API'sindeki JsonPatch makalesindeki diğer örneklerde olduğu gibi, önceki PATCH API'si web API'sini aşırı gönderme saldırılarına karşı korumaz. Daha fazla bilgi için bkz . Öğretici: ASP.NET Core ile denetleyici tabanlı web API'sini oluşturma.

Tam olarak çalışan bir PATCH deneyimi için BlazorWebAppCallWebApi bakın.

DELETE (DeleteAsync) ve ek uzantı yöntemleri

System.Net.Http HTTP istekleri göndermek ve HTTP yanıtları almak için ek uzantı yöntemleri içerir. HttpClient.DeleteAsync bir web API'sine HTTP DELETE isteği göndermek için kullanılır.

Aşağıdaki bileşen kodunda <button> öğesi yöntemini çağırır DeleteItem . Bağlı <input> bileşeni, silinecek öğenin id bileşenini sağlar.

await Http.DeleteAsync($"todoitems/{id}");

HttpClient ile IHttpClientFactory olarak adlandırılır.

IHttpClientFactory hizmetleri ve adlandırılmış bir HttpClient yapılandırması desteklenir.

Note

'HttpClient adlandırılmış bir IHttpClientFactory kullanmanın alternatifi, yazılmış bir HttpClient kullanmaktır.' Daha fazla bilgi için Typed HttpClient bölümüne bakın.

Microsoft.Extensions.Http NuGet paketini uygulamaya ekleyin.

Note

.NET uygulamalarına paket ekleme yönergeleri için Paket tüketimi iş akışı (NuGet belgeleri) sayfasındaki Paketleri yükleme ve yönetme altındaki makalelere bakın. NuGet.org'de doğru paket sürümlerini onaylayın.

Bir istemci projesinin Program dosyasında:

builder.Services.AddHttpClient("WebAPI", client => 
    client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress));

Adlandırılmış istemci, bir Blazor Web App öğesinin önceden oluşturulmuş istemci tarafı bileşenleri tarafından kullanılacaksa, önceki hizmet kaydı hem sunucu projesinde hem de .Client projesinde görünmelidir. sunucuda, builder.HostEnvironment.BaseAddress web API'sinin aşağıda açıklanan temel adresiyle değiştirilir.

Önceki istemci tarafı örneği, builder.HostEnvironment.BaseAddress ile IWebAssemblyHostEnvironment.BaseAddress temel adresi ayarlar; bu, istemci tarafı uygulamasının temel adresini alır ve genellikle ana bilgisayar sayfasındaki <base> etiketinin href değerinden türetilir.

İstemcinin kendi temel adresini kullanmaya yönelik en yaygın kullanım örnekleri şunlardır:

  • Web API çağrılarını WebAssembly/Auto bileşenlerinden veya WebAssembly'de istemcide çalışan koddan, sunucu uygulamasında aynı konak adresindeki API'lere yapan bir .Client istemci projesi (Blazor Web App).
  • Sunucu projesine (Client) web API çağrıları yapan barındırılan Blazor WebAssembly bir uygulamanın istemci projesi (Server).

İstemcinin kendi temel adresini kullanmak için en yaygın kullanım örneği, sunucu projesine (Client) web API çağrıları yapan barındırılan Blazor WebAssembly bir uygulamanın istemci projesindedir (Server).

Dış web API'sini (istemci uygulamasıyla aynı URL alanında değil) çağırıyorsanız veya hizmetleri bir sunucu tarafı uygulamasında yapılandırıyorsanız (örneğin, sunucudaki istemci tarafı bileşenlerinin önceden yenilenmesiyle başa çıkmak için), URI'yi web API'sinin temel adresine ayarlayın. Aşağıdaki örnek, ayrı bir web API uygulamasının çalıştığı ve istemci uygulamasından gelen isteklere yanıt vermeye hazır olduğu web API'sinin temel adresini https://localhost:5001 olarak ayarlar.

builder.Services.AddHttpClient("WebAPI", client => 
    client.BaseAddress = new Uri("https://localhost:5001"));

Aşağıdaki bileşen kodunda:

  • IHttpClientFactory örneği, HttpClient adlı bir varlık oluşturur.
  • HttpClient adlı, /forecast konumundaki web API'sinden JSON hava durumu tahmin verilerini almak için bir GET isteği göndermede kullanılır.
@inject IHttpClientFactory ClientFactory

...

@code {
    private Forecast[]? forecasts;

    protected override async Task OnInitializedAsync()
    {
        var client = ClientFactory.CreateClient("WebAPI");

        forecasts = await client.GetFromJsonAsync<Forecast[]>("forecast") ?? [];
    }
}

Adı belirtilmiş bir BlazorWebAppCallWebApi bileşeninde bir web API'sini çağırmayı gösteren HttpClientCallTodoWebApiCsrNamedClient. HttpClient adlı bir Microsoft Graph çağrısına dayalı bir istemci uygulamasında ek çalışma tanıtımı için bkz. ASP.NET Core Blazor WebAssemblyile Graph API'sini kullanma.

Microsoft Graph adlı bir çağrıya dayalı bir istemci uygulamasında çalışan bir demo için bkz. HttpClient.

Yazılı HttpClient

HttpClient örneği, bir veya daha fazla web API'si uç noktasından veri döndürmek için uygulamanın varsayılan veya adlandırılmış HttpClient örneklerinden bir veya daha fazlasını kullanır.

Note

Türü belirtilmiş bir HttpClient kullanmanın alternatifi, bir HttpClient'den adıyla IHttpClientFactory kullanmaktır. Daha fazla bilgi için Şununla adlandırılmış HttpClientIHttpClientFactory bölümüne bakın.

Microsoft.Extensions.Http NuGet paketini uygulamaya ekleyin.

Note

.NET uygulamalarına paket ekleme yönergeleri için Paket tüketimi iş akışı (NuGet belgeleri) sayfasındaki Paketleri yükleme ve yönetme altındaki makalelere bakın. NuGet.org'de doğru paket sürümlerini onaylayın.

Aşağıdaki örnek, konumundaki /forecastweb API'sinden JSON hava durumu tahmin verileri için bir GET isteği verir.

ForecastHttpClient.cs:

using System.Net.Http.Json;

namespace BlazorSample.Client;

public class ForecastHttpClient(HttpClient http)
{
    public async Task<Forecast[]> GetForecastAsync() => 
        await http.GetFromJsonAsync<Forecast[]>("forecast") ?? [];
}

Bir istemci projesinin Program dosyasında:

builder.Services.AddHttpClient<ForecastHttpClient>(client => 
    client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress));

Yazılan istemci, önceden oluşturulmuş istemci tarafı bileşenleri tarafından kullanılacaksa, önceki hizmet kaydının hem sunucu projesinde hem de Blazor Web App projesinde göründüğünden emin olunmalıdır. sunucuda, builder.HostEnvironment.BaseAddress web API'sinin aşağıda açıklanan temel adresiyle değiştirilir.

Yukarıdaki örnek, istemci tarafı uygulamasının temel adresini builder.HostEnvironment.BaseAddress (IWebAssemblyHostEnvironment.BaseAddress) ile ayarlar; bu adres genellikle ana bilgisayar sayfasındaki <base> etiketinin href değerinden türetilir.

İstemcinin kendi temel adresini kullanmaya yönelik en yaygın kullanım örnekleri şunlardır:

  • Web API çağrılarını WebAssembly/Auto bileşenlerinden veya WebAssembly'de istemcide çalışan koddan, sunucu uygulamasında aynı konak adresindeki API'lere yapan bir .Client istemci projesi (Blazor Web App).
  • Sunucu projesine (Client) web API çağrıları yapan barındırılan Blazor WebAssembly bir uygulamanın istemci projesi (Server).

İstemcinin kendi temel adresini kullanmak için en yaygın kullanım örneği, sunucu projesine (Client) web API çağrıları yapan barındırılan Blazor WebAssembly bir uygulamanın istemci projesindedir (Server).

Dış web API'sini (istemci uygulamasıyla aynı URL alanında değil) çağırıyorsanız veya hizmetleri bir sunucu tarafı uygulamasında yapılandırıyorsanız (örneğin, sunucudaki istemci tarafı bileşenlerinin önceden yenilenmesiyle başa çıkmak için), URI'yi web API'sinin temel adresine ayarlayın. Aşağıdaki örnek, ayrı bir web API uygulamasının çalıştığı ve istemci uygulamasından gelen isteklere yanıt vermeye hazır olduğu web API'sinin temel adresini https://localhost:5001 olarak ayarlar.

builder.Services.AddHttpClient<ForecastHttpClient>(client => 
    client.BaseAddress = new Uri("https://localhost:5001"));

Bileşenler, türü belirtilen HttpClient'yi web API'sini çağırmak için enjekte eder.

Aşağıdaki bileşen kodunda:

  • Öncekinin bir ForecastHttpClient örneği eklenir ve bu, türü belirlenmiş bir HttpClient oluşturur.
  • Yazılan HttpClient , web API'sinden JSON hava durumu tahmin verileri için get isteği göndermek için kullanılır.
@inject ForecastHttpClient Http

...

@code {
    private Forecast[]? forecasts;

    protected override async Task OnInitializedAsync()
    {
        forecasts = await Http.GetForecastAsync();
    }
}

Örnek BlazorWebAppCallWebApiuygulama, bileşeninde uygun şekilde yazılmış bir web API'sini çağırmayı gösterir. Bileşenin InteractiveWebAssembly istemci tarafı işlemeyi (CSR) (işleme modu) benimsediğini, dolayısıyla yazılan istemci hizmeti kaydının hem sunucu projesinin Program hem de projenin dosyasında göründüğünü .Client unutmayın.

Bu bölümdeki kılavuz, kimlik doğrulaması cookiekullanan istemci tarafı senaryoları için geçerlidir.

Daha güvenli olarak kabul edilen cookie tabanlı kimlik doğrulaması için, kimlik bilgileri, önceden yapılandırılmış bir cookie üzerinde AddHttpMessageHandlerDelegatingHandler ile çağırarak her web API isteğiyle gönderilebilir. İşleyici, tarayıcıya, tanımlama bilgileri veya HTTP kimlik doğrulama başlıkları gibi kimlik bilgilerini, çapraz kaynak istekleri dahil her istekle göndermesi gerektiğini söyleyen SetBrowserRequestCredentials ile BrowserRequestCredentials.Include yapılandırır.

CookieHandler.cs:

public class CookieHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);
        request.Headers.Add("X-Requested-With", [ "XMLHttpRequest" ]);

        return base.SendAsync(request, cancellationToken);
    }
}

Note

Bir AuthenticationStateProvider'yi bir DelegatingHandler'den nasıl erişileceğine dair yönergeler için ASP.NET Core sunucu tarafı ve Blazor Web App ek güvenlik senaryolarına bakın.

CookieHandler Program dosyasında kayıtlıdır.

builder.Services.AddTransient<CookieHandler>();

Önceden yapılandırılmış olup kimlik doğrulaması gerektiren herhangi bir HttpClient için ileti işleyicisi cookie eklenir.

builder.Services.AddHttpClient(...)
    .AddHttpMessageHandler<CookieHandler>();

Tanıtım için, ASP.NET Core Blazor WebAssembly ile ASP.NET Core'u güvenceye alın konusuna Identity.

HttpRequestMessage bir oluştururken, tarayıcı isteği kimlik bilgilerini ve üst bilgisini doğrudan ayarlayın.

using var request = new HttpRequestMessage() { ... };

request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);
request.Headers.Add("X-Requested-With", [ "XMLHttpRequest" ]);

HttpClient ve HttpRequestMessage, Fetch API isteği seçeneklerinde

Bu bölümdeki yönergeler taşıyıcı belirteç kimlik doğrulamasını kullanan istemci tarafı senaryoları için geçerlidir.

HttpClient (API belgeleri) ve HttpRequestMessage istekleri özelleştirmek için kullanılabilir. Örneğin, HTTP yöntemini ve istek üst bilgilerini belirtebilirsiniz. Aşağıdaki bileşen bir POST web API uç noktasına istekte bulunur ve yanıt gövdesini gösterir.

TodoRequest.razor:

@page "/todo-request"
@using System.Net.Http.Headers
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject HttpClient Http
@inject IAccessTokenProvider TokenProvider

<h1>ToDo Request</h1>

<h1>ToDo Request Example</h1>

<button @onclick="PostRequest">Submit POST request</button>

<p>Response body returned by the server:</p>

<p>@responseBody</p>

@code {
    private string? responseBody;

    private async Task PostRequest()
    {
        using var request = new HttpRequestMessage()
        {
            Method = new HttpMethod("POST"),
            RequestUri = new Uri("https://localhost:10000/todoitems"),
            Content =
                JsonContent.Create(new TodoItem
                {
                    Name = "My New Todo Item",
                    IsComplete = false
                })
        };

        var tokenResult = await TokenProvider.RequestAccessToken();

        if (tokenResult.TryGetToken(out var token))
        {
            request.Headers.Authorization =
                new AuthenticationHeaderValue("Bearer", token.Value);

            request.Content.Headers.TryAddWithoutValidation(
                "x-custom-header", "value");

            using var response = await Http.SendAsync(request);
            var responseStatusCode = response.StatusCode;

            responseBody = await response.Content.ReadAsStringAsync();
        }
    }

    public class TodoItem
    {
        public long Id { get; set; }
        public string? Name { get; set; }
        public bool IsComplete { get; set; }
    }
}

Blazor'nin istemci tarafı uygulaması HttpClientFetch API'sini kullanır ve uzantı yöntemleri ve aracılığıyla HttpRequestMessage isteğe WebAssemblyHttpRequestMessageExtensions yapılandırıyor. Genel SetBrowserRequestOption uzantı yöntemini kullanarak ek seçenekleri ayarlayın. Blazor ve temel alınan Fetch API istek üst bilgilerini doğrudan ekleyemez veya değiştiremez. Tarayıcılar gibi kullanıcı aracılarının üst bilgilerle nasıl etkileşimde bulunduğu hakkında daha fazla bilgi için dış kullanıcı aracısı belge kümelerine ve diğer web kaynaklarına başvurun.

Yanıt akışı varsayılan olarak etkindir.

HttpContent.ReadAsStreamAsync için bir HttpResponseMessage.Content (response.Content.ReadAsStreamAsync()) çağrısı, BrowserHttpReadStream (başvuru kaynağı) döndürür, MemoryStream değil. BrowserHttpReadStream gibi Stream.Read(Span<Byte>)zaman uyumlu işlemleri desteklemez. Kodunuz senkron işlemleri kullanıyorsa yanıt akışını devre dışı bırakabilir veya Stream'yi MemoryStream'e kendiniz kopyalayabilirsiniz.

Note

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

Genel olarak yanıt akışını geri çevirmek için aşağıdaki yaklaşımlardan birini kullanın:

  • Proje dosyasına, değeri <WasmEnableStreamingResponse> olan false özelliğini ekleyin.

    <WasmEnableStreamingResponse>false</WasmEnableStreamingResponse>
    
  • DOTNET_WASM_ENABLE_STREAMING_RESPONSE ortam değişkenini false veya 0 olarak ayarlayın.

Bireysel bir istek için yanıt akışını devre dışı bırakmak için, SetBrowserResponseStreamingEnabled öğesini false olarak ayarlayın (HttpRequestMessage, aşağıdaki örnekte request).

request.SetBrowserResponseStreamingEnabled(false);

HTTP yanıtı, yanıt içeriğinde senkron okumaları desteklemek için genellikle arabelleğe alınır. Yanıt akışı desteğini etkinleştirmek için SetBrowserResponseStreamingEnabled üzerinde true'i HttpRequestMessage olarak ayarlayın:

request.SetBrowserResponseStreamingEnabled(true);

Varsayılan olarak HttpCompletionOption.ResponseContentRead ayarlanır ve sonuç olarak, içerik de dahil olmak üzere tüm yanıt okunduktan sonra HttpClient tamamlanır. Büyük dosyalarda SetBrowserResponseStreamingEnabled seçeneğini kullanabilmek için, dosyanın içeriğinin bellekte önbelleğe alınmasını önlemek amacıyla HttpCompletionOption.ResponseHeadersRead ayarlayın.

- using var response = await Http.SendAsync(request);
+ using var response = await Http.SendAsync(request, 
+     HttpCompletionOption.ResponseHeadersRead);

Çıkış noktaları arası bir isteğe kimlik bilgilerini eklemek için SetBrowserRequestCredentials uzantı yöntemini kullanın.

request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);

Fetch API seçenekleri hakkında daha fazla bilgi için bkz . MDN web belgeleri: WindowOrWorkerGlobalScope.fetch(): Parametreler.

Hatalarla başa çıkma

Geliştirici kodunda ortaya çıkan web API'si yanıt hatalarını işleyin. Örneğin, GetFromJsonAsync, Content-Type ile application/json bir JSON yanıtını web API'sinden bekler. Yanıt JSON biçiminde değilse, içerik doğrulaması bir NotSupportedExceptionoluşturur.

Aşağıdaki örnekte, hava durumu tahmini veri isteği için URI uç noktası yanlış yazılmıştır. URI'nin WeatherForecast olması gerekir, ancak çağrıda WeatherForcast olarak görünür ve e içindeki Forecast harfi eksiktir.

Çağrı JSON döndürülmesini bekler, ancak web API'si GetFromJsonAsync ile işlenmeyen bir özel durum Content-Type ve text/html için HTML döndürür. İşlenmeyen özel durum, /WeatherForcast yolunun bulunamaması ve ara katman yazılımın istek için bir sayfa veya görünüm sunamaması nedeniyle oluşur.

OnInitializedAsync istemcisinde, NotSupportedException yanıt içeriği JSON olmayan olarak doğrulandığında oluşturulur. Özel durum, özel mantığın hatayı günlüğe catch kaydedebileceği veya kullanıcıya kullanıcı dostu bir hata iletisi sunabileceği blokta yakalanır.

ReturnHTMLOnException.razor:

@page "/return-html-on-exception"
@using {PROJECT NAME}.Shared
@inject HttpClient Http

<h1>Fetch data but receive HTML on unhandled exception</h1>

@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <h2>Temperatures by Date</h2>

    <ul>
        @foreach (var forecast in forecasts)
        {
            <li>
                @forecast.Date.ToShortDateString():
                @forecast.TemperatureC &#8451;
                @forecast.TemperatureF &#8457;
            </li>
        }
    </ul>
}

<p>
    @exceptionMessage
</p>

@code {
    private WeatherForecast[]? forecasts;
    private string? exceptionMessage;

    protected override async Task OnInitializedAsync()
    {
        try
        {
            // The URI endpoint "WeatherForecast" is misspelled on purpose on the 
            // next line. See the preceding text for more information.
            forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForcast");
        }
        catch (NotSupportedException exception)
        {
            exceptionMessage = exception.Message;
        }
    }
}

Note

Yukarıdaki örnek, tanıtım amaçlıdır. Bir web API'si, bir uç nokta mevcut olmadığında veya sunucuda işlenmeyen bir özel durum oluştuğunda bile JSON döndürecek şekilde yapılandırılabilir.

Daha fazla bilgi için bkz . ASP.NET Core Blazor uygulamalarında hataları işleme.

Alanlar Arası Kaynak Paylaşımı (CORS)

Tarayıcı güvenliği, bir web sayfasının, kendisine hizmet eden kaynak noktasından farklı bir kaynak noktasına istek yapmasını genellikle kısıtlar. Bu kısıtlama aynı kaynak ilkesi olarak adlandırılır. Aynı kaynak ilkesi, kötü amaçlı bir sitenin başka bir siteden hassas verileri okumasını kısıtlar (ancak engellemez). Tarayıcıdan farklı bir çıkış noktası olan bir uç noktaya istekte bulunmak için uç noktanınÇıkış Noktaları Arası Kaynak Paylaşımı'nı (CORS) etkinleştirmesi gerekir.

Sunucu tarafı CORS hakkında daha fazla bilgi için bkz. ASP.NET Core'da Çıkış Noktaları Arası İstekleri (CORS) Etkinleştirme. Makalenin örnekleri doğrudan Razor bileşen senaryolarıyla ilgili değildir, ancak makale genel CORS kavramlarını öğrenmek için kullanışlıdır.

İstemci tarafı CORS istekleri hakkında bilgi için bkz. ASP.NET Core Blazor WebAssembly ek güvenlik senaryoları.

Sahtecilik önleme desteği

HTTP isteğine sahtecilik önleme desteği eklemek için, AntiforgeryStateProvider enjekte edin ve RequestToken'yi RequestVerificationToken olarak üst bilgi koleksiyonuna ekleyin.

@inject AntiforgeryStateProvider Antiforgery
private async Task OnSubmit()
{
    var antiforgery = Antiforgery.GetAntiforgeryToken();
    using var request = new HttpRequestMessage(HttpMethod.Post, "action");
    request.Headers.Add("RequestVerificationToken", antiforgery.RequestToken);
    using var response = await client.SendAsync(request);
    ...
}

Daha fazla bilgi için bkz. ASP.NET Çekirdek Blazor kimlik doğrulaması ve yetkilendirme.

Blazor web API erişimini test etme için çerçeve bileşeni örnekleri

Web API arka uç uygulamalarını doğrudan test etmek için Firefox Browser Developer gibi çeşitli ağ araçları genel kullanıma sunulmuştur. Blazor framework'ün başvuru kaynağı, test için yararlı olan test varlıklarını içerir HttpClient :

HttpClientTest GitHub deposundaki dotnet/aspnetcore varlıklar

Note

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

Ek kaynaklar

General

Aşırı paylaşım saldırılarını azaltma

Web API'leri, fazla gönderim saldırısı olarak da bilinen bir toplu atama saldırısına karşı savunmasız olabilir. Kötü amaçlı bir kullanıcı, geliştiricinin kullanıcıların değiştirmesine izin vermek istemediği ve işlenmiş formda yer almayan özellikler için verileri işlemek üzere bir HTML form POST isteğini sunucuya gönderdiğinde fazla gönderim saldırısı oluşur. "Overposting" terimi, kötü amaçlı kullanıcının form ile aşırı POST isteği gönderdiği anlamına gelir.

Fazla paylaşım saldırılarını azaltma hakkında yönlendirme için ASP.NET Core ile denetleyici tabanlı web API'sini oluşturma kılavuzu bölümüne bakın.

Server-side

Client-side