Webes API meghívása ASP.NET Core Blazor
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 aBlazorWebAppOidcBff
(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
BlazorWebAppCallWebApi
mintaalkalmazásbanHa 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_Weather
mintaalkalmazá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:
-
content
a fájl HttpContent-je. -
/Filesave
az webes API-végpont. -
Http
az HttpClient.
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:
-
Nevezzük el
HttpClient
-nek a(z)IHttpClientFactory
-at: Minden webes API egyedi nevet kap. Amikor egy alkalmazáskód vagy egy Razor összetevő meghív egy webes API-t, egy elnevezett HttpClient-példányt használ a hívás indításához. -
Tipizált
HttpClient
: Minden web-API típusosan van definiálva. Amikor egy alkalmazáskód vagy egy Razor összetevő webes API-t hív meg, egy beírt HttpClient-példányt használ a hívás indításához.
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 editItem
Name
é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.JsonPatch
csomaghoz.
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 BlazorWebAppCallWebApi
mintaalkalmazá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 HttpClient
IHttpClientFactory
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 BlazorWebAppCallWebApi
mintaalkalmazá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 HttpClient
IHttpClientFactory
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 BlazorWebAppCallWebApi
mintaalkalmazá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.
Cookie-alapú kérés hitelesítési adatok
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-Type
application/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 WeatherForcast
néven jelenik meg a hívásban, és hiányzik belőle a e
Forecast
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-Type
text/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 ℃
@forecast.TemperatureF ℉
</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
- Kereszt-eredetű Erőforrás-megosztás (CORS) a W3C-nél
- Határokon átnyúló kérelmek (CORS) engedélyezése a ASP.NET Core: Bár a tartalom ASP.NET Core-alkalmazásokra vonatkozik, nem Razor összetevőkre, a cikk az általános CORS-fogalmakat ismerteti.
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
- ASP.NET Alapvető kiszolgálóoldali és Blazor Web App további biztonsági forgatókönyvek: Kiterjed a HttpClient biztonságos webes API-kérések készítésére való használatára.
- HTTP-kérések létrehozása az IHttpClientFactory használatával a ASP.NET Core
- HTTPS érvényesítése az ASP.NET Core-ban
- Kestrel HTTPS-végpont konfiguráció
Ügyféloldali
- ASP.NET Alapvető Blazor WebAssembly további biztonsági forgatókönyvek: A HttpClient biztonságos webes API-kérések készítésére vonatkozó lefedettséget tartalmazza.
- Graph API használata ASP.NET Core Blazor WebAssembly
- API lekérése