Megosztás a következőn keresztül:


Webes API meghívása ASP.NET Core Blazor

Jegyzet

Ez nem a cikk legújabb verziója. A jelenlegi kiadás részleteiért lásd a cikk .NET 9-es verzióját .

Figyelmeztetés

A ASP.NET Core ezen verziója már nem támogatott. További információ: .NET és .NET Core támogatási szabályzat. A jelenlegi kiadás részleteiért lásd a cikk .NET 9-es verzióját .

Fontos

Ezek az információk egy olyan előzetes termékre vonatkoznak, amelyet a kereskedelmi forgalomba kerülés előtt jelentősen módosíthatnak. A Microsoft nem vállal kifejezett vagy hallgatólagos szavatosságot az itt megadott információkra vonatkozóan.

A jelenlegi kiadás részleteiért lásd a cikk .NET 9-es verzióját .

Ez a cikk azt ismerteti, hogyan hívhat meg webes API-t egy Blazor alkalmazásból.

Csomag

A System.Net.Http.Json csomag bővítménymódszereket biztosít a System.Net.Http.HttpClient-nek és System.Net.Http.HttpContent-nek, amelyek automatikus szerializálást és deszerializálást végeznek a System.Text.Json használatával. A System.Net.Http.Json csomagot a .NET megosztott keretrendszere biztosítja, és nem igényel csomaghivatkozás hozzáadását az alkalmazáshoz.

Mintaalkalmazások

Tekintse meg a mintaalkalmazásokat a dotnet/blazor-samples GitHub-adattárban.

BlazorWebAppCallWebApi

Külső (nem a Blazor Web App-ban lévő) internetes feladatlista API meghívása egy Blazor Web App-ből:

  • Backend: Egy webes API-alkalmazás a teendőlista karbantartásához, minimális API-kalapján. A web API alkalmazás különálló alkalmazás a Blazor Web App-től, valószínűleg egy másik kiszolgálón van üzemeltetve.
  • BlazorApp / BlazorApp.Client: Egy Blazor Web App, amely meghívja a web API-alkalmazást egy HttpClient a teendőlista-műveletekhez, például elemek létrehozására, olvasására, frissítésére és törlésére a teendőlistából.

Ügyféloldali renderelés (CSR) esetén, amely magában foglalja az interaktív WebAssembly és automatikus összetevőket, amelyek CSR-t alkalmaznak, a hívások egy előre konfigurált HttpClient segítségével történnek, amely a kliens projekt Program fájljában van regisztrálva (BlazorApp.Client).

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

A szerveroldali renderelés (SSR) esetén, amely magában foglalja az előrerenderelt és interaktív szerverkomponenseket, az előrerenderelt WebAssembly-komponenseket, valamint az olyan automatikus komponenseket, amelyek előrerendereltek vagy átvették az SSR-t, a hívások a szerverprojekt HttpClient fájljában regisztrált Program-val történnek (BlazorApp):

builder.Services.AddHttpClient();

Hívjon meg egy belső (a Blazor Web App) filmlista API-t, ahol az API a Blazor Web Appkiszolgálóprojektjében található:

  • BlazorApp Egy Blazor Web App, amely filmlistát karbantart:
    • Amikor a műveletek a kiszolgálón lévő alkalmazás filmlistáján vannak végrehajtva, a rendszer a szokásos API-hívásokat használja.
    • Ha az API-hívásokat egy webes ügyfél kezdeményezi, a rendszer egy webes API-t használ a mozgóképlista-műveletekhez, Minimális API-kalapján.
  • BlazorApp.Client: A Blazor Web Appügyfélprojektje, amely interaktív webösszetevőket és automatikus összetevőket tartalmaz a filmlista felhasználói kezeléséhez.

Az interaktív WebAssembly-összetevőket és a CSR-t alkalmazó automatikus összetevőket tartalmazó CSR esetében az API-ra irányuló hívások egy ügyfélalapú szolgáltatáson (ClientMovieService) keresztül jönnek létre, amely az ügyfélprojekt HttpClient fájljában (Program) regisztrált előre konfigurált BlazorApp.Client használ. Mivel ezek a hívások nyilvános vagy privát weben keresztül zajlanak, a filmlista API egy webes API.

Az alábbi példa lekérte a filmek listáját a /movies végpontról:

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

Az előre összeállított és interaktív kiszolgálóösszetevőket, előrerendelt WebAssembly-összetevőket és automatikus összetevőket tartalmazó SSR esetében, amelyek előrerendelt vagy elfogadott SSR-t tartalmaznak, a hívásokat közvetlenül egy kiszolgálóalapú szolgáltatáson (ServerMovieService) keresztül bonyolítják le. Az API nem támaszkodik hálózatra, ezért ez egy szabványos API filmlistás CRUD-műveletekhez.

Az alábbi példa a filmek listáját szerzi meg:

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

BlazorWebAppCallWebApi_Weather

Időjárásiadat-mintaalkalmazás, amely streamelési renderelést használ az időjárási adatokhoz.

BlazorWebAssemblyCallWebApi

Webes teendőlista API meghívása egy Blazor WebAssembly-alkalmazásból:

  • Backend: Egy webes API-alkalmazás a teendőlista karbantartásához, minimális API-kalapján.
  • BlazorTodo: Egy Blazor WebAssembly alkalmazás, amely előre konfigurált HttpClient-vel hívja meg a webes API-t a teendőlista CRUD-műveleteihez.

Ügyféloldali forgatókönyvek külső webes API-k meghívásához

Az ügyfélalapú összetevők külső webes API-kat hívnak meg a HttpClient példányok használatával, amelyeket általában a HttpClient fájlban regisztrált, előre konfigurált Program segítségével hoznak létre.

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

Az alábbi Razor összetevő egy kérést küld egy webes API-hoz a GitHub-ágak lekéréséhez, hasonlóan az Alapszintű használat példához a HTTP-kérések készítése IHttpClientFactory használatával az ASP.NET Core cikkben.

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

Az előző C# 12 vagy újabb példában egy üres tömb ([]) jön létre a branches változóhoz. A .NET 8-nál korábbi SDK-val lefordított C# korábbi verzióihoz hozzon létre egy üres tömböt (Array.Empty<GitHubBranch>()).

A .NET/C# kód és adatok védelméhez használja a ASP.NET Core Data Protection funkcióit egy kiszolgálóoldali ASP.NET Core háttérrendszer webes API-val. Az ügyféloldali Blazor WebAssembly alkalmazás meghívja a kiszolgálóoldali webes API-t az alkalmazások biztonságos funkcióinak és adatfeldolgozásának érdekében.

Blazor WebAssembly alkalmazások gyakran nem tudnak közvetlen hívásokat kezdeményezni a források között a webes API-k felé a kereszt-eredetű erőforrásmegosztás (CORS) biztonsági intézkedések miatt. Egy tipikus kivétel a következőhöz hasonló:

Hozzáférés a(z) {URL} lekéréséhez a(z) 'https://localhost:{PORT}'' eredetből a CORS-irányelv miatt le lett tiltva: A kért erőforráson nincs 'Access-Control-Allow-Origin' fejléc. Ha egy átlátszatlan válasz megfelel az igényeinek, állítsa a kérés módját "no-cors" értékre, hogy lekérje az erőforrást, ha a CORS le van tiltva.

Még akkor is, ha a(z) SetBrowserRequestMode hívást BrowserRequestMode mező NoCors (1)-gyel próbálja megkerülni az előző kivételt, a kérés gyakran meghiúsul a webes API eredetére vonatkozó CORS-korlátozások miatt, mint amelyek csak bizonyos eredetről érkező hívásokat engedélyeznek, vagy megakadályozzák, hogy a JavaScript fetch kéréseket a böngészőből tegyenek. Az ilyen hívások kizárólag akkor lehetnek sikeresek, ha a webes API, amelyet meghívsz, lehetővé teszi a saját forrásod számára, hogy a helyes CORS-konfigurációval elérje az ő forrását. A legtöbb külső webes API nem teszi lehetővé a CORS-szabályzatok konfigurálását. A korlátozás kezeléséhez fogadja el az alábbi stratégiák egyikét:

  • Saját kiszolgálóoldali ASP.NET Core háttérbeli webes API-t tart fenn. Az ügyféloldali Blazor WebAssembly alkalmazás meghívja a kiszolgálóoldali webes API-t, a webes API pedig a kiszolgálóalapú C#-kódból (nem böngészőből) a külső webes API-ba küldi a kérést a megfelelő CORS-fejlécekkel, és visszaadja az eredményt az ügyféloldali Blazor WebAssembly alkalmazásnak.

  • Proxyszolgáltatással irányíthatja a kérést az ügyféloldali Blazor WebAssembly alkalmazásból a külső webes API felé. A proxyszolgáltatás egy kiszolgálóoldali alkalmazással küldi el a kérést az ügyfél nevében, és a hívás sikerességét követően visszaadja az eredményt. Az alábbi példában a CloudFlare CORS PROXYalapján a {REQUEST URI} helyőrző jelenti a kérelem URI-ját.

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

Kiszolgálóoldali forgatókönyvek külső webes API-k meghívásához

A kiszolgálóalapú összetevők külső webes API-kat hívnak meg HttpClient példányok használatával, amelyek általában IHttpClientFactoryhasználatával jönnek létre. A kiszolgálóoldali alkalmazásokra vonatkozó útmutatásért lásd: HTTP-kérések létrehozása az IHttpClientFactory használatával ASP.NET Core.

A kiszolgálóoldali alkalmazások nem tartalmaznak HttpClient szolgáltatást. Adjon meg egy HttpClient az alkalmazásnak a HttpClient gyári infrastruktúrahasználatával.

A Program fájlban:

builder.Services.AddHttpClient();

Az alábbi Razor összetevő egy kérést küld egy webes API-hoz a GitHub-ágak lekéréséhez, hasonlóan az Alapszintű használat példához a HTTP-kérések készítése IHttpClientFactory használatával az ASP.NET Core cikkben.

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

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

Az előző C# 12 vagy újabb példában egy üres tömb ([]) jön létre a branches változóhoz. A .NET 8-nál korábbi SDK-val lefordított C# korábbi verzióihoz hozzon létre egy üres tömböt (Array.Empty<GitHubBranch>()).

További működő példaként tekintse meg azt a kiszolgálóoldali fájlfeltöltési példát, amely fájlokat tölt fel egy webes API-vezérlőbe a ASP.NET Core Blazor fájlfeltöltési cikkben.

Szolgáltatás absztrakciói webes API-hívásokhoz

Ez a szakasz olyan Blazor Web Apps-ekre vonatkozik, amelyek webes API-t tartanak fenn a kiszolgálóprojektben, vagy átalakítják a webes API-hívásokat egy külső webes API-vá.

Az interaktív WebAssembly és az automatikus renderelési módok használatakor az összetevők alapértelmezés szerint előre vannak rendezve. Az autóalkatrészeket is kezdetben interaktívan jelenítik meg a szerverről, mielőtt a Blazor csomag letöltődik a kliensre, és az ügyféloldali futtatókörnyezet aktiválódik. Ez azt jelenti, hogy az ilyen renderelési módokat használó összetevőket úgy kell megtervezni, hogy az ügyfélről és a kiszolgálóról is sikeresen fussanak. Ha az összetevőnek meghívnia kell egy kiszolgálói projektalapú API-t, vagy külső webes API-vá kell átalakítania a kérést (amely kívül esik a Blazor Web App) az ügyfélen való futtatáskor, az ajánlott módszer az, ha az API-hívást egy szolgáltatási felület mögött absztrakcióval hajtja végre, és implementálja a szolgáltatás ügyfél- és kiszolgálóverzióit:

  • Az ügyfélverzió egy előre konfigurált HttpClient-val hívja meg a webes API-t.
  • A kiszolgáló verziója általában közvetlenül is elérheti a kiszolgálóoldali erőforrásokat. A kiszolgálóra visszahívást kezdeményező HttpClient injektálása nem ajánlott, mivel a hálózati kérés általában szükségtelen. Alternatív megoldásként előfordulhat, hogy az API külső a kiszolgálóprojekthez, de a kiszolgáló szolgáltatás absztrakciója szükséges a kérés valamilyen módon történő átalakításához, például hozzáférési jogkivonat hozzáadásához egy előre megadott kéréshez.

A WebAssembly renderelési mód használatakor lehetősége van az előzetes renderelés letiltására is, így az összetevők csak az ügyféloldalon történik a renderelés. További információ: ASP.NET Core Blazor renderelési módok.

Példák (mintaalkalmazások):

  • A BlazorWebAppCallWebApi mintaalkalmazás filmlistájának webes API-ja.
  • Időjárási adatok webes API-jának streamelése a BlazorWebAppCallWebApi_Weather mintaalkalmazásban.
  • Az az időjárási adat, amelyet visszaadnak az ügyfélnek, a BlazorWebAppOidc (nem BFF-minta) vagy a BlazorWebAppOidcBff (BFF-minta) mintaalkalmazásokban található. Ezek az alkalmazások biztonságos (webes) API-hívásokat mutatnak be. További információért lásd: ASP.NET Core Blazor Web App védelme az OpenID Connect (OIDC) segítségével.

Blazor Web App külső webes API-k

Ez a szakasz azokra a Blazor Web Appvonatkozik, amelyek egy külön (külső) projekt által fenntartott webes API-t hívnak meg, amely esetleg egy másik kiszolgálón fut.

Blazor Web Appnormál esetben az ügyféloldalon előrenderelt WebAssembly-összetevők, és az automatikus összetevők a kiszolgálón jelennek meg statikus vagy interaktív kiszolgálóoldali renderelés (SSR) során. HttpClient szolgáltatások alapértelmezés szerint nincsenek regisztrálva egy Blazor Web Appfő projektjében. Ha az alkalmazás csak a HttpClient szolgáltatásokkal fut, amelyek a .Client projektben vannak regisztrálva, a fejezet, amelyben a HttpClient szolgáltatást hozzá kell adni, leírása szerint, az alkalmazás futtatása futásidejű hibához vezet:

InvalidOperationException: Nem adható meg érték a "Http" tulajdonsághoz a következő típuson: "... {COMPONENT}". Nincs "System.Net.Http.HttpClient" típusú regisztrált szolgáltatás.

Használja az alábbi módszerek bármelyikét:

  • Adja hozzá a HttpClient szolgáltatásokat a kiszolgálóprojekthez, hogy elérhetővé tegye a HttpClient az SSR során. Használja a következő szolgáltatásregisztrációt a kiszolgálóprojekt Program fájljában:

    builder.Services.AddHttpClient();
    

    HttpClient szolgáltatásokat a megosztott keretrendszer biztosítja, így az alkalmazás projektfájljában nincs szükség csomaghivatkozásra.

    Példa: Todo list web API a BlazorWebAppCallWebApimintaalkalmazásban

  • Ha a webes API-t meghívó WebAssembly-összetevőhöz nincs szükség előzetes rendezésre, tiltsa le az előrendelést az ASP.NET Core Blazor renderelési módjainakútmutatását követve. Ha ezt a megközelítést alkalmazza, nem kell HttpClient szolgáltatásokat hozzáadnia a Blazor Web App fő projektjéhez, mert az összetevő nincs előrerendelve a kiszolgálón.

További információért lásd: az ügyféloldali szolgáltatások nem oldhatók fel előrenderelés során.

Előre megadott adatok

Előrerendezéskor az összetevők kétszer renderelnek: először statikusan, majd interaktívan. Az állapot nem halad át automatikusan az előre beállított összetevőről az interaktívra. Ha egy összetevő aszinkron inicializálási műveleteket hajt végre, és az inicializálás során különböző állapotokat jelenít meg, például "Betöltés..." állapotjelző, villódzás jelenhet meg, amikor az összetevő kétszer renderel.

Ezt úgy oldhatja meg, hogy az előrerenderelt állapotot áramoltatja az Állandó összetevő állapota API használatával, amelyet a BlazorWebAppCallWebApi és BlazorWebAppCallWebApi_Weathermintaalkalmazások bemutatnak. Ha az összetevő interaktívan jelenik meg, ugyanazt az állapotot jelenítheti meg. Az API azonban jelenleg nem működik a továbbfejlesztett navigációval, amelyet a lapra mutató hivatkozásokon (data-enhanced-nav=false) letiltva megkerülhet. További információ:

Ügyféloldali kérések streamelése

A HTTP/2 protokollt és a HTTPS-t használó Chromium-alapú böngészők (például a Google Chrome és a Microsoft Edge) esetében az ügyféloldal Blazor a Streams API-t használja a kérések streamelésének engedélyezésére.

A kérelem-streamelés engedélyezéséhez állítsa a SetBrowserRequestStreamingEnabled-t a true-re a HttpRequestMessage-n.

A következő fájlfeltöltési példában:

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

var response = await Http.SendAsync(request);

Streamelési kérelmek:

  • HTTPS protokollt igényel, és nem működik HTTP/1.x rendszeren.
  • Tartalmazzon tartalmat, de ne tartalmazzon Content-Length fejlécet. CORS- elővizsgálati kérelem szükséges a forrásközi streamelési kérelmekhez.

Az InputFile összetevővel történő fájlfeltöltésekről további információt a ASP.NET Core Blazor fájlfeltöltési és a Fájlok feltöltése kiszolgálóra ügyféloldali rendereléssel (CSR)című cikkben talál.

A HttpClient szolgáltatás hozzáadása

Az ebben a szakaszban található útmutatás az ügyféloldali forgatókönyvekre vonatkozik.

Az ügyféloldali összetevők webes API-kat hívnak meg egy előre konfigurált HttpClient szolgáltatás használatával, amelynek célja a kérések visszahívása a forráskiszolgálóra. A fejlesztői kódban további HttpClient szolgáltatáskonfigurációk hozhatók létre más webes API-khoz. A kérelmek Blazor JSON-segítők vagy HttpRequestMessagesegítségével állnak össze. A kérelmek tartalmazhatnak Fetch API beállításkonfigurációt.

Az ebben a szakaszban szereplő konfigurációs példák csak akkor hasznosak, ha egyetlen webes API-t hív meg egyetlen HttpClient-példányhoz az alkalmazásban. Ha az alkalmazásnak több webes API-t kell meghívnia, amelyek mindegyike saját alapcímmel és konfigurációval rendelkezik, a következő megközelítéseket alkalmazhatja, amelyekről a cikk későbbi részében olvashat:

A Program fájlban adjon hozzá egy HttpClient szolgáltatást, ha még nem található meg az alkalmazás létrehozásához használt Blazor projektsablonból:

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

Az előző példa az alapcímet builder.HostEnvironment.BaseAddress (IWebAssemblyHostEnvironment.BaseAddress) értékre állítja. Ez meghatározza az alkalmazás alapcímét, amely jellemzően a gazdagépoldal <base> címke href értékéből származik.

Az ügyfél saját alapcímének használatára a leggyakoribb használati esetek a következők:

  • Egy .Client (.NET 8 vagy újabb) ügyfélprojektje (Blazor Web App) webes API-hívásokat indít a WebAssembly-összetevőkről vagy a WebAssembly-ügyfélen futó kódról a kiszolgálóalkalmazás API-jaira.
  • Egy üzemeltetett Client-alkalmazás ügyfélprojektje (Blazor WebAssembly) webes API-hívásokat indít a kiszolgálóprojekthez (Server). Vegye figyelembe, hogy a üzemeltetett Blazor WebAssembly projektsablon már nem érhető el a .NET 8-as vagy újabb verzióiban. A üzemeltetett Blazor WebAssembly-alkalmazások azonban továbbra is támogatottak maradnak a .NET 8-hoz.

Ha külső webes API-t hív meg (nem ugyanabban az URL-térben, mint az ügyfélalkalmazás), állítsa be az URI-t a webes API alapcímére. Az alábbi példa a webes API alapcímét https://localhost:5001értékre állítja, ahol egy külön web API-alkalmazás fut, és készen áll az ügyfélalkalmazás kéréseire való válaszadásra:

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

JSON-segítők

HttpClient előre konfigurált szolgáltatásként érhető el a kérések forráskiszolgálóra való visszahívásához.

HttpClient és JSON-segítők (System.Net.Http.Json.HttpClientJsonExtensions) külső webes API-végpontok meghívására is használhatók. HttpClient a böngésző Fetch API használatával van megvalósítva, és annak korlátozásai alá esik, beleértve az azonos eredet politikájának érvényesítését, amelyről a forrásközi erőforrás-megosztás (CORS) szakaszban, ebben a cikkben később részletesen lesz szó.

Az ügyfél alapcíme az eredeti kiszolgáló címére van állítva. Szúrjon be egy HttpClient-példányt egy összetevőbe a @inject irányelv használatával:

@using System.Net.Http
@inject HttpClient Http

Használja a System.Net.Http.Json névteret a HttpClientJsonExtensionseléréséhez, beleértve GetFromJsonAsync, PutAsJsonAsyncés PostAsJsonAsync:

@using System.Net.Http.Json

A következő szakaszok a JSON-segítőket ismertetik:

System.Net.Http további módszereket is tartalmaz a HTTP-kérések küldéséhez és a HTTP-válaszok fogadásához, például a DELETE kérések küldéséhez. További információkért lásd a DELETE és bővítménymódszerek szakaszt.

GET a JSON-ból (GetFromJsonAsync)

GetFromJsonAsync HTTP GET-kérést küld, és elemzi a JSON-válasz törzsét egy objektum létrehozásához.

A következő komponenskódban a todoItems-et az összetevő jeleníti meg. GetFromJsonAsync akkor hívjuk meg, ha az összetevő inicializálása befejeződött (OnInitializedAsync).

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

POST JSON formátumban (PostAsJsonAsync)

PostAsJsonAsync post kérést küld a megadott URI-nak, amely tartalmazza a kérelem törzsében JSON-ként szerializált értéket.

A következő komponenskódban a newItemName egy kötött elem által van biztosítva. A AddItem metódus egy <button> elem kiválasztásával aktiválódik.

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

PostAsJsonAsync visszaad egy HttpResponseMessage. A válaszüzenet JSON-tartalmának deszerializálásához használja a ReadFromJsonAsync bővítménymetódust. Az alábbi példa a JSON időjárási adatait tömbként olvassa be:

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

PUT as JSON (PutAsJsonAsync)

PutAsJsonAsync JSON-kódolt tartalommal http PUT-kérést küld.

A következő összetevőkódban editItemName és IsCompleted értékeit az összetevő kötött elemei adják meg. Az elem Id akkor van beállítva, ha az elem ki van jelölve a felhasználói felület egy másik részén (nem jelenik meg), és meghívja EditItem. A SaveItem metódus a <button> elem kiválasztásával aktiválódik. Az alábbi példa nem jeleníti meg a todoItems betöltését a tömörség kedvéért. Példát az elemek betöltésére a GET from JSON (GetFromJsonAsync) szakaszban talál.

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

PutAsJsonAsync visszaad egy HttpResponseMessage. A válaszüzenet JSON-tartalmának deszerializálásához használja a ReadFromJsonAsync bővítménymetódust. Az alábbi példa a JSON időjárási adatait tömbként olvassa be:

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

PATCH JSON formátumban (PatchAsJsonAsync)

PatchAsJsonAsync JSON-kódolt tartalommal HTTP PATCH-kérést küld.

Jegyzet

További információért lásd az JsonPatch az ASP.NET Core web API dokumentációját.

Az alábbi példában a PatchAsJsonAsync egy JSON PATCH-dokumentumot kap egyszerű szövegként, escape-elt idézőjelekkel.

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

A C# 11 (.NET 7) alapján JSON-sztringeket nyers sztringkonstansként. Adja meg a JSON-szintaxist a StringSyntaxAttribute.Json mezővel a [StringSyntax] attribútum számára a kódelemzési eszközhöz:

@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 visszaad egy HttpResponseMessage. A válaszüzenet JSON-tartalmának deszerializálásához használja a ReadFromJsonAsync bővítménymetódust. Az alábbi példa a JSON-elemek adatait olvassa tömbként. Üres tömb jön létre, ha a metódus nem ad vissza elemadatokat, így content nem null értékű az utasítás végrehajtása után:

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

A behúzással, térközrel és kibontatlan idézőjelekkel tagolt, kódolatlan PATCH-dokumentum a következő JSON-ként jelenik meg:

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

Ha egyszerűsíteni szeretné a PATCH-dokumentumok létrehozását a PATCH-kérelmeket kibocsátó alkalmazásban, az alkalmazás a .NET JSON PATCH-támogatást használhatja, ahogyan az alábbi útmutató is mutatja.

Telepítse a Microsoft.AspNetCore.JsonPatch NuGet-csomagot, és a csomag API-funkcióival írjon JsonPatchDocument egy PATCH-kéréshez.

Jegyzet

A csomagok .NET-alkalmazásokhoz való hozzáadásáról a Csomagok telepítése és kezeléseCsomaghasználati munkafolyamat (NuGet-dokumentáció)című cikkben talál útmutatást. Ellenőrizze a megfelelő csomagverziókat a NuGet.org.

Adjon hozzá @using irányelveket a System.Text.Json, System.Text.Json.Serializationés Microsoft.AspNetCore.JsonPatch névterekhez a Razor összetevő tetejére:

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

Készítse el a JsonPatchDocument-t egy TodoItem számára, ahol a(z) IsComplete értéke true, a(z) Replace módszerrel:

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

Adja át a dokumentum műveleteit (patchDocument.Operations) a PatchAsJsonAsync hívásnak:

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

JsonSerializerOptions.DefaultIgnoreCondition úgy van beállítva, hogy JsonIgnoreCondition.WhenWritingDefault figyelmen kívül hagyjon egy tulajdonságot, ha az megegyezik a típus alapértelmezett értékével.

Állítsa be a JsonSerializerOptions.WriteIndented-et a true-re, ha a JSON hasznos adatait kellemes megjelenítési formátumban szeretné mutatni. A behúzott JSON írása nem befolyásolja a PATCH-kérések feldolgozását, és általában nem történik meg éles alkalmazásokban webes API-kérésekhez.

A ASP.NET Core webes API cikkben található JsonPatch útmutatóját követve vegyen fel PATCH vezérlőműveletet a webes API-ba. A PATCH-kérelmek feldolgozása Minimális API- is megvalósítható az alábbi lépésekkel.

Adjon hozzá egy csomaghivatkozást a Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet-csomaghoz a web API-alkalmazáshoz.

Jegyzet

Nem szükséges csomaghivatkozást hozzáadnia az alkalmazáshoz a Microsoft.AspNetCore.JsonPatch csomaghoz, mert a Microsoft.AspNetCore.Mvc.NewtonsoftJson csomagra való hivatkozás automatikusan transitív módon hozzáad egy csomaghivatkozást a Microsoft.AspNetCore.JsonPatchcsomaghoz.

A Program fájlban adjon hozzá egy @using irányelvet a Microsoft.AspNetCore.JsonPatch névtérhez:

using Microsoft.AspNetCore.JsonPatch;

Adja meg a végpontot a webes API kérésfeldolgozási folyamatának:

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.NoContent();
});

Figyelmeztetés

A ASP.NET Core webes API cikkben szereplő JsonPatch-példához hasonlóan az előző PATCH API nem védi meg a webes API-t a túlzott közzétételi támadásoktól. További információ: oktatóanyag: Vezérlőalapú webes API létrehozása ASP.NET Core.

A patch teljes körű működéséhez tekintse meg a BlazorWebAppCallWebApimintaalkalmazás.

DELETE (DeleteAsync) és további bővítőmódszerek

System.Net.Http további bővítménymetelyeket is tartalmaz a HTTP-kérések küldéséhez és a HTTP-válaszok fogadásához. HttpClient.DeleteAsync HTTP DELETE-kérés webes API-nak való elküldésére szolgál.

Az alábbi összetevőkódban a <button> elem meghívja a DeleteItem metódust. A kötött <input> elem adja meg a törlendő elem id értékét.

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

Elnevezett HttpClientIHttpClientFactory

A IHttpClientFactory szolgáltatások és a megnevezett HttpClient konfiguráció támogatott.

Jegyzet

Az IHttpClientFactory-ből való névvel ellátott HttpClient használat helyett egy típusos HttpClient használata lehet alternatíva. További információ a Tipizált HttpClient szakaszban található.

Adja hozzá a Microsoft.Extensions.Http NuGet-csomagot az alkalmazáshoz.

Jegyzet

A csomagok .NET-alkalmazásokhoz való hozzáadásáról a Csomagok telepítése és kezeléseCsomaghasználati munkafolyamat (NuGet-dokumentáció)című cikkben talál útmutatást. Ellenőrizze a megfelelő csomagverziókat a NuGet.org.

Egy ügyfélprojekt Program fájljában:

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

Ha a névvel ellátott ügyfelet egy Blazor Web Appelőrerendezett ügyféloldali összetevői használják, az előző szolgáltatásregisztrációnak a kiszolgálóprojektben és a .Client projektben is meg kell jelennie. A kiszolgálón a builder.HostEnvironment.BaseAddress a webes API alapcíme váltja fel, amelyet az alábbiakban ismertetünk.

Az előző kliensoldali példa az alapcímet builder.HostEnvironment.BaseAddress (IWebAssemblyHostEnvironment.BaseAddress) értékre állítja, amely meghatározza a kliensoldali alkalmazás alapcímét, és amely általában a hoszt oldal <base> címkéjének href értékéből származik.

Az ügyfél saját alapcímének használatára a leggyakoribb használati esetek a következők:

  • Egy olyan .Client kliensprojekt (Blazor Web App), amely webes API-hívásokat indít a WebAssembly/Auto komponensekből vagy a WebAssembly-ben ügyfélen futó kódból a kiszolgáló alkalmazás API-jaihoz ugyanazon a gazda címén.
  • Egy üzemeltetett Client alkalmazás ügyfélprojektje (Blazor WebAssembly), amely webes API-hívásokat indít a kiszolgálóprojekthez (Server).

Az ügyfél saját alapcímének használatára leggyakrabban egy üzemeltetett Client-alkalmazás ügyfélprojektjében (Blazor WebAssembly) kerül sor, amely webes API-hívásokat indít a kiszolgálóprojektbe (Server).

Ha külső webes API-t hív meg (nem ugyanabban az URL-címen, mint az ügyfélalkalmazás), vagy egy kiszolgálóoldali alkalmazásban konfigurálja a szolgáltatásokat (például az ügyféloldali összetevők előrendelésével foglalkozik a kiszolgálón), állítsa be az URI-t a webes API alapcímére. Az alábbi példa a webes API alapcímét https://localhost:5001értékre állítja, ahol egy külön web API-alkalmazás fut, és készen áll az ügyfélalkalmazás kéréseire való válaszadásra:

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

Az alábbi összetevőkódban:

  • A IHttpClientFactory példánya létrehoz egy elnevezett HttpClient.
  • A HttpClient nevű elemet használják arra, hogy GET kérést küldjön JSON formátumú időjárás-előrejelzés adatokért a web API-tól a /forecast webcímén.
@inject IHttpClientFactory ClientFactory

...

@code {
    private Forecast[]? forecasts;

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

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

A BlazorWebAppCallWebApimintaalkalmazás bemutatja, hogyan lehet egy webes API-t meghívni az CallTodoWebApiCsrNamedClient összetevőben található elnevezett HttpClient segítségével. Egy ügyfélalkalmazásban a Microsoft Graph egy nevesített HttpClient hívásán alapuló további működési bemutatóért lásd: Graph API használata ASP.NET Core Blazor WebAssembly.

Egy ügyfélalkalmazásban a Microsoft Graph névvel ellátott HttpClientmeghívásán alapuló működőképes bemutatóért lásd a Graph API használata ASP.NET Core Blazor WebAssemblycímű témakört.

Gépelt HttpClient

A beírt HttpClient az alkalmazás egy vagy több alapértelmezett vagy elnevezett HttpClient példányát használja egy vagy több webes API-végpont adatainak visszaadásához.

Jegyzet

A gépelt HttpClient helyett használható egy HttpClient-ből származó nevesített IHttpClientFactory. További információért lásd a HttpClientIHttpClientFactory nevű szakaszt.

Adja hozzá a Microsoft.Extensions.Http NuGet-csomagot az alkalmazáshoz.

Jegyzet

A csomagok .NET-alkalmazásokhoz való hozzáadásáról a Csomagok telepítése és kezeléseCsomaghasználati munkafolyamat (NuGet-dokumentáció)című cikkben talál útmutatást. Ellenőrizze a megfelelő csomagverziókat a NuGet.org.

Az alábbi példa GET kérést küld a webes API-hoz, hogy JSON formátumú időjárás-előrejelzési adatokat kapjon a /forecast-ból.

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") ?? [];
}

Egy ügyfélprojekt Program fájljában:

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

Ha a beírt ügyfelet egy Blazor Web Appelőre beállított ügyféloldali összetevői használják, az előző szolgáltatásregisztrációnak a kiszolgálóprojektben és a .Client projektben is meg kell jelennie. A kiszolgálón a builder.HostEnvironment.BaseAddress a webes API alapcíme váltja fel, amelyet az alábbiakban ismertetünk.

Az előző példa beállítja az alapcímet builder.HostEnvironment.BaseAddress (IWebAssemblyHostEnvironment.BaseAddress) értékre, amely az ügyféloldali alkalmazás alapcímét lekéri, és általában a gazdahonlap <base> címkéjének href értékéből kerül levezetésre.

Az ügyfél saját alapcímének használatára a leggyakoribb használati esetek a következők:

  • Egy olyan .Client kliensprojekt (Blazor Web App), amely webes API-hívásokat indít a WebAssembly/Auto komponensekből vagy a WebAssembly-ben ügyfélen futó kódból a kiszolgáló alkalmazás API-jaihoz ugyanazon a gazda címén.
  • Egy üzemeltetett Client alkalmazás ügyfélprojektje (Blazor WebAssembly), amely webes API-hívásokat indít a kiszolgálóprojekthez (Server).

Az ügyfél saját alapcímének használatára leggyakrabban egy üzemeltetett Client-alkalmazás ügyfélprojektjében (Blazor WebAssembly) kerül sor, amely webes API-hívásokat indít a kiszolgálóprojektbe (Server).

Ha külső webes API-t hív meg (nem ugyanabban az URL-címen, mint az ügyfélalkalmazás), vagy egy kiszolgálóoldali alkalmazásban konfigurálja a szolgáltatásokat (például az ügyféloldali összetevők előrendelésével foglalkozik a kiszolgálón), állítsa be az URI-t a webes API alapcímére. Az alábbi példa a webes API alapcímét https://localhost:5001értékre állítja, ahol egy külön web API-alkalmazás fut, és készen áll az ügyfélalkalmazás kéréseire való válaszadásra:

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

Az összetevők a típusos HttpClient-t injektálják a webes API meghívásához.

Az alábbi összetevőkódban:

  • Az előző ForecastHttpClient egy példánya van beinjektálva, amely egy típusos HttpClient-et hoz létre.
  • A beírt HttpClient a webes API-ból származó JSON időjárás-előrejelzési adatokra vonatkozó GET-kérés kiállítására szolgál.
@inject ForecastHttpClient Http

...

@code {
    private Forecast[]? forecasts;

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

A BlazorWebAppCallWebApimintaalkalmazás bemutatja, hogyan lehet egy webes API-t használni egy típusos HttpClientCallTodoWebApiCsrTypedClient összetevőben. Vegye figyelembe, hogy az összetevő alkalmazza az ügyféloldali megjelenítést (CSR) (InteractiveWebAssembly renderelési mód) előrendereléssel, így az ügyfélszolgáltatás regisztrációja mind a kiszolgálóprojekt, mind a Program projekt .Client fájljában megjelenik.

Az ebben a szakaszban található útmutatás olyan ügyféloldali forgatókönyvekre vonatkozik, amelyek hitelesítési cookiealapulnak.

Az cookie-alapú hitelesítés esetében, amelyet biztonságosabbnak tartanak, mint a bearer token hitelesítést, a cookie hitelesítő adatok minden webes API-kéréshez elküldhetők a AddHttpMessageHandler hívásával egy előre konfigurált DelegatingHandler-en a HttpClient használatával. A kezelő a SetBrowserRequestCredentials-t konfigurálja a BrowserRequestCredentials.Include-el, amely azt javasolja a böngészőnek, hogy minden kéréshez küldjön hitelesítő adatokat, például cookie-kat vagy HTTP-hitelesítési fejléceket, beleértve a kereszt-domain kéréseket is.

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

A CookieHandler regisztrálva van a Program fájlban:

builder.Services.AddTransient<CookieHandler>();

Az üzenetkezelő hozzáadódik minden olyan előre konfigurált HttpClient-hoz, amely(ek) cookie hitelesítést igényel(nek).

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

Lásd az ASP.NET Core biztonságának Identity segítségével.

Amikor egy HttpRequestMessage-t készít, közvetlenül állítsa be a böngésző kérésének hitelesítő adatait és fejlécét:

var requestMessage = new HttpRequestMessage() { ... };

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

HttpClient és HttpRequestMessage a Fetch API kéréshez tartozó opciókkal

Az ebben a szakaszban szereplő útmutatás a tulajdonosi jogkivonat-hitelesítésre támaszkodó ügyféloldali forgatókönyvekre vonatkozik.

HttpClient (API dokumentációja) és HttpRequestMessage használhatók a kérések testreszabásához. Megadhatja például a HTTP-metódust és a kérelemfejléceket. Az alábbi összetevő egy POST kérést küld egy webes API-végpontra, és megjeleníti a válasz törzsét.

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()
    {
        var requestMessage = 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))
        {
            requestMessage.Headers.Authorization =
                new AuthenticationHeaderValue("Bearer", token.Value);

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

            var response = await Http.SendAsync(requestMessage);
            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 HttpClient ügyféloldali implementációja a Fetch API használatára épül, és a bővítménymódszerekkel és a HttpRequestMessage segítségével konfigurálja a mögöttes WebAssemblyHttpRequestMessageExtensions. Adjon meg további beállításokat az általános SetBrowserRequestOption bővítménymetódus használatával. Blazor és az alapul szolgáló Fetch API nem ad hozzá vagy módosít közvetlenül kérésfejléceket. A felhasználói ügynökök, például a böngészők és a fejlécek használatáról a külső felhasználói ügynök dokumentációs készletei és egyéb webes erőforrások segítségével tájékozódhat.

A HTTP-válasz általában pufferelt, így lehetővé válik a szinkron olvasás támogatása a választartalomon. A válaszstreamelés támogatásának engedélyezéséhez használja a kérelem SetBrowserResponseStreamingEnabled bővítménymetódusát.

Ha hitelesítő adatokat szeretne szerepeltetni egy forrásközi kérelemben, használja a SetBrowserRequestCredentials bővítménymetódust:

requestMessage.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);

További információ a Fetch API beállításairól: MDN webes dokumentáció: WindowOrWorkerGlobalScope.fetch(): Paraméterek.

Hibák kezelése

A webes API válaszhibáinak kezelése a fejlesztői kódban, amikor azok előfordulnak. Például a GetFromJsonAsync egy JSON-választ vár a Content-Typeapplication/json-től a webes API-n keresztül. Ha a válasz nem JSON formátumban van, a tartalomérvényesítés NotSupportedExceptioneredményez.

Az alábbi példában az időjárás-előrejelzési adatkérelem URI-végpontja hibás. Az URI-nak WeatherForecast kell lennie, de WeatherForcastnéven jelenik meg a hívásban, és hiányzik belőle a eForecast betűje.

A GetFromJsonAsync hívásnál JSON visszaadása várható, de egy nem kezelt kivétel esetén a webes API HTML-t ad vissza Content-Typetext/html értékkel. A kezeletlen kivétel azért fordul elő, mert a /WeatherForcast elérési útja nem található, és a köztes szoftver nem tudja kiszolgálni a kérés lapját vagy nézetét.

Az OnInitializedAsync ügyfélnél NotSupportedException akkor generálódik, amikor a válasz tartalmát érvénytelenként azonosítják, mivel nem JSON. A kivétel a catch blokkban jelenik meg, ahol az egyéni logika naplózhatja a hibát, vagy egy rövid hibaüzenetet jeleníthet meg a felhasználónak.

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

Jegyzet

Az előző példa szemléltetési célokra szolgál. A webes API-k úgy konfigurálhatók, hogy akkor is visszaadják a JSON-t, ha egy végpont nem létezik, vagy nem kezelt kivétel történik a kiszolgálón.

További információ: ASP.NET Core Blazor-alkalmazások hibáinak kezelése.

Forrásközi erőforrás-megosztás (CORS)

A böngésző biztonsága gyakran korlátozza, hogy egy weblap kéréseket küldjön a weblapot kézbesítőtől eltérő forrásra. Ezt a korlátozást azonos eredetű szabálynaknevezzük. Az azonos eredetű házirend korlátozza (de nem akadályozza meg) a rosszindulatú webhelyet abban, hogy bizalmas adatokat olvasson egy másik webhelyről. Ha a böngészőből egy másik forrású végpontra szeretne kéréseket küldeni, a végpontnak engedélyeznie kell forrásközi erőforrásmegosztást (CORS).

További információ a szerveroldali CORS-ról: lásd Kereszt-eredetű kérelmek engedélyezése (CORS) az ASP.NET Core-ban. A cikk példái nem közvetlenül Razor összetevő-forgatókönyvekre vonatkoznak, de a cikk hasznos az általános CORS-fogalmak megismeréséhez.

Az ügyféloldali CORS-kérelmekkel kapcsolatos információkért lásd ASP.NET Core Blazor WebAssembly további biztonsági forgatókönyveket.

Hamisítás elleni támogatás

Ha antiforgery-támogatást szeretne hozzáadni egy HTTP-kéréshez, szúrja be a AntiforgeryStateProvider-t, és adjon hozzá egy RequestToken-et a fejlécgyűjteményhez, mint RequestVerificationToken.

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

További információ: ASP.NET Core Blazor hitelesítési és engedélyezési.

Blazor keretrendszerösszetevő-példák a webes API-hozzáférés teszteléséhez

Különböző hálózati eszközök érhetők el nyilvánosan a webes API háttéralkalmazások közvetlen teszteléséhez, például Firefox Browser Developer. Blazor keretrendszer referenciaforrása HttpClient teszteléshez hasznos teszteszközöket tartalmaz:

HttpClientTest elemek a dotnet/aspnetcore GitHub-adattárban

Jegyzet

A .NET referenciaforrásra mutató dokumentációs hivatkozások általában betöltik az adattár alapértelmezett ágát, amely a .NET következő kiadásának aktuális fejlesztését jelöli. Egy adott kiadás címkéjének kiválasztásához használja az Ágak vagy címkék közötti váltás legördülő listát. További információ: A ASP.NET Core-forráskód (dotnet/AspNetCore.Docs #26205) verziócímkéjének kiválasztása.

További erőforrások

Általános

A túladatküldési támadások enyhítése

A webes API-k sebezhetők lehetnek egy túlpostázó támadással szemben, más néven tömeges hozzárendelési támadással szemben. A túlpostolásos támadás akkor fordul elő, ha egy rosszindulatú felhasználó egy POST HTML-űrlapot ad ki a kiszolgálónak, amely olyan tulajdonságok adatait dolgozza fel, amelyek nem részei a renderelt űrlapnak, és hogy a fejlesztő nem kívánja engedélyezni a felhasználók számára a módosítást. A "túlposztolás" kifejezés szó szerint azt jelenti, hogy a rosszindulatú felhasználó túl-POSTolt az űrlappal.

A túlpostolásos támadások mérséklésével kapcsolatos útmutatásért tekintse meg az Oktatóanyag: Vezérlőalapú webes API létrehozása az ASP.NET Core-n.

Kiszolgálóoldali

Ügyféloldali