Zahteve: V arhitekturah mikroservisov klici med storitvami pogosto uporabljajo HTTP protokol, običajno z uporabo razreda HttpClient za izvajanje HTTP zahtevkov ali njegovo uporaboRefit.HttpClientFactory、WebApiClientCoreKnjižnice tretjih oseb, ki temeljijo na enkapsulaciji HttpClient.
Za več informacij o uporabi HttpClient si oglejte:Prijava do hiperpovezave je vidna.
Izvorna koda HttpClient:Prijava do hiperpovezave je vidna.
V konstruktorju HttpClient brez parametrov je objekt HttpClientHandler privzeto instanciran, HttpClientHandler pa podeduje in implementira abstraktni razred HttpMessageHandler.Privzeti tok: HttpClient -> HttpClientHandler -> SocketsHttpHandler -> ...
Po analizi izvorne kode je objekt, podedovan od HttpMessageHandlerja, konkretna implementacija HttpClienta, ki pošilja HTTP zahteve. HttpClient boHttpRequestMessagePredmet se prenese in nato prejmeHttpResponseMessageObjekt vrne vsebino.
Poskusite ustvariti nov razred TestHttpHandler, podedovati abstrakcijski razred HttpMessageHandler in implementirati metodo SendAsync, nato pa ga instancirati v konstruktorju HttpClient z naslednjo kodo:
Kot je prikazano spodaj:
Čeprav kliče HttpClient za pošiljanje GET zahteve, specifična implementacija metode SendAsync ne pošlje HTTP zahteve in ni omrežnega toka, zato ni omrežnega tokaLahko odklopite omrežni kabel in program bo deloval normalno。
naPri uporabi objekta HttpClient osnovni socket ni takoj sprosten, kar lahko povzroči težave z izčrpanostjo ležišč. Microsoft se zaveda te težave in priporoča uporabo IHttpClientFactory v projektih ASP.NET Core za ustvarjanje HttpClient objektov.IHttpClientFactory združuje tovarniško ustvarjene primerke HttpMessageHandlerja v bazen, da zmanjša porabo virov. Ko ustvarite novo instanco HttpClient, lahko ponovno uporabite instanco HttpMessageHandler v skupini(če obdobje preživetja ni poteklo).
IHttpClientFactory za .NET:Prijava do hiperpovezave je vidna.
ASP.NET Core ima koncept pipeline middleware programske opreme,Pravzaprav ima HttpClient tudi koncept pipeline middleware s pomočjo Delegating Handlerja, kot je prikazano na spodnji sliki:
S to funkcijo lahko prestrežemo zahteve in odgovore, kot so povečanje avtentikacije žetonov pred zahtevami, beleženje časa, potrebnega za zahteve in odgovore, ter ovijanje podatkov o odgovorih.
Preprosto podeduj razred DelegatingHandler in preglasi metodo SendAsync.
Beleženje HTTP zahtevkov traja nekaj časa, koda pa je naslednja:
Pokličite IHttpClientFactory za ustvarjanje HttpClient in pošiljanje zahteve, kot je prikazano na naslednji sliki:
(Konec)
|