Programavimas

Kaip registruoti užklausos ir atsakymo metaduomenis ASP.NET žiniatinklio API

Kaip ir autentifikavimas, talpinimas ir išimčių valdymas, registravimas yra kompleksinis rūpestis - funkcija, veikianti visą programą - ir turėtų būti centralizuota. Dažnai registruojame programos duomenis, kurie gali apimti metodo iškvietimų ar įvykių seką, vartotojo veiksmus ar net klaidas, kurios gali atsirasti, kai programa vykdoma. Yra daugybė registravimo sistemų, kuriomis galėtumėte pasinaudoti, tačiau šiame straipsnyje mes sutelksime dėmesį į tai, kaip galime užregistruoti užklausas ir atsakymus ASP.NET žiniatinklio API.

Užklausų ir atsakymų registravimas žiniatinklio API naudingas derinant, sekant ir tikrinant gaunamus ir siunčiamus tarnybos skambučius. Registruojant visas užklausas ir atsakymus vienoje vietoje, lengva nustatyti bet kokių užklausų ir atsakymų problemas. Šiame įraše sukursime pasirinktinį pranešimų tvarkytuvą, kad galėtume stebėti ir registruoti užklausas ir atsakymus žiniatinklio API. Pranešimų tvarkytuvas bus naudojamas skambučiams perimti ir centralizuotai registruoti visas užklausas ir atsakymus vienoje vietoje.

Strategijos, kaip įterpti visuotinius rūpesčius į žiniatinklio API

Yra keli būdai, kaip įjungti žiniatinklio registravimą ir kitas kompleksines problemas žiniatinklio API. Vienas iš būdų yra sukurti pasirinktinę „ApiController“ klasę arba bazinę klasę visiems mūsų valdikliams ir tada nepaisyti „ExecuteAsync“ metodo. Kitas būdas yra naudoti pasirinktinį veiksmų filtrą. Tačiau abi šios strategijos turi savo trūkumų. Pirmuoju atveju turėtume užtikrinti, kad visi mūsų valdikliai išplėstų pasirinktinio pagrindinio valdiklio klasę. Pastaruoju atveju turėtume užtikrinti, kad filtras būtų pritaikytas visiems mūsų naudojamiems valdikliams.

Mano nuomone, geriausia strategija yra naudoti pranešimų tvarkytuvą, nes ją parašote tik vieną kartą, o tada užregistruojate vienoje vietoje. Be to, kadangi pasirinktinių pranešimų tvarkytuvas bus iškviestas daug anksčiau, t. Y. Dar prieš „HttpControllerDispatcher“, jis puikiai tinka įpareigoti kompleksinius klausimus. Beje, pranešimų tvarkytojai yra klasės, paveldinčios abstrakčią „HttpMessageHandler“ klasę. Taigi, pasinaudosime pranešimų tvarkytuvu, kad šiame įraše suleistume savo pasirinktinį žurnalą.

Jei norite sukurti ir vykdyti šiame įraše pavaizduotą šaltinio kodą, sistemoje turėtumėte turėti ir paleisti „Visual Studio“. Be to, turėtumėte įdiegti „NLog“. Jei norite sužinoti, kaip įdiegti, konfigūruoti ir naudoti „NLog“, pažiūrėkite į mano straipsnį apie „NLog“ čia.

Kuriame mūsų klientų registravimo priemonę žiniatinklio API

„Visual Studio“ sukurkite naują žiniatinklio API projektą ir išsaugokite jį norimu pavadinimu. Čia pasinaudosime pasirinktiniu deleguojančiu tvarkytuvu, kad perimtume skambučius į žiniatinklio API. Pirmiausia sukursime pasirinktinę POCO klasę, kurioje bus saugoma visa informacija iš mūsų užklausų ir atsakymų.

viešosios klasės „LogMetadata“

    {

viešoji eilutė RequestContentType {get; rinkinys; }

viešoji eilutė RequestUri {get; rinkinys; }

viešoji eilutė „RequestMethod“ {get; rinkinys; }

public DateTime? RequestTimestamp {get; rinkinys; }

viešoji eilutė „ResponseContentType“ {get; rinkinys; }

public HttpStatusCode ResponseStatusCode {get; rinkinys; }

public DateTime? ResponseTimestamp {get; rinkinys; }

    }

Dabar mes įdiegsime pasirinktinę klasę pavadinimu „LogHandler“. Iš esmės tai yra pranešimų tvarkytuvas, pratęsiantis „DelegatingHandler“ klasę.

viešoji klasė „CustomLogHandler“: „DelegatingHandler“

    {

apsaugotas nepaisyti asinchroninio uždavinio „SendAsync“ („HttpRequestMessage“ užklausa, „CancellationToken“ cancellationToken)

        {

grąžinimo bazė.SendAsync (užklausa, cancellationToken);

        }

    }

Šis kodo fragmentas parodo, kaip galite sukurti užklausos metaduomenis. Šis metodas bus iškviestas iš mūsų pasirinktinių pranešimų tvarkytuvo „SendAsync“ metodo ir grąžins „LogMetadata“ klasės egzempliorių.

privatus „LogMetadata BuildRequestMetadata“ („HttpRequestMessage“ užklausa)

    {

„LogMetadata log“ = naujas „LogMetadata“

        {

RequestMethod = request.Method.Method,

RequestTimestamp = DateTime.Now,

RequestUri = request.RequestUri.ToString ()

        };

grąžinimo žurnalas;

    }

Kitas dalykas, kurį turime padaryti, yra atnaujinti žurnalo metaduomenų egzempliorių informacija iš atsakymo objekto. Štai kaip tai galima pasiekti.

privatus „LogMetadata BuildResponseMetadata“ („LogMetadata logMetadata“, „HttpResponseMessage“ atsakymas)

    {

logMetadata.ResponseStatusCode = response.StatusCode;

logMetadata.ResponseTimestamp = DateTime.Now;

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

return logMetadata;

    }

Čia pateikiamas visas tinkinto pranešimų tvarkytuvo šaltinis, skirtas jūsų nuorodai.

viešoji klasė „CustomLogHandler“: „DelegatingHandler“

    {

apsaugotas nepaisyti asinchroninio uždavinio „SendAsync“ („HttpRequestMessage“ užklausa, „CancellationToken“ cancellationToken)

        {

var logMetadata = BuildRequestMetadata (užklausa);

var response = laukti bazės.SendAsync (request, cancellationToken);

logMetadata = BuildResponseMetadata (logMetadata, atsakymas);

laukti SendToLog (logMetadata);

grįžimo atsakymas;

        }

privatus „LogMetadata BuildRequestMetadata“ („HttpRequestMessage“ užklausa)

        {

„LogMetadata log“ = naujas „LogMetadata“

            {

RequestMethod = request.Method.Method,

RequestTimestamp = DateTime.Now,

RequestUri = request.RequestUri.ToString ()

            };

grąžinimo žurnalas;

        }

privatus „LogMetadata BuildResponseMetadata“ („LogMetadata logMetadata“, „HttpResponseMessage“ atsakymas)

        {

logMetadata.ResponseStatusCode = response.StatusCode;

logMetadata.ResponseTimestamp = DateTime.Now;

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

return logMetadata;

        }

privatus asinchroninis uždavinys „SendToLog“ („LogMetadata logMetadata“)

        {

// TODO: Parašykite kodą čia, kad išsaugotumėte „logMetadata“ egzempliorių iš anksto sukonfigūruotoje žurnalų saugykloje ...

grįžti tiesa;

        }

    }

Atkreipkite dėmesį, kad turite įrašyti reikiamą kodą, kad išsaugotumėte „LogMetadata“ egzempliorių, parodytą „SendToLog“ metodu, iš anksto sukonfigūruotą žurnalo tikslą, t. Y., Failą ar duomenų bazę. Norėčiau registruoti šiuos metaduomenis naudodamas „NLog“. Vėlgi, galite sužinoti mano straipsnį apie „NLog“, kad sužinotumėte, kaip tai galima padaryti.

Registruojamas pranešimų tvarkytuvas

Norėdami užregistruoti pasirinktinį pranešimų tvarkytuvą, galite pasinaudoti „Application_Start“ įvykiu faile Global.asax.cs arba „WebApiConfig“ klasės registravimo metodu. Šis kodo fragmentas parodo, kaip galite užregistruoti tvarkytuvą naudodami „WebApiConfig“ klasės registravimo metodą.

public static void Register („HttpConfiguration config“)

    {

// Čia parašykite įprastą kodą ...

config.MessageHandlers.Add (naujas „CustomLogHandler“);

    }

Šiame straipsnyje mes ištyrėme, kaip galime užregistruoti užklausas ir atsakymus žiniatinklio API naudodami pasirinktinį pranešimų tvarkytuvą. Pranešimų tvarkytuvai yra puikus būdas įterpti kompleksinius rūpesčius į „Web API“ vamzdyną. Nors turime ir kitų būdų, kaip įjungti prisijungimą prie žiniatinklio API, pvz., Pasirinktinę „ApiController“ klasę arba pasirinktinių veiksmų filtrą, naudoti paprastą pranešimų tvarkytuvą yra paprasčiau. Galite drąsiai pakoreguoti šį diegimą pagal savo reikalavimus, pvz., Norėdami pridėti daugiau tinkintų metaduomenų.

Kaip padaryti daugiau naudojant ASP.NET ir ASP.NET Core:

  • Kaip naudoti atminties talpyklą ASP.NET Core
  • Kaip tvarkyti klaidas ASP.NET žiniatinklio API
  • Kaip perduoti kelis parametrus žiniatinklio API valdiklio metodams
  • Kaip registruoti užklausos ir atsakymo metaduomenis ASP.NET žiniatinklio API
  • Kaip dirbti su „HttpModules“ ASP.NET
  • Išplėstinė ASP.NET „Core Web API“ versijų versija
  • Kaip naudoti priklausomybės injekciją ASP.NET Core
  • Kaip dirbti su sesijomis ASP.NET
  • Kaip dirbti su HTTPHandleriais sistemoje ASP.NET
  • Kaip naudoti „IHostedService“ ASP.NET Core
  • Kaip vartoti WCF SOAP paslaugą ASP.NET Core
  • Kaip pagerinti ASP.NET Core programų veikimą
  • Kaip suvartoti ASP.NET Core Web API naudojant „RestSharp“
  • Kaip dirbti su registravimu ASP.NET Core
  • Kaip naudoti „MediatR“ ASP.NET Core
  • Kaip dirbti su seanso būsena ASP.NET Core
  • Kaip naudoti „Nancy“ ASP.NET Core
  • Supraskite parametrų susiejimą ASP.NET žiniatinklio API
  • Kaip įkelti failus į ASP.NET Core MVC
  • Kaip įdiegti visuotinį išimčių tvarkymą ASP.NET Core Web API
  • Kaip atlikti sveikatos patikrinimus ASP.NET Core
  • Geriausia ASP.NET talpyklos talpinimo praktika
  • Kaip naudoti „Apache Kafka“ pranešimus .NET
  • Kaip įgalinti CORS savo žiniatinklio API
  • Kada naudoti „WebClient“, palyginti su „HttpClient“ ir „HttpWebRequest“
  • Kaip dirbti su „Redis Cache“ .NET
  • Kada .NET naudoti „Task.WaitAll“ ir „Task.WhenAll“