Programiranje

Kako zapisati metapodatke zahtev in odzivov v spletni API ASP.NET

Tako kot preverjanje pristnosti, predpomnjenje in upravljanje izjem je tudi zapisovanje dnevnika navzkrižna skrb - funkcija, ki vpliva na celotno aplikacijo - in bi jo bilo treba centralizirati. Pogosto beležimo podatke o aplikacijah, ki lahko vključujejo zaporedje klicev ali dogodkov metode, uporabniška dejanja ali celo napake, ki se lahko pojavijo med izvajanjem aplikacije. Obstaja veliko okvirov za beleženje, ki bi jih lahko izkoristili, vendar se bomo v tem članku osredotočili na to, kako lahko beležimo zahteve in odgovore v spletnem API-ju ASP.NET.

Beleženje zahtev in odgovorov v spletnem API-ju je koristno pri odpravljanju napak, sledenju in pregledu dohodnih in odhodnih klicev storitev. Z beleženjem vseh zahtev in odgovorov na enem mestu je odkrivanje težav v vseh zahtevah in odgovorih enostavno. V tem prispevku bomo ustvarili prilagojen upravljalnik sporočil za spremljanje in beleženje zahtev in odzivov v spletnem API-ju. Upravitelj sporočil bo uporabljen za prestrezanje klicev in centralno beleženje vseh zahtev in odzivov na enem mestu.

Strategije vbrizgavanja navzkrižnih pomislekov v spletni API

V spletnem API-ju obstaja več načinov za vbrizgavanje beleženja dnevnika in drugih prekrižalnih težav. Eden od načinov je ustvariti razred ApiController po meri ali osnovni razred za vse naše krmilnike in nato preglasiti metodo ExecuteAsync. Drug način je uporaba filtra dejanj po meri. Vendar imata obe strategiji svoje omejitve. V prejšnjem primeru bi morali zagotoviti, da vsi naši krmilniki razširijo osnovni razred krmilnika po meri. Pri slednjem bi morali zagotoviti, da se filter uporablja na vseh krmilnikih, ki jih uporabljamo.

Po mojem mnenju je najboljša strategija uporaba obdelovalca sporočil, ker ga napišete samo enkrat in nato registrirate na enem mestu. Tudi zato, ker bo obdelovalec sporočil po meri poklican veliko prej, torej še pred HttpControllerDispatcher, je zelo primeren za vbrizgavanje navzkrižnih razlogov. Mimogrede, obdelovalci sporočil so razredi, ki podedujejo abstraktni razred HttpMessageHandler. Zato bomo izkoristili orodje za obdelavo sporočil, da bomo v to objavo vbrizgali naš zapisovalnik po meri.

Če želite zgraditi in zagnati izvorno kodo, prikazano v tem prispevku, morate imeti v sistemu nameščen in zagnan Visual Studio. Prav tako morate imeti nameščen NLog. Če želite vedeti, kako namestiti, konfigurirati in uporabljati NLog, si oglejte moj članek o NLogu tukaj.

Izdelava našega dnevnika strank za spletni API

Ustvarite nov projekt spletnega API-ja v Visual Studio in ga shranite z želenim imenom. Za prestrezanje klicev spletnega API-ja bomo tukaj izkoristili rokovalnik za prenašanje po meri. Najprej zgradimo razred POCO po meri, v katerem bodo shranjeni vsi podatki iz naših zahtev in odgovorov.

javni razred LogMetadata

    {

javni niz RequestContentType {get; set; }

javni niz RequestUri {get; set; }

javni niz RequestMethod {get; set; }

javni DateTime? RequestTimestamp {get; set; }

javni niz ResponseContentType {get; set; }

javni HttpStatusCode ResponseStatusCode {get; set; }

javni DateTime? ResponseTimestamp {get; set; }

    }

Zdaj bomo uvedli razred po meri, imenovan LogHandler. To je v bistvu obdelovalec sporočil, ki razširja razred DelegatingHandler.

javni razred CustomLogHandler: DelegatingHandler

    {

zaščitena razveljavitev asinh. opravila SendAsync (zahteva HttpRequestMessage, CancellationToken cancellationToken)

        {

return base.SendAsync (zahteva, odpovedToken);

        }

    }

Naslednji delček kode prikazuje, kako lahko sestavite metapodatke zahtev. Ta metoda bo poklicana iz metode SendAsync našega obdelave sporočil po meri in bo vrnila primerek razreda LogMetadata.

zasebni LogMetadata BuildRequestMetadata (zahteva HttpRequestMessage)

    {

LogMetadata log = novi LogMetadata

        {

RequestMethod = request.Method.Method,

RequestTimestamp = DateTime.Zdaj,

RequestUri = request.RequestUri.ToString ()

        };

dnevnik vrnitve;

    }

Naslednja stvar, ki jo moramo storiti, je posodobitev primerka metapodatkov dnevnika z informacijami iz odzivnega predmeta. Evo, kako je to mogoče doseči.

zasebni LogMetadata BuildResponseMetadata (LogMetadata logMetadata, HttpResponseMessage odgovor)

    {

logMetadata.ResponseStatusCode = response.StatusCode;

logMetadata.ResponseTimestamp = Datum, čas, zdaj;

logMetadata.ResponseContentType = response.Content.Headers.ContentType.MediaType;

vrnitev logMetadata;

    }

Tu je celotna izvorna koda upravljavca sporočil po meri za vašo referenco.

javni razred CustomLogHandler: DelegatingHandler

    {

zaščitena razveljavitev asinh. opravila SendAsync (zahteva HttpRequestMessage, CancellationToken cancellationToken)

        {

var logMetadata = BuildRequestMetadata (zahteva);

var response = await base.SendAsync (request, cancellationToken);

logMetadata = BuildResponseMetadata (logMetadata, odgovor);

počakajte SendToLog (logMetadata);

povratni odgovor;

        }

zasebni LogMetadata BuildRequestMetadata (zahteva HttpRequestMessage)

        {

LogMetadata log = novi LogMetadata

            {

RequestMethod = request.Method.Method,

RequestTimestamp = DateTime.Zdaj,

RequestUri = request.RequestUri.ToString ()

            };

dnevnik vrnitve;

        }

zasebni LogMetadata BuildResponseMetadata (LogMetadata logMetadata, HttpResponseMessage odgovor)

        {

logMetadata.ResponseStatusCode = response.StatusCode;

logMetadata.ResponseTimestamp = Datum, čas, zdaj;

logMetadata.ResponseContentType = response.Content.Headers.ContentType.MediaType;

vrnitev logMetadata;

        }

zasebno asinh. opravilo SendToLog (LogMetadata logMetadata)

        {

// TODO: Tukaj napišite kodo za shranjevanje primerka logMetadata v vnaprej konfigurirano shrambo dnevnika ...

vrni res;

        }

    }

Upoštevajte, da morate napisati potrebno kodo za shranjevanje primerka logMetadata, prikazanega v metodi SendToLog, v vnaprej konfiguriran cilj dnevnika, to je datoteko ali bazo podatkov. Za beleženje teh metapodatkov raje uporabljam NLog. Še enkrat se lahko obrnete na moj članek o NLogu, da vidite, kako je to mogoče storiti.

Registracija upravljavca sporočil

Če želite registrirati obdelavo sporočil po meri, lahko izkoristite dogodek Application_Start v datoteki Global.asax.cs ali metodo Registriraj razreda WebApiConfig. Naslednji delček kode ponazarja, kako lahko registrirate upravljavca z uporabo metode Register razreda WebApiConfig.

javni statični void Register (HttpConfiguration config)

    {

// Tukaj napiši svojo običajno kodo ...

config.MessageHandlers.Add (novo CustomLogHandler ());

    }

V tem članku smo preučili, kako lahko zapisujemo zahteve in odgovore v spletnem API-ju s pomočjo obdelave sporočil po meri. Obdelovalci sporočil so odličen način za vbrizgavanje navzkrižnih vprašanj v cevovod spletnega API-ja. Čeprav imamo druge načine za vbrizgavanje prijave v spletni API, na primer razred ApiController po meri ali filter dejanj po meri, je uporaba obdelovalca sporočil po meri preprostejši pristop. To implementacijo lahko prilagodite glede na vaše zahteve, na primer, da dodate več metapodatkov po meri.

Kako narediti več v ASP.NET in ASP.NET Core:

  • Kako uporabljati predpomnjenje v pomnilniku v ASP.NET Core
  • Kako ravnati z napakami v spletnem API-ju ASP.NET
  • Kako prenesti več parametrov v metode krmilnika spletnega API-ja
  • Kako zapisati metapodatke zahtev in odzivov v spletni API ASP.NET
  • Kako delati s HttpModules v ASP.NET
  • Napredno spreminjanje različic v ASP.NET Core Web API
  • Kako uporabiti vbrizgavanje odvisnosti v ASP.NET Core
  • Kako delati s sejami v ASP.NET
  • Kako delati z HTTPHandlers v ASP.NET
  • Kako uporabljati IHostedService v ASP.NET Core
  • Kako porabiti storitev WCF SOAP v ASP.NET Core
  • Kako izboljšati delovanje aplikacij ASP.NET Core
  • Kako porabiti spletni API ASP.NET Core s pomočjo RestSharp
  • Kako delati s prijavo v ASP.NET Core
  • Kako uporabljati MediatR v ASP.NET Core
  • Kako delati s stanjem seje v ASP.NET Core
  • Kako uporabljati Nancy v ASP.NET Core
  • Razumevanje vezave parametrov v spletnem API-ju ASP.NET
  • Kako naložiti datoteke v ASP.NET Core MVC
  • Kako implementirati globalno obravnavo izjem v ASP.NET Core Web API
  • Kako izvajati zdravstvene preglede v ASP.NET Core
  • Najboljše prakse predpomnjenja v ASP.NET
  • Kako uporabljati sporočila Apache Kafka v .NET
  • Kako omogočiti CORS v spletnem API-ju
  • Kdaj uporabiti WebClient v primerjavi s HttpClient v primerjavi s HttpWebRequest
  • Kako delati s predpomnilnikom Redis v .NET
  • Kdaj uporabiti Task.WaitAll v primerjavi z Task.WhenAll v .NET
$config[zx-auto] not found$config[zx-overlay] not found